Abfragen in Bezug auf Berührungskoordinaten auf einem ImageView in Android
-
25-10-2019 - |
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:
- Ich bekomme seltsame (x, y) Werte
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; } });
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