OnGestureListener#onScroll未在Samsung Galaxy Note 10.1上从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; } } 

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

您需要在onDown中再实现一个onDown方法,如下所示:

 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会执行false,系统会假定您要忽略其余的手势,而且GestureDetector.OnGestureListener的其他方法永远不会被调用。 这可能会在您的应用中导致意外问题。 你应该从onDown()返回false的唯一一次是你真的想忽略整个手势。

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