Метод ScaleGestureDetector.OnScaleGestureListener.onScaleEnd () не используется - PullRequest
5 голосов
/ 06 июля 2011

Обновление: я разобрался, что происходит.См. Комментарии.

Я пытаюсь написать 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:Как определить, когда закончился свиток

Это то, что здесь происходит?Если да, то в чем смысл метода onScaleEnd ()?

РЕДАКТИРОВАТЬ:

Я решил это: это потому, что мои методы возвращают false.Eclipse автоматически реализовал некоторые заглушки, и я не менял возвращаемые значения при их заполнении.

1 Ответ

7 голосов
/ 27 июля 2011

Если установлен ScaleGestureDetector, который возвращает false из onScaleBegin (...), ни один из последующих методов не будет задействован. Обычно методы, которые используют MotionEvent, но возвращают false, не получают последующие MotionEvents до тех пор, пока после ACTION_UP не произойдет сброс слушателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...