Android手势识别多个事件



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

来源(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通常大于distance Y,即使手势主要在物理Y屏幕轴上。Fling事件上的类似行为也会出现同样的问题。我该怎么解决这个问题?

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

最新更新