J'essaie d'implémenter une vue qui a à la fois un longClickListener et un détecteur de mouvement. Fondamentalement, j'ai besoin d'un bouton pour afficher une vue lorsque l'utilisateur clique longtemps sur la première vue, puis je veux détecter un mouvement de lancement. Je voudrais faire en sorte que l'utilisateur n'a pas à lever le doigt du tout, et frapper à la fois le longclick, et le mouvement de lancer.Voir avec gesture listener et onLongClickListener
Voici mon code pour le longClickListener:
flipCard.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View view) {
answerRight.setVisibility(View.VISIBLE);
answerRight.startAnimation(AnimationUtils.loadAnimation(view.getContext(), R.anim.grow_from_middle));
answerWrong.setVisibility(View.VISIBLE);
answerWrong.startAnimation(AnimationUtils.loadAnimation(view.getContext(), R.anim.grow_from_middle));
return false;
}
});
Voici le code pour mon geste Dector:
gestureDetectorScore = new GestureDetector(new ScoreGestureDetector());
gestureListenerScore = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetectorScore.onTouchEvent(event)) {
return true;
}
return false;
}
};
private class ScoreGestureDetector extends SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 5;
private static final int SWIPE_THRESHOLD_VELOCITY = 2;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
//if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH)
//return false;
// right to left swipe
//if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE){
Toast.makeText(AndroidOrientationSensor.this, "Up Swipe", Toast.LENGTH_SHORT).show();
}
//else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE){
Toast.makeText(AndroidOrientationSensor.this, "Down Swipe", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
// nothing
}
return false;
}
@Override
public boolean onDown(MotionEvent e1){
Toast.makeText(AndroidOrientationSensor.this, "Up Swipe", Toast.LENGTH_SHORT).show();
return true;
}
}
Enfin, je suis en train de le geste Dectector à la vue "Flipcard" comme ceci:
flipCard.setOnTouchListener(gestureListenerScore);
Toute aide serait grandement appréciée.
Bonne idée, j'ai beaucoup de mal à implémenter cela. J'essaye de recréer un longClickEvent dans l'écouteur de geste. En vérifiant les coordonnées pour s'assurer qu'elles correspondent avec le bouton, puis en simulant un long clic, je peux être capable d'attraper l'événement de fling. –
Malheureusement, parce que vous voulez que tout se passe dans un seul événement tactile, il ne sera pas facile de le faire. Tout ce que je peux dire est à partir de votre code actuel, plutôt que de passer le GestureDetector dans setOnTouchListener, vous pouvez remplacer la méthode onTouchEvent, puis retourner mGestureDetector.onTouchEvent (motionEvent); évidemment avec ceci, après un long clic vous pouvez vous-même acheter les touchesvents et faire ce que vous voulez avec eux (c'est-à-dire détecter un fling personnalisé) –