2010-01-12 12 views

Antwort

40

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.

93

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.

+10

Anstelle der Verwendung von 'Path.lineTo (x0, y0)' Sie kann einfach 'Path.close()' aufrufen, um das schließende Liniensegment automatisch hinzuzufügen. – ralfoide

2

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.

11

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 :-).

+7

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

+0

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

1

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); 
1

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(); 
} 
0

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)); 
Verwandte Themen