在我的应用程序中,我有一个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
事件上,类似行为也会产生相同的问题。
我该如何解决?
答案 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
事件处理程序,您仍然可以观察到每个手势有两个事件,但这可能是正确的行为。