我的程序中必须有 GestureDetectors。一个工作得很好,另一个则不然。据我所知,它们都是以相同的方式实现的。
以下是实现不起作用的代码:
myExcuseGestureDetector = new GestureDetector(new excuseGestureDetector());
excuseView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if(myExcuseGestureDetector.onTouchEvent(event)){
Log.d("Excuse Gesture Return","true");
return true;
}
Log.d("Excuse Gesture Return","false");
return false;
}
});
然后我稍后会定义这个 block ,它定义了leaveGestureDetector
private class excuseGestureDetector extends SimpleOnGestureListener{
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.d("MotionEvent","onFling");
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if(currExcuseNumber<currExcuseSet.size()){
currExcuseNumber++;
loadNextExcuse(currExcuseNumber,1);
excuseView.setInAnimation(slideLeftExcuseIn);
excuseView.setOutAnimation(slideLeftExcuseOut);
excuseView.showNext();
return true;
}
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if(currExcuseNumber > 1){
loadNextExcuse(currExcuseNumber,0);
excuseView.setInAnimation(slideRightExcuseIn);
excuseView.setOutAnimation(slideRightExcuseOut);
excuseView.showPrevious();
return true;
}
}
} catch (Exception e) {
// nothing
}
return false;
}
}
无论出于何种原因,它根本不记录该 throw 。无论动画是否发生,程序都应该打印出我试图跟踪的 Log.d("MotionEvent","onFling") 但它没有。我所知道的是,它确实注册了某种触摸事件的发生,因为它确实从我显示的第一个 block 中追踪出了“Excuse Gesture Return”“false”。关于为什么它不会注册 fling 的任何想法吗?
最佳答案
我不太确定为什么,但是一旦我将所有可能的手势的覆盖放在 SimpleOnGestureListener 中,它就开始工作。显然它需要所有这些,而不仅仅是 onFling。
关于Android:GestureDetector 无法捕获手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4027553/