在 SeekbarChangeListener 中检测 Seekbar 的点击或拖动

Detect Tap or Drag of a Seekbar in SeekbarChangeListener

有没有办法确定用户是在 Seekbar 上点击还是拖动?因为这两个操作都会触发 SeekbarChangeListener 中的 onStartTrackingTouchonStopTrackingTouch 事件对我来说重要的是它不是水龙头。

感谢您的帮助!

我自己找到了解决方案...

首先,我记录了 3 个侦听器事件,我注意到当单击时,序列每次都是相同的。顺序是"onStartTrackingTouch","onProgressChanged",最后是"onStopTrackingTouch"。拖动 Seekbar 的不同之处在于 onProgressChanged 被调用了不止一次。所以你得出的结论是,当 onProgressChanged 被调用一次时,就会发生点击。所以一个普通的计数器变量就足以检查发生了什么动作。希望这对某人有帮助:)

这里有两种检测事件的方法

(1) 自定义一个Seekbar获取演示代码在

(2) 根据Ahmet Kazaman方法

  1. 创建接口
  2. 检测器实现接口
  3. 在SeekBar.OnSeekOnSeekBarChangeListener
  4. 中调用检测器方法

mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            mDetector.onProgressChanged(fromUser);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            mDetector.onStartTrackingTouch();
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
           mDetector.onStopTrackingTouch();
           int type = mDetector.getActionType();
           if (type == IOnSeekBarChangeListener.ACTION_TYPE_CLICK) {
               //do click event
           } else if (type == IOnSeekBarChangeListener.ACTION_TYPE_DRAG) {
               //do drag event
           }
           mDetector.reset();
        }
    });

public interface IOnSeekBarChangeListener {


int ACTION_TYPE_DRAG = 0x10;
int ACTION_TYPE_CLICK = 0x20;

void onProgressChanged(boolean fromUser);

void onStartTrackingTouch();

void onStopTrackingTouch();

}

public class Detector implements IOnSeekBarChangeListener {

private static final int DRAG_THRESH_HOLDER = 3;
private boolean mStartTracking = false;
private int mOnChangedTimes = 0;
private int mActionType = 0;

@Override
public void onProgressChanged(boolean fromUser) {
    if (fromUser) {
        mOnChangedTimes++;
    }
}

@Override
public void onStartTrackingTouch() {
   mStartTracking = true;
}

@Override
public void onStopTrackingTouch() {
    if (mStartTracking) {
        if (mOnChangedTimes > DRAG_THRESH_HOLDER) {
            //this is a drag
            mActionType = ACTION_TYPE_DRAG;
        } else {
            //this is a click
            mActionType = ACTION_TYPE_CLICK;
        }
    }
    mStartTracking = false;
}

public int getActionType() {
    return mActionType;
}

public void reset() {
    mActionType = 0;
    mOnChangedTimes = 0;
}

}