我必须在我的程序中使用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;
}
});
然后我将这个块定义为excuseGestureDetector
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;
}
}
无论出于何种原因,它根本没有注册。无论动画是否发生,程序都应该打印出我正在尝试跟踪的Log.d(“MotionEvent”,“onFling”),而不是。我所知道的是它确实记录了某种形式的事件发生了,因为它确实从我展示的第一个块中找出了“借口手势返回”“假”。有关它为什么不注册投掷的任何想法?
答案 0 :(得分:4)
我不确定为什么,但是当我在SimpleOnGestureListener中为所有可能的手势设置Overrides时,它就开始工作了。显然它需要它们全部在那里,而不仅仅是onFling。
答案 1 :(得分:1)
这不是必需的,你可能也做了什么以及它对你有用的是你的活动覆盖onTouchEvent somtehing如下:
@Override
public boolean onTouchEvent(MotionEvent event) {
if (myGestureDetector.onTouchEvent(event)) {
return true;
} else {
return false;
}
}
我在this excellent site找到了答案。