Android中如何检测onFling事件?我的代码为何无法触发该事件?
问题原因与解决方案
核心问题
- 手势触发前提未满足:你传给
GestureDetector的SimpleOnGestureListener没重写onDown方法,而该类默认的onDown返回false。GestureDetector要求onDown返回true才会继续跟踪后续触摸事件,所以onFling等手势永远不会被触发,gestureDetector.onTouchEvent(event)也始终返回false,看不到"back from gestureDetector"日志。 - 接口实现未关联:你的
GameView实现了GestureDetector.OnGestureListener,但GestureDetector并没有绑定这个实例,而是用了内部匿名的SimpleOnGestureListener,因此GameView自身的onFling等方法不会被调用。
解决方案
方案一:复用GameView自身的接口实现
修改构造函数里GestureDetector的初始化,直接传入当前GameView实例(它已经实现了OnGestureListener):
public GameView(Context context) { super(context); getHolder().addCallback(this); thread = new MainThread(getHolder(), this); setFocusable(true); // 传入当前实例,复用已实现的OnGestureListener方法 gestureDetector = new GestureDetector(context, this); }
这样GameView自身的onDown(已返回true)、onFling等方法就会被GestureDetector调用,满足手势触发的前提条件。
方案二:在内部SimpleOnGestureListener中重写onDown
如果想保留内部匿名的SimpleOnGestureListener,补充重写onDown并返回true即可:
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { // 必须返回true,让GestureDetector继续处理后续触摸事件 return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.d(DEBUG_TAG,"GestureListener onFling"); // 原有滑动逻辑... return true; } });
额外注意
测试滑动时要满足onFling的触发阈值:滑动速度需足够快(系统有默认阈值),如果滑动过慢会被识别为onScroll而非onFling。
内容的提问来源于stack exchange,提问作者interstar
相关产品推荐
相关产品推荐

