如何在内部视图上接受onSingleTapUp(),同时在外部视图上接受onFling()?

时间:2012-09-16 00:03:07

标签: android gesture ontouchlistener

我有一个覆盖整个屏幕的视图(比方说ParentView),以及仅涵盖其中一部分的子内部视图ChildView。 我想让ChildView回复onSingleTapUp(),而ParentView回复onFling()。我试图在SimpleOnGestureListener上附加一个ChildView,在SimpleOnGestureListener附加一个ParentView

要接受来自onSingleTapUp()的{​​{1}},其听众ChildView必须返回true。 但是一旦我这样做,与onDown()相关联的听众就不再听到任何动作事件,因为它是由ParentView的听众拍摄的。即使ChildView的{​​{1}}返回false,事件也不会流向ChildView的侦听器。

当子视图的侦听器捕获轻击手势时,如何让父视图的侦听器捕获到该手势?

我认为不需要任何源代码来解释这种情况,但这里有一个代码片段来设置我的onFling()侦听器。

ParentView

一种解决方法可能是让ChildViewChildView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return singleTapGestureDetector.onTouchEvent(motionEvent); } }); 的侦听器处理ParentView,而只有ChildView的侦听器处理onFling(),但是在这种情况下,我不相信ChildView(就像从孩子外面开始然后在孩子身边结束)就会发生这种情况。我相信。

1 个答案:

答案 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()来处理点击事件。