Leinwand " drawLine und drawRect nicht einschließlich end-position?
Zu meiner überraschung habe ich gerade entdeckt, dass drawLine und drawRect beinhalten nicht die Endposition, D. H.:
canvas.drawLine(100, 100, 100, 100, paint);
oder
RectF rect = new RectF(100, 100, 100, 100);
canvas.drawRect(rect, paint);
nicht alles zeichnen.
Mein Lack ist wie folgt definiert:
Paint paint = new Paint();
paint.setAntiAlias(false);
paint.setStyle(Paint.Style.FILL);
return paint;
Habe ich versucht, die Definition meiner Farbe, wie FILL_AND_STROKE, aber es würde nicht helfen.
Android drawPaint() javadoc nicht einmal eine Liste der stopX und stopY params!
So, wenn ich will zeichnen Sie eine vertikale Linie, die geht genau von beginY zu endY (inklusive), habe ich Folgendes zu tun:
canvas.drawLine(constX, beginY, constX, endY + 1)
Merke, dass ich nicht fügen Sie 1, um das Ende der X-position, nur das Ende Y (xstays das gleiche wie, ich möchte eine vertikale Linie).
Mein Gerät ist HTC SENSE.
Edit: Simon, du hast Recht, anstatt eine Frage zu stellen ich habe einfach versucht, zu teilen, meinem Gefühl der überraschung, dass Android nicht das tun, was seine docs sagen, in einer so grundlegenden Fall als basic-Zeichnung, und stellen Sie sicher, dass ich das nicht machen dumme Fehler, die auf meinem Weg.
Mich klarer: drawRect die javadoc sagt:
public void drawRect (float left, float top, float right, float bottom, Paint Paint)
Zeichnen das angegebene Rechteck mit der angegebenen Farbe. Das Rechteck wird gefüllt oder umrahmt auf der Grundlage der Stil in der Farbe.
Links - auf Der linken Seite des Rechtecks gezeichnet werden
top - Die Obere Seite des Rechtecks gezeichnet werden
rechts - auf Der rechten Seite des Rechtecks gezeichnet werden
unten Die untere Seite des Rechtecks gezeichnet werden
malen - Das malen, zeichnen rect
So, beim schreiben
canvas.drawRect(x1, y1, x2, y2)
Erwarten Sie ein Rechteck, dessen Ecken in (x1, y1); (x1, y2); (x2, y1) und (x2, y2).
Android sagt: falsch! Sie werden zu (x1, y1); (x1, y2-1); (x2-1, y1) und (x2-1, y2-1).
Für die die neugierig sind: legen Sie die Leinwand clipping:
canvas.clipRect(x1, y1, x2, y2)
Dann versuchen zu zeichnen, einen Punkt:
canvas.drawPoint(x1, y1, paint);
und bekommen Sie einen Punkt auf dem Bildschirm.
Dann versuchen, in die gegenüberliegende Ecke:
canvas.drawPoint(x2, y2, paint);
nichts angezeigt. nichts wird angezeigt, die restlichen 2 Ecken sowie:
canvas.drawPoint(x1, y2, paint);
canvas.drawPoint(x2, y2, paint);
Immer noch nicht verwunderlich, dass Sie die Leute?
So die Schlussfolgerung ist, dass Android behandelt Recht und unten Koordinaten als exklusiv, was bedeutet, dass z.B. beim schreiben:
canvas.clipRect(x1, y1, x2, y2)
Erhalten Sie die clipping-Grenzen (x1, y1, x2 - 1, y2 - 1). Das gleiche geht mit jeder Methode, die Recht und unten Koordinaten oder Rect/RectF Objekte.
- Gibt es eine Frage hier? Wenn Sie möchten, zeichnen Sie einen einzelnen Punkt, dann verwenden: developer.android.com/reference/android/graphics/...
- Dies ist nicht eine Frage, aber ich bin froh, dass es hier. Mir erspart, dabei zu Experimentieren, um herauszufinden, die Antwort auf diese Frage: stackoverflow.com/questions/3063892/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage zeigt sich eine Inkonsistenz in der drawing-API von Android. Sie sagen
Ist der Satz in Klammern ist meiner Meinung nach der Schlüssel zum verstehen der Natur der Inkonsistenz:
Sie können auch hinzufügen, 1 auf das Ende X-position (oder sogar an den Anfang der X-position!), und würde man genau die pixel-Weise identische Linie. Warum ist das so? Da der zugrunde liegende Algorithmus zur Transformation von Android ist "Links pixel - /rechts-pixel-out"-Konzept auf die "start-und end-pixel-in"-Konzept ist wie folgt (gezeigt nur für x, für y ist es das gleiche):
Das Ergebnis dieser (meiner Meinung nach sub-optimalen) Umwandlung ist, dass die Linie
ist genau parallel zu
Ich denke, jeder würde erwarten, dass eine Art von umgekehrten V, der seit Ende Punkte getrennt sind durch mindestens 1 pixel (Abstand von zwei Pixeln) und die Startpunkte sind identisch.
Aber getestet auf verschiedenen Geräten und Android-Versionen, die 1. perfekt vertikale Linie in pixel, Spalte 149 und der 2. Spalte 150.
BTW: Die richtige transformation zu verwenden die "start-und end-pixel-in"-Konzept ist:
Ihre Frage ist im wesentlichen die Antwort für diese. Danke.
Ich, für einen, bin nicht überrascht und würde nicht wollen, es auf andere Weise. Ist hier, warum:
Ist es im Einklang mit
java.awt
,javax.swing
und andere APIs, sowie Kern-Java-Methoden wieString.substring(int, int)
undList<?>.get(int)
.Es ist kompatibel mit
android.graphics.RectF
, die kümmert sich nicht um Pixel—wie können Sie nur einen Bruchteil eines pixels?Die API ist bequem:
Für ein 40×30 Rechteck, instanziieren
Rect(0, 0, 40, 30)
Rect.right - Rect.left == Rect.width()
Die Mathematik und geometrie sind leichter auf diese Weise. Zum Beispiel, wenn Sie möchten, zeichnen Sie ein Rechteck mittig innerhalb der Leinwand:
Die API ist Recht; in der API-Dokumentation, leider nur fehlt detail.
(Eigentlich ist es erwähnt in die Details für das
Rect.contains(int, int)
Methode. Es ist bedauerlich, dass Google lassen Sie die API aus der Tür, ohne das Feld Variablen selbst dokumentiert, jedoch.)java.awt.Graphics.drawRect()
nimmt eine Breite und Höhe ein argument, das passt zu meinem Punkt oben, über die Mathematik. Es wäre vielleicht besser für Android, es zu tun das auch so. Und wir müssen Zustimmen, uneinig darüber, ob die Konsistenz mitString
undList
relevant sind; ich würd ehrlich gesagt finden der Android-Plattform einfacher, mit zu arbeiten, wenn es nicht so viele Ungereimtheiten.wenn Ihr hintergrund ist schwarz ,fügen Sie eine Anweisung
paint.setColor(Color.RED);
und auch Sie hatte pass
RectF rect = new RectF(100, 100, 100, 100);
alle Punkte sind gleich , versuchen
RectF rect = new RectF(100, 100, 200, 200);
ODER für line
canvas.drawLine(10, 10, 10, 10 + 15, paint);
Ihre rect arbeiten sollten, Flossen, versuchen Sie einige Hintergrundinformationen, Ihre Leitung ist jetzt kust ein pixel, die beiden letzten parameter ist nicht die Länge, die das Ende posision.