在 SeekbarChangeListener 中检测 Seekbar 的点击或拖动
Detect Tap or Drag of a Seekbar in SeekbarChangeListener
有没有办法确定用户是在 Seekbar 上点击还是拖动?因为这两个操作都会触发 SeekbarChangeListener
中的 onStartTrackingTouch
和 onStopTrackingTouch
事件对我来说重要的是它不是水龙头。
感谢您的帮助!
我自己找到了解决方案...
首先,我记录了 3 个侦听器事件,我注意到当单击时,序列每次都是相同的。顺序是"onStartTrackingTouch","onProgressChanged",最后是"onStopTrackingTouch"。拖动 Seekbar 的不同之处在于 onProgressChanged 被调用了不止一次。所以你得出的结论是,当 onProgressChanged 被调用一次时,就会发生点击。所以一个普通的计数器变量就足以检查发生了什么动作。希望这对某人有帮助:)
这里有两种检测事件的方法
(1) 自定义一个Seekbar获取演示代码在
(2) 根据Ahmet Kazaman方法
- 创建接口
- 检测器实现接口
- 在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;
}
}
有没有办法确定用户是在 Seekbar 上点击还是拖动?因为这两个操作都会触发 SeekbarChangeListener
中的 onStartTrackingTouch
和 onStopTrackingTouch
事件对我来说重要的是它不是水龙头。
感谢您的帮助!
我自己找到了解决方案...
首先,我记录了 3 个侦听器事件,我注意到当单击时,序列每次都是相同的。顺序是"onStartTrackingTouch","onProgressChanged",最后是"onStopTrackingTouch"。拖动 Seekbar 的不同之处在于 onProgressChanged 被调用了不止一次。所以你得出的结论是,当 onProgressChanged 被调用一次时,就会发生点击。所以一个普通的计数器变量就足以检查发生了什么动作。希望这对某人有帮助:)
这里有两种检测事件的方法
(1) 自定义一个Seekbar获取演示代码在
(2) 根据Ahmet Kazaman方法
- 创建接口
- 检测器实现接口
- 在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;
}
}