Je veux détecter le mouvement de flan dans un bloc de l'écran. J'utilise le code suivant pour cela.
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; } }
3 Réponses :
D'abord votre méthode Ontouchevent est incorrecte et provoquera 2 appel d'Ontouchevent par l'objet GesturesCanner. Vous devez modifier par ceci:
@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; } }
J'ai essayé en changeant du code d'Ontouchevent selon la direction et la méthode d'Onfling. Mais pas de changement dans le résultat. Il détecte toujours l'événement tactile, mais pas d'événement Offling.
J'ai utilisé le code suivant et j'ai résolu le problème.
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; } } }; }
Merci. Ce post m'a beaucoup aidé. La clé ici consiste à renvoyer true code> dans la méthode
indown (MotionEvent) code>!
et quelle valeur le major_move a-t-il? ;)
retour true code> dans votre
méthode code> méthode