【问题标题】:Android OnGestureListener Fling is not detectingAndroid OnGestureListener Fling 未检测到
【发布时间】:2011-07-15 15:52:02
【问题描述】:

我想检测屏幕块中的投掷动作。我为此使用以下代码。

public class MyinfoActivity extends Activity implements OnGestureListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ..........
        ..........
        gestureScanner = new GestureDetector(this);
        resBlock = (TableRow) findViewById(R.id.ResBlock);
        gestureScanner = new GestureDetector(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent me){
        Log.d(null,"Touch");
        if (gestureScanner.onTouchEvent(me))
            return gestureScanner.onTouchEvent(me);
        else
            return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2,
                       float velocityX, float velocityY) {
        Log.d(null,"Fling");
        ............
        ............
    }

    @Override
    public boolean onDown(MotionEvent arg0) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {}

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                        float distanceX, float distanceY) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {}

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }
}

它正在检测 TouchEvent,但没有检测到任何甩动动作。我的代码有什么问题?

【问题讨论】:

    标签: android gesture touch-event onfling


    【解决方案1】:

    在您的 onDown 方法中返回 true

    @Override
    public boolean onDown(MotionEvent arg0) {
        return true;
    }
    

    【讨论】:

      【解决方案2】:

      我用下面的代码解决了这个问题。

      public class MyinfoActivity extends Activity {
          private GestureDetector gestureScanner;
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.myinfotrackerinner);
              gestureScanner = new GestureDetector(this,simpleOnGestureListener);
          }
      
          @Override
          public boolean onTouchEvent(MotionEvent event) {
              return gestureScanner.onTouchEvent(event);
          }
      
          GestureDetector.SimpleOnGestureListener simpleOnGestureListener =
                             new GestureDetector.SimpleOnGestureListener() {
              @Override
              public boolean onDown(MotionEvent event) {
                  return true;
              }
      
              @Override
              public boolean onFling(MotionEvent event1, MotionEvent event2,
                                         float velocityX, float velocityY) {
                  Log.d(null,"Fling");
                  int dx = (int) (event2.getX() - event1.getX());
                  // don't accept the fling if it's too short
                  // as it may conflict with a button push
                  if (Math.abs(dx) > MAJOR_MOVE 
                             && Math.abs(velocityX) > Math.abs(velocityY)) {
                      if (velocityX > 0) {
                          moveGraph("L");
                      } else {
                          moveGraph("R");
                      }
                      return true;
                  } else {
                      return false;
                  }
              }
          };
      }
      

      【讨论】:

      • 谢谢。这篇文章对我帮助很大。这里的关键是在onDown(MotionEvent)方法中返回true
      • MAJOR_MOVE 有什么价值? ;)
      【解决方案3】:

      首先,您的 onTouchEvent 方法不正确,将导致手势扫描器对象对 onTouchEvent 的 2 次调用。 你需要改变这个:

          @Override
          public boolean onTouchEvent(MotionEvent me){
               Log.d(null,"Touch");
               if (gestureScanner.onTouchEvent(me))
                   return true;
               else
                   return super.onTouchEvent(event); // or false (it's what you whant).
          }
      

      你也有这行两次:

      gestureScanner = new GestureDetector(this);
      

      然后尝试像这样更改您的 onFling 方法:

      @Override
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
          try{
              if(Math.abs(e1.getY()-e2.getY()) > 250) 
                  return false;               
              if(e1.getX() - e2.getX() > 120 && Math.abs(velocityX) > 200){
                  Log.d("Fling", "Move Next");
                  //do something...
              }
              else if(e2.getX() - e1.getX() > 120 && Math.abs(velocityX) > 200){
                  Log.d("Fling", "Move Previous");
                  //do something...
              }
              return false;
          }
          catch(Exception e){
              return false;
          }
      }
      

      【讨论】:

      • 我尝试过根据方向更改 onTouchEvent 的代码以及 onFling 方法。但结果没有任何变化。它仍在检测触摸事件,但没有 onFling 事件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2013-09-24
      • 2015-08-13
      • 2020-11-30
      相关资源
      最近更新 更多