IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Comment récupérer la position d'un clic sur une View ?


Sujet :

Composants graphiques Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Prof Maths, ex développeur Assembleur et C
    Inscrit en
    Juillet 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Prof Maths, ex développeur Assembleur et C

    Informations forums :
    Inscription : Juillet 2016
    Messages : 22
    Points : 10
    Points
    10
    Par défaut Comment récupérer la position d'un clic sur une View ?
    Bonjour,

    J'ai les bouts de code suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class MainActivity extends AppCompatActivity implements View.OnTouchListener, View.OnClickListener {
        private Button bParam = null;
         private BalleView balle = null;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate( savedInstanceState );
            setContentView( R.layout.activity_main );
     
            bParam = (Button) findViewById( R.id.param );
            bParam.setOnClickListener( this );
     
            balle  = (BalleView) findViewById(R.id.balle); //Je récupère l'objet balleView depuis le layout
            balle.setOnClickListener( this ); //Je défini quel est le listener qui réagira à un click sur balleView
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
        @Override
        public boolean onTouch(View v, MotionEvent event) {
     
            return false;
        }
        @Override
        public void onClick(View v) {
            float x,y;
            switch(v.getId()) {
                case R.id.param:
                    BalleView.rayon += 10;
                    break;
                  case R.id.balle:
                    if (BalleView.rayon > 11) BalleView.rayon -= 10;
                    Toast.makeText(getBaseContext(),"x = " +String.valueOf(v.getX()) + "," + "  y = " +String.valueOf(v.getY()) ,Toast.LENGTH_SHORT).show();
                    BalleView.xTN = v.getX();
                    BalleView.yTN = v.getY();
                    break;
            }
        }
    Ça fonctionne, sauf que v.getX() et getY() me renvoient systématiquement zéro.
    Trouvez l'erreur ! j'y ai passé quelques heures, mais je ne trouve pas.
    Merci de vos lumières !
    Bernard

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Android
    Inscrit en
    Avril 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Android

    Informations forums :
    Inscription : Avril 2015
    Messages : 63
    Points : 102
    Points
    102

  3. #3
    Membre à l'essai
    Homme Profil pro
    Prof Maths, ex développeur Assembleur et C
    Inscrit en
    Juillet 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Prof Maths, ex développeur Assembleur et C

    Informations forums :
    Inscription : Juillet 2016
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Merci SALFAI,
    J'ai essayé ta solution, mais les coordonnées affichées sont toujours les mêmes, quelque soit l'endroit ou je clique.
    Donc ça doit être autre chose.
    Bernard

  4. #4
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    L'objet v dans la méthode onClick(View v) est la vue qui a déclenché cette méthode. Autrement dit la vue sur laquelle l'utilisateur à clicker.
    Ensuite tu appelle la méthode getX() sur cette vue. Or comme expliqué dans sa documentation, cette méthode retourne la position X de la vue.

    Donc dans ton code, tu récupère et affiche la position de la vue sur laquelle tu as clické. Il est donc normal que peu import ou tu clicke sur cette vue, il te retourne toujours la même valeur. Car ta vue n'a pas bougé.
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  5. #5
    Membre à l'essai
    Homme Profil pro
    Prof Maths, ex développeur Assembleur et C
    Inscrit en
    Juillet 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Prof Maths, ex développeur Assembleur et C

    Informations forums :
    Inscription : Juillet 2016
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Ok, Mea Culpa !

    Je vais consulter la doc pour trouver la bonne fonction.
    Merci

  6. #6
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut
    J'ai cherché un peu et j'ai trouvé cette solution qui me parait être la mieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
    Puis on stock les coordonées de ce toucher dans notre variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

Discussions similaires

  1. Récupérer la position d'un clic sur ImageButton
    Par AndroidNewbie dans le forum Android
    Réponses: 4
    Dernier message: 23/02/2017, 08h37
  2. Récupérer la position de la souris sur une image
    Par megamario dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/04/2011, 13h15
  3. Identifier la position d'un clic sur une image
    Par swissmade dans le forum Débuter
    Réponses: 6
    Dernier message: 03/01/2010, 13h38
  4. Récupérer la position d'un clic sur une image
    Par visio dans le forum OpenCV
    Réponses: 1
    Dernier message: 24/10/2007, 08h06
  5. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo