【问题标题】:Android: GestureDetector won't catch GesturesAndroid:GestureDetector 不会捕捉手势
【发布时间】:2012-12-06 07:21:43
【问题描述】:

我必须在我的程序中使用 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”。关于为什么它不会注册投掷的任何想法?

【问题讨论】:

    标签: android gestures


    【解决方案1】:

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

    【讨论】:

    • 这里有两件事:视图中的“onTouch()”处理程序,如果它消耗了触摸事件,它应该返回。不过,GestureDetector 可能需要多个事件。因此,您不应该像现在一样只返回 myExcuseGestureDetector.onTouchEvent(event),而是应该将每个事件都输入 GestureDetector 并返回 true 以指示您使用了触摸。它现在最有可能工作,因为你 GestureDetector 总是返回 true。
    • @LoneWolfPR 我正在这样使用它......但它不起作用......请看看......pastebin.com/n9JPGrCn
    • 它不适用于Dialog。你在Dialog上测试过吗?
    【解决方案2】:

    这不是你可能也做过的,它对你有用的原因是你的活动覆盖了 onTouchEvent somtehing,如下所示:

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

    我在this excellent site找到了答案。

    【讨论】:

    • 或者只是return myGestureDetector.onTouchEvent(event)
    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多