我正在尝试这样做。当我触摸一个按钮并持续按下它时,它必须执行一个动作,这个动作只有在我停止按下它时才会停止。
为此,我得到了这段代码:
btn_gas.setOnTouchListener(new OnTouchListener() {
private Handler mHandler;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (mHandler != null) return true;
mHandler = new Handler();
mHandler.postDelayed(mAction, 10);
break;
case MotionEvent.ACTION_UP:
if (mHandler == null) return true;
mHandler.removeCallbacks(mAction);
mHandler = null;
break;
}
return false;
}
Runnable mAction = new Runnable() {
@Override
public void run() {
// Do continuous task.
mHandler.postDelayed(this, 100);
}
};
});
但它没有按预期工作,即当我点击按钮时它会连续执行动作,即使没有我连续按下它。为了停止动作,我不得不再次触摸按钮。
如何实现我需要的功能?
答案 0 :(得分:2)
在onTouch中返回false意味着View对后续事件不感兴趣。这意味着你的onTouch只被调用一次,注册一个ACTION_DOWN事件,启动你想做的任何事情,不再被调用。参考:http://developer.android.com/training/gestures/detector.html
小心创建一个为ACTION_DOWN返回false的侦听器 事件。如果这样做,将不会调用侦听器 随后的ACTION_MOVE和ACTION_UP事件串。这是因为 ACTION_DOWN是所有触摸事件的起点。
答案 1 :(得分:1)
您返回true
和false
的逻辑是相反的。如果您想获得未来事件,请返回true
,在这种情况下为ACTION_UP
。事实上,对于一个按钮,你应该安全,总是返回true。此外,您无需继续重新分配Handler
。
private Handler mHandler = new Handler ();
btn_gas.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
mHandler.postDelayed(mAction, 10);
break;
case MotionEvent.ACTION_UP:
mHandler.removeCallbacks(mAction);
break;
}
return true;
}
Runnable mAction = new Runnable() {
@Override
public void run() {
// Do continuous task.
mHandler.postDelayed(this, 100);
}
};
});`