有没有办法确定用户是在点击还是在Seekbar上拖动?因为这两项操作都会触发onStartTrackingTouch
中的onStopTrackingTouch
和SeekbarChangeListener
事件以及我很重要的是它不是一个水龙头。
感谢您的帮助!
答案 0 :(得分:1)
我自己找到了一个解决方案......
首先我记录了3个监听器事件,我注意到当单击发生时,序列每次都是相同的。订单是" onStartTrackingTouch"," onProgressChanged"最后" onStopTrackingTouch"。拖动Seekbar的不同之处在于onProgressChanged不止一次被调用。因此,您得出的结论是,当onProgressChanged被调用一次时会发生一次点击。因此,正常的计数器变量足以检查发生了哪些动作。希望这有助于某人:)
答案 1 :(得分:0)
这是检测事件的两种方法
(1)自定义搜索栏,以在My another Answer
中获得演示代码(2)根据Ahmet Kazaman方法
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;
}
}