Android 如何在内部视图上接受onSingleTapUp(),而在外部视图上接受onFling()?
我有一个覆盖整个屏幕的视图(比如说Android 如何在内部视图上接受onSingleTapUp(),而在外部视图上接受onFling()?,android,gesture,ontouchlistener,Android,Gesture,Ontouchlistener,我有一个覆盖整个屏幕的视图(比如说ParentView),以及仅覆盖部分屏幕的子内部视图ChildView。 我想让ChildView响应onsingletapp(),而ParentView响应onFling()。我试图通过在ChildView上附加一个SimpleOnGestureListener和在ParentView上附加一个SimpleOnGestureListener来实现 要从ChildView接受onSingleTapUp(),其侦听器的onDown()必须返回true。 但是一旦
ParentView
),以及仅覆盖部分屏幕的子内部视图ChildView
。
我想让ChildView
响应onsingletapp()
,而ParentView
响应onFling()
。我试图通过在ChildView
上附加一个SimpleOnGestureListener
和在ParentView
上附加一个SimpleOnGestureListener
来实现
要从ChildView
接受onSingleTapUp()
,其侦听器的onDown()
必须返回true。
但是一旦我这样做了,绑定到ParentView
的侦听器就不会再听到任何运动事件,因为它是由ChildView
的侦听器执行的。即使ChildView
的onFling()
返回false,事件也不会流到ParentView
的侦听器
ChildView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return singleTapGestureDetector.onTouchEvent(motionEvent);
}
});
如何使父视图的侦听器捕捉投掷手势,而子视图的侦听器捕捉轻触手势?
我不认为需要任何源代码来解释这种情况,但这里有一个片段可以设置我的ChildView
监听器
ChildView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return singleTapGestureDetector.onTouchEvent(motionEvent);
}
});
一种解决方法是让
ParentView
和ChildView
的监听器处理onFling()
,而只有ChildView
的监听器处理onsingletaup()
,但在这种情况下,ChildView
(就像从孩子外部开始,然后在孩子内部结束),我相信。我不喜欢我的解决方案,但我找到了一种方法。希望将来有人会给出更好的答案,或者至少我的解决方法对其他人有用
正如我在问题中所描述的,问题在于手势监听器如何工作。要让子视图捕捉onSingleTapUp()
事件,您在onDown()
上返回true。但是一旦这样做,即使在子视图的onTouch()之后,后续的一系列事件也不会转到父视图
声明它对该事件不再感兴趣。如果您在孩子的onTouch()
中强制调用家长的onTouch()
,当其手势检测器返回false时,则是家长的onFling()将被调用,但第一个MouseEvent
参数将为NULL,因为它已被子视图的onTouch()
使用
我一定错过了一些东西,因为这似乎是一个非常基本的手势检测场景。无论如何,我找不到一个合理的方法来做到这一点
所以,我的解决办法是将TouchListenerService作为一个单体
子视图和父视图都有这一行:
view.setOnTouchListener(TouchListenerService.Instance());
TouchListenerService的启动方式如下:
public class TouchListenerService
extends GestureDetector.SimpleOnGestureListener
implements View.OnTouchListener {
// some code to implement singleton
public SingleTapUpHandler SingleTapUpHandler;
public FlingHandler FlingHandler;
private View _touchingView;
GestureDetector gestureDetector;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (gestureDetector == null)
gestureDetector = new GestureDetector(_touchListenerService);
_touchingView = view;
boolean result = gestureDetector.onTouchEvent(motionEvent);
_touchingView = null;
return result;
}
// and some more code
因为它是同一个事件处理程序,所以父视图捕获
onFling()
事件成功,而子视图可以设置SingleTapUpHandler
来处理单击事件。这对我来说很有效,我尝试了其他方法,但没有成功,比如使用FrameLayout-同样的问题。接受这个答案-希望它将来能帮助其他人,或者其他人会注意到更好的方法。