在SeekbarChangeListener中检测Tap或Drag of Seekbar

时间:2017-04-29 16:00:06

标签: android seekbar

有没有办法确定用户是在点击还是在Seekbar上拖动?因为这两项操作都会触发onStartTrackingTouch中的onStopTrackingTouchSeekbarChangeListener事件以及我很重要的是它不是一个水龙头。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

首先我记录了3个监听器事件,我注意到当单击发生时,序列每次都是相同的。订单是" onStartTrackingTouch"," onProgressChanged"最后" onStopTrackingTouch"。拖动Seekbar的不同之处在于onProgressChanged不止一次被调用。因此,您得出的结论是,当onProgressChanged被调用一次时会发生一次点击。因此,正常的计数器变量足以检查发生了哪些动作。希望这有助于某人:)

答案 1 :(得分:0)

这是检测事件的两种方法

(1)自定义搜索栏,以在My another Answer

中获得演示代码

(2)根据Ahmet Kazaman方法

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

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;
}

}