8

在装有 Android 4.0.4 的三星 Galaxy Note 10.1 上,当两根手指放在屏幕上时GestureDetector不会触发(一根手指会触发)。OnGestureListener#onScroll这在其他设备上运行良好。在我的应用程序中,我只想在至少涉及两个手指时启用滚动。

这是重现现象的视图实现:

public class MyView extends View {

    GestureDetector scrollGestureDetector;

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);

        scrollGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX, final float distanceY) {
                System.out.println("SCROLL " + distanceX + ", " + distanceY);
                return true;
            }
        });
    }

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

这种行为是已知的/记录在案的/想要的吗?有已知的解决方法吗?

4

1 回答 1

20

您需要在 中再实现一种方法onDownGestureDetector.SimpleOnGestureListener如下所示:

scrollGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX, final float distanceY) {
            System.out.println("SCROLL " + distanceX + ", " + distanceY);
            return true;
        }

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

    });

因为根据本文档本指南

当触发它的向下 MotionEvent 发生点击时通知。对于每个向下事件,这将立即触发。所有其他事件都应在此之前。

无论您是否使用 GestureDetector.OnGestureListener,最好实现一个返回 true 的 onDown() 方法。这是因为所有手势都以 onDown() 消息开头。如果您从 onDown() 返回 false,正如 GestureDetector.SimpleOnGestureListener 默认所做的那样,系统假定您要忽略手势的其余部分,并且永远不会调用 GestureDetector.OnGestureListener 的其他方法。这有可能在您的应用程序中导致意外问题。您应该从 onDown() 返回 false 的唯一情况是您真的想忽略整个手势。

您需要return truein onDown,以便onScroll触发。

于 2014-08-20T10:24:45.530 回答