【发布时间】: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