ScaleGestureDetector.OnScaleGestureListener.onScaleEnd()方法没有被击中

时间:2011-07-06 10:54:53

标签: android callback scale gesturedetector

更新:我弄清楚发生了什么。见评论。

我正在尝试编写一个ViewSwitcher,它将所有手势传递给它的第一个孩子,直到它收到一个缩放手势;然后它将它们传递给它的第二个孩子,直到那个孩子完全缩小,当它恢复到第一个孩子时。我的子类有一个ScaleGestureDetector,我做了一个非常简单的监听器:

    protected class OnScaleModeSwitcher implements ScaleGestureDetector.OnScaleGestureListener
    {
        protected PageFlipSwitcher owner;

        public OnScaleModeSwitcher(PageFlipSwitcher newOwner)
        {
            super();
            owner = newOwner;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            return false;
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            owner.onScaleBegin();
//returning false here causes the rest of the gesture to be ignored.
            return false;
        }

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            owner.onScaleEnd();
        }
    }

正如您所看到的,它所做的就是在构造时引用所有者对象,然后将一些事件传递给所有者类中的方法。但是,代码没有达到onScaleEnd()。

我知道onInterceptTouchEvent可能有点冒险;我尽可能地遵循Android文档中的建议,并且

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev)
    {
        onTouchEvent(ev);
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
//mode is the name of the ScaleGestureDetector
        mode.onTouchEvent(ev);

//this code just passes events to the children
//it seems to work OK
        if(zoomActive)
        {
            //ZoomSwitcher
            getChildAt(1).onTouchEvent(ev);
        }
        else
        {
            //Gallery
            getChildAt(0).onTouchEvent(ev);
        }
        return true;
    }

我在其他地方读到GestureDetector可能没有收到ACTION_UP事件:

Android: How to detect when a scroll has ended

这是发生在这里的事吗?如果是这样,那么onScaleEnd()方法有什么意义呢?

编辑:

我已经解决了这个问题:这是因为我的方法返回false。 Eclipse自动实现了一些存根,当我填充它时,我没有更改返回值。

1 个答案:

答案 0 :(得分:7)

如果设置了一个从onScaleBegin(...)返回false的ScaleGestureDetector,则不会触发任何后续方法。通常,使用MotionEvent但返回false的方法在ACTION_UP之后,当重置侦听器时,不会获得后续的MotionEvent。