Frage

Ich habe ein Bild in ImageView. Ich muss die genaue (x, y) Koordinate des Bildes wissen, wenn ich das Bild berühre. Ich möchte auch einen Kreis am Touch Place zeichnen.

Nachfolgend ist der Code, den ich verwende. Ich habe ein ImageView und füge ein OnTouchListener hinzu.

Das Problem ist:

  1. Ich bekomme seltsame (x, y) Werte
  2. Neue Kreise werden nur dreimal gezeichnet. Danach werden keine neuen Kreise gezeichnet!

    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;
        }
    });
    
War es hilfreich?

Lösung

Das Problem ist höchstwahrscheinlich, dass Sie die Tatsache nicht berücksichtigen, dass die Position der MotionEvent wird so eingestellt, dass sie relativ zur enthaltenen Ansicht sein (die ImageView in diesem Fall) und es sieht so aus, als würden Sie versuchen, sie auf einen anderen zu zeichnen Canvas das hätte einen anderen Koordinatenraum. Wenn Sie die beiden so getrennt sein müssen, würde ich empfehlen, die Verwendung zu verwenden MotionEvent.getRawX() und MotionEvent.getRawY() Damit sich die Berührungswerte in den Koordinaten des Bildschirms als Ganzes befinden.

Wenn Sie jedoch nur die Kreise über das Bild ziehen möchten, wäre eine bessere Lösung zur Unterklasse ImageView Sie können also Berührungen in seiner erkennen onTouchEvent() Methode direkt (anstelle eines Hörers) und maßgeschneiderte Zeichnung in seinem onDraw() Methode, die garantiert, dass alles in derselben angepassten Koordinatenebene liegt.

Aus Ihrem Code geht es nicht heraus, warum diese Operation nur dreimal korrekt funktioniert. Vielleicht versuchen Sie nur zurückzukehren true Aus der Berührungserkennungsmethode in der Down -Instanz, an der Sie interessiert sind, können Sie mit der aktuellen Implementierung unnötig Touch -Ereignisse stehlen.

HTH

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top