自定义视图上的手势检测器

5

我定义了一个类,继承自 GestureDetector.SimpleOnGestureListener 并重写了 onDownonFling 方法。

class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {

    @Override
    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return super.onDown(e);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // TODO Auto-generated method stub

        Toast.makeText(PersianDatePicker.this.getContext(),
                "fling " + velocityX + " - " + velocityY, Toast.LENGTH_LONG)
                .show();

        return super.onFling(e1, e2, velocityX, velocityY);
    }
}

我也定义了一个 GestureDetectorCompat 的实例。

@Override
public boolean onTouchEvent(MotionEvent event) {

    mDetector.onTouchEvent(event);

    return super.onTouchEvent(event);
}

我在一个Activity中测试过,它可以正常工作。但是当我想在自定义视图中使用时,它就无法工作了!并且我没有任何错误提示。


您可以在https://issuetracker.google.com/issues/37136686查看更多信息。 - Prags
工程团队已经修复了这个问题并将相应的文档更新在未来。 - Prags
1个回答

5
在您的自定义视图中,尝试使用以下代码:

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

    return super.onTouchEvent(event);
}

或者更简洁地说:
@Override
public boolean onTouchEvent(MotionEvent event) {
    return mGestureDetector.onTouchEvent(event) || super.onTouchEvent(event);
}

如果我在View.OnTouchListener()onTouch方法中(而不是子类化视图),如何调用super.onTouchEvent(event),因为在这种情况下,super将指向OnTouchListener - Suragch
1
@Suragch - 所以你有一个纯净的 View,用于实现某种触摸响应逻辑?你可以将视图作为注入值传递给触摸监听器,从中可以调用视图的 onTouchEvent,或者你可以放弃所有这些,并完全在监听器中处理触摸逻辑。采用哪种方法取决于你的应用程序的适当性。 - Ted Hopp
是的,那就是我所问的。谢谢。 - Suragch
工程团队已经解决了这个问题,相应的文档将在未来更新。 - Prags

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接