В моем приложении у меня есть 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
событиях.Как я могу это исправить?