我在自定义视图中检测长按时出现问题。
以下是与此问题相关的代码
final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
public void onLongPress(MotionEvent e) {
Log.e("dbg_msg", "onLongPress");
}
});
public boolean onTouchEvent(MotionEvent event) {
return gestureDetector.onTouchEvent(event);
};
此代码会在长按时检测到每一次(短暂)点击。
当我把这段代码放在从Activity继承的类中时,它可以工作。
那为什么它不能在自定义视图中工作?
答案 0 :(得分:24)
所有这些代码都在您的自定义视图类中:
public static int LONG_PRESS_TIME = 500; // Time in miliseconds
final Handler _handler = new Handler();
Runnable _longPressed = new Runnable() {
public void run() {
Log.i("info","LongPress");
}
};
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
_handler.postDelayed(_longPressed, LONG_PRESS_TIME);
break;
case MotionEvent.ACTION_MOVE:
_handler.removeCallbacks(_longPressed);
break;
case MotionEvent.ACTION_UP:
_handler.removeCallbacks(_longPressed);
break;
}
return true;
}
答案 1 :(得分:4)
我不确定你的GestureDetector
构造函数是否已被弃用(here)。你能尝试其他需要上下文作为第一个参数吗?
抱歉,我是新人,所以我无法发表评论。
- 已编辑 -
您似乎使用了另一个侦听器,此View.OnTouchListener
还有其他onTouch()
方法。你能再试一次吗?
- 已编辑 -
这是一个例子(对我有用):
...
mAnotherView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
});
...
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public void onLongPress(MotionEvent e) {
// do your tasks here
}
});
答案 2 :(得分:4)
您是否在GestureDetector上启用了长按?您可以使用适当的构造函数或通过调用setIsLongpressEnabled来启用它。例如,你可以这样做:
gestureDetector.setIsLongpressEnabled(true);
在你的构造函数中。
答案 3 :(得分:0)
我觉得它更好......
public class Workflow extends View implements View.OnLongClickListener {
public Workflow(Context context, DisplayFeatures d) {
super(context);
setLongClickable(true);
setOnLongClickListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
/* onTouchEvent should return super.onTouchEvent(event);, otherwise long click wouldn't be performed */
return super.onTouchEvent(event);
}
@Override
public boolean onLongClick(View v) {
Log.d("VIEW", "LONG CLICK PERFORMED!");
return false;
}
}