2011-03-15 52 views
10

我想检测在屏幕块中的一举一动。我正在使用下面的代码。Android的OnGestureListener一掷无法检测

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,但它没有检测到任何甩动。我的代码中有什么问题?

回答

14

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

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; 
      } 
     } 
    }; 
} 
+8

谢谢。这篇文章帮了我很多。这里的关键是在'onDown(MotionEvent)'方法中返回'true'! – garbagecollector 2012-08-20 06:53:36

+1

和MAJOR_MOVE有什么价值? ;) – 2013-07-19 21:43:40

3

首先您的onTouchEvent方法不正确,并且会由gestureScanner对象导致2次onTouchEvent调用。 您需要通过这样来改变:

@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; 
    } 
} 
+0

我已经改变的onTouchEvent的代码,每个方向,也是onFling方法尝试。但结果没有变化。它仍在检测触摸事件,但没有onFling事件。 – 2011-03-15 10:23:33

3

onDown方法的返回true

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