J'ai cherché un peu et j'ai trouvé cette solution qui me parait être la mieux.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| public class MainActivity extends AppCompatActivity {
// class member variable to save the X,Y coordinates
private float[] lastTouchDownXY = new float[2];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// add both a touch listener and a click listener
View myView = findViewById(R.id.my_view);
myView.setOnTouchListener(touchListener);
myView.setOnClickListener(clickListener);
}
// the purpose of the touch listener is just to store the touch X,Y coordinates
View.OnTouchListener touchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// save the X,Y coordinates
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
lastTouchDownXY[0] = event.getX();
lastTouchDownXY[1] = event.getY();
}
// let the touch event pass on to whoever needs it
return false;
}
};
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// retrieve the stored coordinates
float x = lastTouchDownXY[0];
float y = lastTouchDownXY[1];
// use the coordinates for whatever
Log.i("TAG", "onLongClick: x = " + x + ", y = " + y);
}
};
} |
On crée une variable pour stocker des coordonées
private float[] lastTouchDownXY = new float[2];
On crée un OnTouchListener pour récuperer les coordonées. Ce listener contrairement à un OnClickListener va être déclencher à chaque fois que l'on touche l'écran (click, swipe, longClick , etc). Mais il nous permet de connaitre les coordonées de l'évènement qui l'a déclenché. Ce qui nous intéresse comme évènement est un click. Dans Android un click est une action de toucher, puis de relacher sans que le doigt est bougé ni que le temps entre les deux ne soit trop long. On ne peut pas déclencher onTouch sur un click. Il se déclenche sur l'action de toucher, et se redéclenche sur l'action de relacher. (il se déclenche aussi sur l'action de bouger). On va donc pour un click capturer uniquement l'action de toucher :
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
Puis on stock les coordonées de ce toucher dans notre variable :
1 2
| lastTouchDownXY[0] = event.getX();
lastTouchDownXY[1] = event.getY(); |
Enfin on retourne false. Cela indique que l'on a pas consommé l'evènement, et que si une autre entité doit réagir à l'évènement elle peut le faire.
Ensuite on a notre OnClickListener. En effet dans le onTouch on est pas sûr d'avoir réagit à un click. Peut-être que l'utilisateur à fait un swipe. On a donc un onClickListener pour régair au click. Notre réaction à ce click est de lire les coordonées stocké dans notre variable. Celle-ci contient les dernière stockées par le onTouch, à savoir le toucher du click de l'utilistauer.
Par cette astuce tu arrives à trouver les coordonnées du click de l'utilisateur
Partager