2016-03-21 3 views
0

Ich arbeite an einer Kamera-App, die vier Kreise in der Mitte des Bildschirms hat.Android-Koordinaten von locationonsreen passen nicht zum aktuellen Bildschirm

Es sieht so aus;

enter image description here

Mein Ziel ist nur die Bilder auf dem Mittelkreis Teile zu bekommen.

Meine Testtaktiken waren so;

  1. eine Vollbild-Kamera mit Overlay implementieren (done, erfolgreich)
  2. das aufgenommene Foto von 1 bekommen, und es auf einem Image Anzeige (done, erfolgreich)

  3. die Leinwand verwenden zu zeichnen ein blauer Kreis auf der Position der Overlay-Kreise. (gescheitert)

der blaue Kreis gezeichnet wird, aber in einigen seltsamen Orten.

Hier ist mein Code.

 //x, y = x, y coord of the left-top circle of the overlay. 
     //width = width of the left-top circle of the overlay. 

     Paint paint = new Paint(); 
     paint.setAntiAlias(true); 
     paint.setColor(Color.BLUE); 

     Canvas canvas = new Canvas(b); 
     canvas.drawCircle(x, y, width/2, paint); 


     imageView.setImageBitmap(b); 

Der Kreis ist gezeichnet, aber an einem wirklich weit entfernten Ort; fast unter dem unteren Bildschirmrand.

Und der Radius ist fast doppelt so groß wie ich erwartet hatte.

Ich versuchte canvas.drawCircle (x + width/2, y + height/2, ...), aber es scheint nicht die Antwort zu sein.

Ich habe die folgenden Codes verwendet, um die x, y, Breite zu erhalten.

int [] loc = new int[2]; 
circle1.locationOnScreen(loc); 
int x = loc[0]; 
int y = loc[1]; 
int width = circle1.getWidth(); 

Ist etwas falsch mit meinem Code? Die x, y, width Werte sind nicht 0, sie haben aussagekräftige Werte. Aber es stimmt einfach nicht mit dem, wo die Kreise sein müssen.

Antwort

1

DrawCircle Positionen sind relativ zu Ihrer Bitmap. Wenn das ImageView, das Sie verwenden, nicht Vollbild ist, dann werden Ihre x und y falsch sein, da sie in Bildschirmkoordinaten sind. Und mit Vollbild meine ich keine Statusleiste, nicht nur den Bildschirm darunter.

+0

Es hat keine Aktionsleisten. Ich habe es mit dem Thema Wert deaktiviert. Die Bildansicht ist im Vollbildmodus. Aber wenn es auf 1/4 herunterskaliert wird, wird es auf der Höhe etwas kleiner, also habe ich die fitxy-Skalierung von imageView verwendet, um perfekt auf den Bildschirm zu passen. – March3April4

0

Eigentlich hatte Gabe recht damit.

Mir fehlte das ganze Konzept, dass die Koordinate des Bildschirms selbst und die Koordinate der Bitmap unterschiedlich ist.

Ich löste es mit sehr einfachen Mathematik.

Bitmap Gesamtbreite:? = Bildschirmgesamtbreite: x (x Koordinate des Kreises1)

? = Bitmap-Gesamtbreite * x/Bildschirmgesamtbreite

gleich dem y, Breite und Höhe.

Also, mit diesen oben genannten Werten wird der Code, der einen Kreis zeichnet, so aussehen.

canvas.drawCircle(x + width/2, y + height/2 - statusBarHeight, width /4, paint); 

Die statusBarHeight ist die Höhe der oberen Statusleiste auf dem Bildschirm.

Da die Bitmap es ist kein Statusleiste enthalten, da ein Foto gemacht, sollte es von der y-Punkt des Kreises abgezogen werden.