在使用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;
}
}
此行为是否已知/已记录/需要?有没有已知的解决方法?
答案 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 document和this guide:
当触发的向下MotionEvent发生敲击时通知 它。每次下行都会立即触发。所有其他 事件应该以此为先。
和
你是否使用GestureDetector.OnGestureListener,它是最好的 练习实现一个返回true的onDown()方法。这是 因为所有手势都以onDown()消息开头。如果你回来了 来自onDown()的false,如GestureDetector.SimpleOnGestureListener所做的那样 默认情况下,系统假定您要忽略其余部分 手势,以及GestureDetector.OnGestureListener的其他方法 永远不会被打电话这有可能导致意外问题 在你的应用程序中你应该从onDown()返回false的唯一时间是if 你真的想忽略整个手势。
您需要return true
中的onDown
,以便触发onScroll
。