4

我有一个覆盖整个屏幕的视图(比方说),以及只覆盖其中一部分的ParentView子内部视图。ChildView我要做出ChildView回应onSingleTapUp(),同时ParentView回应onFling()。我正在尝试通过将一个和一个附加SimpleOnGestureListener到.ChildViewSimpleOnGestureListenerParentView

要接受onSingleTapUp()from ChildView,它的侦听onDown()器必须返回 true。但是一旦我这样做了,与之相关的听众就ParentView不会再听到任何运动事件了,因为它是由ChildView的听众采取的。即使ChildView'onFling()返回 false,事件也不会流向ParentView' 侦听器。

如何让父视图的侦听器捕捉到轻击手势,而子视图的侦听器捕捉轻击手势?

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

ChildView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return singleTapGestureDetector.onTouchEvent(motionEvent);
    }
});

一种解决方法可能是同时处理ParentViewandChildView的侦听器,onFling()而只有ChildView's listener handle onSingleTapUp(),但在这种情况下,投掷将无法跨越ChildView(例如从子外部开始,然后在子内部结束),我相信。

4

1 回答 1

2

我不喜欢我的解决方案,但我找到了一种方法来做到这一点。希望其他人将来会发布更好的答案,或者至少我的解决方法对其他人有用。

正如我在问题中所描述的,问题在于手势监听器的工作方式。对于要捕获onSingleTapUp()事件的子视图,您在 上返回 true onDown()。但是一旦你这样做了,即使你的子视图onTouch()声明它不再对该事件感兴趣,后续的一系列事件也不会转到父视图。如果您在其手势检测器返回 false 时在子视图中强制调用onTouch()onTouch()视图,是的,父视图的 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为处理点击事件。

于 2012-09-30T06:15:23.183 回答