我正在尝试检测一个简单的Android应用程序上的fling事件,但是第一个MotionEvent
参数总是空的。为什么使用空参数调用onFling方法?Android documentation表示,当发生带有初始on down MotionEvent和匹配up MotionEvent的fling事件时,会调用它。
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// e1 always == null, return early a null reference exception
if (e1 == null) {
return false;
}
if (e1.getY() - e2.getY() > 120) {
handleFlingEvent();
return true;
}
return false;
}
}
main活动具有以下onTouchEvent方法:
GestureDetector flingDetector = new GestureDetector(new MyGestureDetector());
@Override
public boolean onTouchEvent(MotionEvent event) {
if (flingDetector.onTouchEvent(event)) {
return true;
}
return super.onTouchEvent(event);
}
发布于 2011-01-03 16:03:37
我也有类似的问题。当GestureDetector和onFling方法位于自定义视图类中时,就会发生这种情况,视图类是活动UI的一部分。经过一系列测试,我发现只有主活动才能很好地检测滑动手势。因此,我通过在活动中替换它们来解决问题。但是我没有找到这个问题的根本原因。
发布于 2012-03-28 05:48:15
我第一次遇到这个问题是在Android4.0上,因为我的代码在所有以前的版本中都运行得很好。根据这里的建议,我发现了一个简单的解决方法,就是跟踪onDown事件,并在onFling的第一个参数恰好为空的情况下使用它。
public class MySimpleGestureListener extends SimpleOnGestureListener {
protected MotionEvent mLastOnDownEvent = null;
@Override
public boolean onDown(MotionEvent e) {
mLastOnDownEvent = e;
return true;//super.onDown(e);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1==null)
e1 = mLastOnDownEvent;
if (e1==null || e2==null)
return false;
float dX = e2.getX()-e1.getX();
float dY = e2.getY()-e1.getY();
...rest of code
}
...rest of class
}
发布于 2016-02-06 00:30:26
在自定义视图组类中,您需要覆盖两个方法:onInterceptTouchEvent
和onTouchEvent
。在此之后,您需要在这两个方法中调用GestureDetector.onTouchEvent()
。事件ACTION_DOWN
仅传递给onInterceptTouchEvent
。
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if(mDetector.onTouchEvent(event)) {
return true;
}
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(mDetector.onTouchEvent(event)) {
return true;
}
return super.onTouchEvent(event);
}
https://stackoverflow.com/questions/4151385
复制相似问题