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

Lar*_*erg 7 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Wes*_*ley 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;
        }

    });
Run Code Online (Sandbox Code Playgroud)

因为根据这个文件本指南:

当触发它的向下MotionEvent发生敲击时通知.每次下行都会立即触发.所有其他事件都应在此之前.

无论您是否使用GestureDetector.OnGestureListener,最佳实践都是实现一个返回true的onDown()方法.这是因为所有手势都以onDown()消息开头.如果从onDown()返回false,默认情况下GestureDetector.SimpleOnGestureListener会执行false,系统会假定您要忽略其余的手势,而GestureDetector.OnGestureListener的其他方法永远不会被调用.这可能会在您的应用中导致意外问题.你应该从onDown()返回false的唯一一次是你真的想忽略整个手势.

你需要return trueonDown,这样onScroll就会被触发.