Wie zeichne gefüllte Polygon in Android?Wie zeichne gefüllte Polygon?
Antwort
Sie müssen die Farbe Objekt auf Aufhellblitz
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
Dann können Sie zeichnen, was Sie wollen, und es wird gefüllt werden.
canvas.drawCircle(20, 20, 15, paint);
canvas.drawRectangle(60, 20, 15, paint);
usw.
Für komplexere Formen benötigen Sie den PATH object verwenden.
Android hat keine handliche drawPolygon(x_array, y_array, numberofpoints)
Aktion wie Java. Sie müssen durch ein Path
Objekt Punkt für Punkt gehen. Zum Beispiel kann eine gefüllte Trapezform für eine 3D-Verlies Wand zu machen, können Sie alle Ihre Punkte in x- und y-Arrays setzen könnten dann Code wie folgt:
Paint wallpaint = new Paint();
wallpaint.setColor(Color.GRAY);
wallpaint.setStyle(Style.FILL);
Path wallpath = new Path();
wallpath.reset(); // only needed when reusing this path for a new build
wallpath.moveTo(x[0], y[0]); // used for first point
wallpath.lineTo(x[1], y[1]);
wallpath.lineTo(x[2], y[2]);
wallpath.lineTo(x[3], y[3]);
wallpath.lineTo(x[0], y[0]); // there is a setLastPoint action but i found it not to work as expected
canvas.drawPath(wallpath, wallpaint);
Um eine konstante linearen Gradienten für einige Tiefen hinzufügen, könnten Sie Code wie folgt. Hinweis y [0] wird zweimal verwendet, um die Steigung zu halten horizontal:
wallPaint.reset(); // precaution when resusing Paint object, here shader replaces solid GRAY anyway
wallPaint.setShader(new LinearGradient(x[0], y[0], x[1], y[0], Color.GRAY, Color.DKGRAY,TileMode.CLAMP));
canvas.drawPath(wallpath, wallpaint);
Siehe Paint, Path und Canvas Dokumentation für weitere Optionen, wie Array definiert Gradienten, Hinzufügen Bögen und ein Bitmap über den Polygon zu legen.
BTW - Ich habe festgestellt, dass alle moveTo-Befehle innerhalb des Pfads bedeuten, dass die Form nicht gefüllt ist, sobald Sie mit dem Erstellen des Pfads begonnen haben.
Es macht Sinn, wenn Sie darüber nachdenken, dass Android/Java die Form ungefüllt lassen würde, da das moveTo eine Unterbrechung im Polygon darstellen würde.
Allerdings habe ich einige Tutorials wie diese How to draw a filled triangle in android canvas?
gesehen, die moveTo die nach jedem lineTo haben. Obwohl dies zu einem ununterbrochenen Polygon führen kann, geht Android davon aus, dass ein moveTo eine Unterbrechung im Polygon darstellt.
ich es in drei Schritten zu tun ...
1. Schritt eine spitz zulauf Klasse erstellen ;-)
/**
* Simple point
*/
private class Point {
public float x = 0;
public float y = 0;
public Point(float x, float y) {
this.x = x;
this.y = y;
}
}
Schritt 2. Fügen Sie eine Methode/Funktion zum Zeichnen
/**
* Draw polygon
*
* @param canvas The canvas to draw on
* @param color Integer representing a fill color (see http://developer.android.com/reference/android/graphics/Color.html)
* @param points Polygon corner points
*/
private void drawPoly(Canvas canvas, int color, Point[] points) {
// line at minimum...
if (points.length < 2) {
return;
}
// paint
Paint polyPaint = new Paint();
polyPaint.setColor(color);
polyPaint.setStyle(Style.FILL);
// path
Path polyPath = new Path();
polyPath.moveTo(points[0].x, points[0].y);
int i, len;
len = points.length;
for (i = 0; i < len; i++) {
polyPath.lineTo(points[i].x, points[i].y);
}
polyPath.lineTo(points[0].x, points[0].y);
// draw
canvas.drawPath(polyPath, polyPaint);
}
Schritt 3. zeichnen
drawPoly(canvas, 0xFF5555ee,
new Point[]{
new Point(10, 10),
new Point(15, 10),
new Point(15, 20)
});
Ja, Sie könnten es wahrscheinlich effizienter machen, aber wahrscheinlich nicht viel lesbarer :-).
Dieser Code hat einige schwerwiegende Probleme: erstens gibt es bereits zwei "Point" - und "PointF" -Klassen in Android, so dass Sie Ihre eigenen nicht wirklich neu erfinden müssen. Zweitens möchten Sie wirklich vermeiden, Objekte in Ihren View.draw() -Methoden zuzuordnen, und das von Ihnen bereitgestellte Beispiel tut viele Zuweisungen für eine einzelne Zeichnung. – ralfoide
Das hängt davon ab, wie viele Rechtecke Sie zeichnen möchten. Aber ich stimme zu, dass dies nicht der effizienteste Weg ist. Effizient zu sein, bedeutet normalerweise, den Code weniger nutzbar oder lesbar zu machen oder beides. – Nux
Alte Frage, aber ein Trick für jeden, der das findet. Wenn Sie eine Schriftart mit dem gewünschten Polygon als Glyphe einfügen, können Sie mit der Funktion drawText Ihr Polygon zeichnen.
Der Nachteil ist, dass Sie im Voraus wissen müssen, welche Formen Sie benötigen.Die Oberseite ist es, wenn Sie im Voraus wissen, dass Sie eine schöne Formbibliothek einschließen können. Dieser Code setzt voraus, dass Sie in Ihrem Ordner "Assets/Schriftarten" Ihres Projekts eine Schriftart mit dem Namen shapes haben.
TypeFace shapesTypeFace = Typeface.createFromAsset(getAssets(), "fonts/shapes.ttf");
Paint stopSignPaint = new Paint();
stopSignPaint.setColor(Color.RED);
//set anti-aliasing so it looks nice
stopSignPaint.setAntiAlias(true);
stopSignPaint.setTextSize(200);
stopSignPaint.setTypeface(shapesTypeFace);
//will show up as a box or question mark since
//the current display font doesn't have this glyph.
//open the shapes font in a tool like Character Map
//to copy and paste the glyph into your IDE
//saving it as a variable makes it much easier to work with
String hexagonGlyph = ""
String triangleGlyph = ""
....whatever code you got...
//arguments: text, x coordinate, y coordinate, paint
canvas.drawText(hexagonGlyph, 200, 100, stopSignPaint);
//make it into a go sign
stopSignPaint.setColor(Color.Green);
canvas.drawText(hexagonGlyph, 200, 100, stopSignPaint);
//make a tiny one
stopSignPaint.setTextSize(20);
stopSignPaint.setColor(Color.RED);
canvas.drawText(hexagonGlyph, 200, 100, stopSignPaint);
//make a triangle
canvas.drawText(triangleGlyph, 200, 100, stopSignPaint);
Draw Polygon mit x Seiten und benutzerdefinierte Radius:
private void drawPolygon(Canvas mCanvas, float x, float y, float radius, float sides, float startAngle, boolean anticlockwise, Paint paint) {
if (sides < 3) { return; }
float a = ((float) Math.PI *2)/sides * (anticlockwise ? -1 : 1);
mCanvas.save();
mCanvas.translate(x, y);
mCanvas.rotate(startAngle);
Path path = new Path();
path.moveTo(radius, 0);
for(int i = 1; i < sides; i++) {
path.lineTo(radius * (float) Math.cos(a * i), radius * (float) Math.sin(a * i));
}
path.close();
mCanvas.drawPath(path, paint);
mCanvas.restore();
}
die Sie interessieren, oder see the full demo
Paint paint = new Paint();
paint.setColor(Color.parseColor("#BAB399"));
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
- 1. iOS Zeichne gefüllte Kreise
- 2. Wie zeichne gefüllte Dreieck auf Android Canvas
- 3. R: Zeichne ein Polygon mit bedingter Farbe
- 4. LIBGDX: Wie zeichne ich ein gefülltes Polygon mit dem Shaprenderer?
- 5. offene Ebenen 3 Wie zeichne ein Polygon programmatisch?
- 6. OpenLayers - Wie zeichne ich ein Polygon aus bestehenden lonLat-Punkten?
- 7. Wie zeichne ich ein Polygon um eine Polylinie in JavaScript?
- 8. Android OpenGL ES - Wie zeichne ein gefülltes konkaves Polygon?
- 9. Wie zeichne ich ein Polygon nur auf bestimmte Pixelfarben?
- 10. XFA fehlen gefüllte Felder?
- 11. Zeichne einen gefüllten Halbkreis
- 12. Gefüllte Polygone in Python plotten
- 13. Zeichnen Rechteck und Polygon in Squsih
- 14. Löcher in einem Polygon
- 15. Wie zeichne ich effizienter?
- 16. Wie zeichne Hypergraphen?
- 17. Wie zeichne das Spinnennetz
- 18. Google Maps API mit Polygon
- 19. Gnuplot Gestapelte gefüllte Kurven aus verschiedenen Indizes
- 20. Polygon-Triangulation
- 21. UWP, MySQL, gefüllte ListView, implementieren CRUD-Operationen
- 22. Automatisch gefüllte Eingabe nicht eingelesen Shiny
- 23. Zeichnung mehrere gefüllte Bögen in Oval
- 24. Anti-Aliasing gefüllte Formen in libgdx
- 25. CListCtrl Zeigt CListCtrl nur gefüllte Zeilen an?
- 26. Wie behandelt man Warnungen über Tail-gefüllte Arrays in C++?
- 27. Wie bekomme ich 0-gefüllte Binärdarstellung einer Ganzzahl in Java?
- 28. Wie gefüllte Eingabe in Laravel zu überprüfen 5.1
- 29. wie Put setzen dynamisch gefüllte Zahl in Eingabewert Feld
- 30. Wie wähle ich nur gefüllte Datensätze aus der Datenbank aus?
Anstelle der Verwendung von 'Path.lineTo (x0, y0)' Sie kann einfach 'Path.close()' aufrufen, um das schließende Liniensegment automatisch hinzuzufügen. – ralfoide