我有一个覆盖整个屏幕的视图(比方说ParentView
),以及仅涵盖其中一部分的子内部视图ChildView
。
我想让ChildView
回复onSingleTapUp()
,而ParentView
回复onFling()
。我试图在SimpleOnGestureListener
上附加一个ChildView
,在SimpleOnGestureListener
附加一个ParentView
。
要接受来自onSingleTapUp()
的{{1}},其听众ChildView
必须返回true。
但是一旦我这样做,与onDown()
相关联的听众就不再听到任何动作事件,因为它是由ParentView
的听众拍摄的。即使ChildView
的{{1}}返回false,事件也不会流向ChildView
的侦听器。
当子视图的侦听器捕获轻击手势时,如何让父视图的侦听器捕获到该手势?
我认为不需要任何源代码来解释这种情况,但这里有一个代码片段来设置我的onFling()
侦听器。
ParentView
一种解决方法可能是让ChildView
和ChildView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return singleTapGestureDetector.onTouchEvent(motionEvent);
}
});
的侦听器处理ParentView
,而只有ChildView
的侦听器处理onFling()
,但是在这种情况下,我不相信ChildView
(就像从孩子外面开始然后在孩子身边结束)就会发生这种情况。我相信。
答案 0 :(得分:2)
我不喜欢我的解决方案,但我找到了一种方法。希望其他人将来会发布更好的答案,或者至少我的解决方法对其他人有用。
正如我在问题中描述的那样,问题在于手势监听器的工作原理。要使子视图捕获onSingleTapUp()
事件,您将在onDown()
上返回true。但是一旦你这样做,即使你的子视图onTouch()
声明它不再对该事件感兴趣,后续的一系列事件也不会进入父视图。如果你的手势检测器返回false时强行调用孩子的onTouch()
内的父{Q},那么将调用父的onFling(),但是第一个onTouch()
参数将为NULL,因为它是由子视图MouseEvent
消耗。
我必须遗漏一些东西,因为这似乎是非常基本的手势检测方案。无论如何,我找不到合理的方法来做到这一点。
所以,我的解决方法是将TouchListenerService设为单例。
子视图和父视图都有此行:
onTouch()
和TouchListenerService像这样开始:
view.setOnTouchListener(TouchListenerService.Instance());
由于它是相同的事件处理程序,父视图成功捕获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()
来处理点击事件。