OnGestureListener#onScroll未在Samsung Galaxy Note 10.1上从GestureDetector调用

时间:2013-11-29 13:44:54

标签: android scroll gesturedetector

在使用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;
    }
}

此行为是否已知/已记录/需要?有没有已知的解决方法?

1 个答案:

答案 0 :(得分:18)

您需要在onDown中再实施一个方法GestureDetector.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;
        }

    });

因为根据this documentthis guide

  

当触发的向下MotionEvent发生敲击时通知   它。每次下行都会立即触发。所有其他   事件应该以此为先。

  

你是否使用GestureDetector.OnGestureListener,它是最好的   练习实现一个返回true的onDown()方法。这是   因为所有手势都以onDown()消息开头。如果你回来了   来自onDown()的false,如GestureDetector.SimpleOnGestureListener所做的那样   默认情况下,系统假定您要忽略其余部分   手势,以及GestureDetector.OnGestureListener的其他方法   永远不会被打电话这有可能导致意外问题   在你的应用程序中你应该从onDown()返回false的唯一时间是if   你真的想忽略整个手势。

您需要return true中的onDown,以便触发onScroll