Question

J'ai une image dans ImageView. Je dois savoir exactement (x, y) coordonnée de l'image quand je touche l'image. Je veux aussi tracer un cercle sur la place du contact.

Étant donné ci-dessous, est le code que je utilise. J'ai un ImageView et je joins un onTouchListener à lui.

Le problème est le suivant:

  1. Je reçois des valeurs étranges (x, y)
  2. de nouveaux cercles ne sont dessinés 3 fois. Après cela, pas de nouveaux cercles sont dessinés!

    ImageView touch=(ImageView) findViewById(R.id.image);
    touch.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN){
    
               //Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
               //Canvas can=new Canvas(bm);
               p.setColor(Color.RED);
               float fx=event.getX();
               float fy=event.getY();
               can.drawCircle(fx, fy, 20, p);                   
            }
            return true;
        }
    });
    
Était-ce utile?

La solution

Le problème est plus probable que vous ne prenez pas en compte le fait que la position du MotionEvent est ajustée pour être par rapport à la vue contenant (le ImageView dans ce cas) et il semble que vous essayez de les attirer sur un autre Canvas qui aurait un autre espace de coordonnées. Si vous avez besoin de deux à être séparés comme cela, je vous conseille d'utiliser MotionEvent.getRawX() et MotionEvent.getRawY() afin que les valeurs tactiles sont les coordonnées de l'écran dans son ensemble.

Cependant, si vous voulez juste dessiner les cercles sur l'image, une meilleure solution serait de sous-classe ImageView afin que vous puissiez détecter touche dans sa méthode onTouchEvent() directement (au lieu d'un auditeur) et ne dessin personnalisé dans sa méthode onDraw(), tout en garantissant est dans le même plan de coordonnées ajusté.

Il ne ressort pas de votre code pourquoi cette opération ne fonctionnera correctement trois fois travailler. Peut-être essayer seulement de revenir true de la méthode de détection tactile dans l'instance de BAS qui vous intéresse. Vous pouvez être voles inutilement des événements de contact avec l'implémentation actuelle.

HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top