首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取空MotionEvent的安卓SimpleOnGestureListener.onFling

获取空MotionEvent的安卓SimpleOnGestureListener.onFling
EN

Stack Overflow用户
提问于 2010-11-11 12:35:15
回答 5查看 15.1K关注 0票数 19

我正在尝试检测一个简单的Android应用程序上的fling事件,但是第一个MotionEvent参数总是空的。为什么使用空参数调用onFling方法?Android documentation表示,当发生带有初始on down MotionEvent和匹配up MotionEvent的fling事件时,会调用它。

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
GestureDetector flingDetector = new GestureDetector(new MyGestureDetector());

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (flingDetector.onTouchEvent(event)) {
        return true;
    }
    return super.onTouchEvent(event);
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-03 16:03:37

我也有类似的问题。当GestureDetector和onFling方法位于自定义视图类中时,就会发生这种情况,视图类是活动UI的一部分。经过一系列测试,我发现只有主活动才能很好地检测滑动手势。因此,我通过在活动中替换它们来解决问题。但是我没有找到这个问题的根本原因。

票数 2
EN

Stack Overflow用户

发布于 2012-03-28 05:48:15

我第一次遇到这个问题是在Android4.0上,因为我的代码在所有以前的版本中都运行得很好。根据这里的建议,我发现了一个简单的解决方法,就是跟踪onDown事件,并在onFling的第一个参数恰好为空的情况下使用它。

代码语言:javascript
复制
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
}
票数 14
EN

Stack Overflow用户

发布于 2016-02-06 00:30:26

在自定义视图组类中,您需要覆盖两个方法:onInterceptTouchEventonTouchEvent。在此之后,您需要在这两个方法中调用GestureDetector.onTouchEvent()。事件ACTION_DOWN仅传递给onInterceptTouchEvent

代码语言:javascript
复制
@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);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4151385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档