2

我必须在我的程序中使用 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;
    }
});

然后我有这个块,它定义了借口GestureDetector

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") ,但它没有。我所知道的是它确实记录了某种触摸事件的发生,因为它确实从我显示的第一个块中找出了“Excuse Gesture Return”“false”。关于为什么它不会注册投掷的任何想法?

4

2 回答 2

4

我不太确定为什么,但是一旦我在 SimpleOnGestureListener 中为所有可能的手势设置了 Overrides,它就开始工作了。显然,它需要它们全部在那里,而不仅仅是 onFling。

于 2010-10-26T22:20:29.283 回答
1

这不需要您可能也做过的事情,它对您有用的是您的活动覆盖了 onTouchEvent somtehing,如下所示:

@Override
public boolean onTouchEvent(MotionEvent event) {
  if (myGestureDetector.onTouchEvent(event)) {
    return true;
  } else {
    return false;
  }
}

我在这个优秀的网站上找到了答案。

于 2010-12-01T08:10:01.647 回答