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