【问题标题】:Android Gesture Recognition multiple eventsAndroid手势识别多事件
【发布时间】:2018-11-19 17:17:09
【问题描述】:

在我的应用程序中,我有一个 VideoView,它显示来自相机池的视频源。我希望使用手势识别来更改正在显示的相机。 在 X 轴上滚动应该改变相机类型,在 Y 轴上滚动应该切换相机组的 side

来源(VideoView 所在的MainActivity 对象):

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 事件上的类似行为也会出现同样的问题。 我该如何解决这个问题?

【问题讨论】:

  • return MainActivity.super.onTouchEvent(motionEvent);View.OnTouchListener#onTouch 方法中做了什么?只需从中返回true
  • @pskink 成功了! ... onSling 事件现在可以正确报告我正在寻找的操作。谢谢。
  • 很好,很高兴听到这个消息

标签: java android gesture-recognition


【解决方案1】:

按照 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 事件处理程序,您仍然可以观察到每个手势的两个事件,但这可能是正确的行为。

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多