Android手势识别多个事件

时间:2018-11-19 17:17:09

标签: java android gesture-recognition

在我的应用程序中,我有一个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事件被触发两次,并且即使手势主要位于物理Y轴上, distanceX 通常大于 distanceY 屏幕轴。在Fling事件上,类似行为也会产生相同的问题。 我该如何解决?

1 个答案:

答案 0 :(得分:0)

遵循pskink的建议,唯一需要解决的问题是删除超类事件处理程序的不必要重新触发(我自己的剪切粘贴错误打印):

decimal amountToWithdraw = Convert.ToDecimal(txtAmountToTransfer.Text, CultureInfo.InvariantCulture);

正确的代码变为:

MainActivity.super.onTouchEvent(motionEvent);

cameraView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { gestureDetector.onTouchEvent(motionEvent); return true; } }); 事件处理程序可以正确识别该手势。通过onFling事件处理程序,您仍然可以观察到每个手势有两个事件,但这可能是正确的行为。