Android Gesture Recognition нескольких событий - PullRequest
0 голосов
/ 19 ноября 2018

В моем приложении у меня есть VideoView, который отображает видеопоток из пула камер.Я хочу использовать распознавание жестов, чтобы изменить , какую камеру показывать.Прокрутка по оси X должна изменить тип камеры, прокрутка по оси Y должна переключить сторону группы камер.

Источник (объекта MainActivity, где расположен VideoView):

private GestureDetectorCompat gestureDetector;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    gestureDetector = new GestureDetectorCompat(this, new CameraGestureListener());

    cameraView = findViewById(R.id.cameraView);

    cameraView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (gestureDetector.onTouchEvent(motionEvent))
                return true;

            return MainActivity.super.onTouchEvent(motionEvent);
        }
    });

И, наконец, я определил этот класс (внутри MainActivity):

class CameraGestureListener extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onDown(MotionEvent event) {
        Log.d(getClass().getName(), "onDown: " + event.toString());
        return true;
    }

    @Override
    public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
        if(Math.abs(velocityY)>Math.abs(velocityX))
        {
            Log.d(getClass().getName(), "change side");
        }
        else if(velocityX>0)
        {
            Log.d(getClass().getName(), "change camera type");
        }
        else if(velocityX<0)
        {
            Log.d(getClass().getName(), "change camera type");
        }

        return true;
    }

    @Override
    public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) {
        if(Math.abs(distanceY)>Math.abs(distanceX))
        {
            Log.d(getClass().getName(), "change side");
        }
        else if(distanceX>0)
        {
            Log.d(getClass().getName(), "change camera type");
        }
        else if(distanceX<0)
        {
            Log.d(getClass().getName(), "change camera type");
        }

        return true;
    }
}

В отладке я ясно вижу, что Scroll события запускаются дважды и часто distanceX больше distanceY , даже если жест в основном относится к физической оси экрана Y.Те же проблемы возникают с аналогичным поведением на Fling событиях.Как я могу это исправить?

1 Ответ

0 голосов
/ 20 ноября 2018

Следуя предложению pskink, единственное необходимое исправление состояло в том, чтобы удалить ненужный триггер обработчика событий суперкласса (моя опечатка вырезать и вставить):

MainActivity.super.onTouchEvent(motionEvent);

Правильный код становится:

cameraView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        gestureDetector.onTouchEvent(motionEvent);

        return true;
    }
});

Жест правильно распознается обработчиком событий onFling. Через onScroll обработчиков событий вы по-прежнему наблюдаете два события для каждого жеста, но, вероятно, это правильное поведение.

...