2010-01-12 27 views

Respuesta

40

Es necesario configurar el objeto de pintura para rellenar

Paint paint = new Paint(); 
paint.setStyle(Paint.Style.FILL); 

A continuación, se puede dibujar lo que quieran, y se llenará.

canvas.drawCircle(20, 20, 15, paint); 
canvas.drawRectangle(60, 20, 15, paint); 

etc.

Para formas más complejas es necesario utilizar el PATH object.

93

Android no tiene una acción práctica drawPolygon(x_array, y_array, numberofpoints) como Java. Tienes que caminar haciendo un objeto Path punto por punto. Por ejemplo, para hacer una forma trapezoidal lleno de una pared mazmorra 3D, se podría poner todos los puntos en x e y matrices luego el código de la siguiente manera:

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

Para añadir un gradiente lineal constante de cierta profundidad, que podía código de la siguiente manera. Nota Y [0] se utiliza dos veces para mantener el gradiente 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); 

Consulte Paint, Path y Canvas documentación para más opciones, tales como gradientes de matriz definido, añadiendo arcos, y por la que un mapa de bits sobre el polígono.

+10

En lugar de utilizar 'Path.lineTo (x0, y0)' se simplemente puede llamar a 'Path.close()' para agregar automáticamente el segmento de línea de cierre. – ralfoide

2

BTW - Descubrí que una vez que comienzas a crear tu ruta, cualquier comando moveTo dentro de la ruta significa que la forma no se ha rellenado.

Tiene sentido cuando lo piense, que Android/Java dejaría la forma sin llenar, ya que el moveTo representaría una ruptura en el polígono.

Sin embargo he visto algunos tutoriales como este How to draw a filled triangle in android canvas?

que tienen de moveTo después de cada lineTo. Aunque esto puede dar como resultado un polígono intacto, Android supone que un movimiento representa una ruptura en el polígono.

11

me gusta hacerlo en tres pasos ...

Paso 1. Crear una clase puntiaguda ;-)

/** 
* 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; 
    } 
} 

Paso 2. Añadir un método/función para dibujar

/** 
* 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); 
} 

Paso 3. Dibujar

drawPoly(canvas, 0xFF5555ee, 
      new Point[]{ 
       new Point(10, 10), 
       new Point(15, 10), 
       new Point(15, 20) 
      }); 

Sí, probablemente podría hacerlo de manera más eficiente, pero probablemente no mucho más fácil de leer :-).

+7

Este código tiene algunos problemas graves: primero, ya hay dos clases 'Point' y' PointF' en Android, por lo que realmente no necesita reinventar la suya. En segundo lugar, realmente desea evitar la asignación de objetos en sus métodos View.draw() y la muestra que proporcionó hace toneladas de asignaciones para un solo sorteo. – ralfoide

+0

Eso depende de cuántos rectángulos quieras dibujar. Pero estoy de acuerdo en que esta no es la forma más eficiente de hacerlo. Pero ser eficiente generalmente significa hacer que el código sea menos útil o legible, o ambos. – Nux

1

Pregunta anterior, pero es un truco para cualquiera que encuentre esto. Si incluye una fuente con el polígono deseado como un glifo, puede usar la función dibujar texto para dibujar su polígono.

El inconveniente es que debe saber de antemano qué formas necesitará.Lo bueno es que si sabes de antemano, puedes incluir una buena biblioteca de formas. Este código supone que tiene una fuente llamada formas en su carpeta de recursos/fuentes de su proyecto.

  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

Dibujar polígono con lados X y radio personalizada:

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

probar esto, o see the full demo

Paint paint = new Paint(); 
    paint.setColor(Color.parseColor("#BAB399")); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
Cuestiones relacionadas