¿Cómo dibujar un polígono lleno en Android?¿Cómo dibujar el polígono lleno?
Respuesta
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.
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.
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.
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 :-).
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
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
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);
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();
}
probar esto, o see the full demo
Paint paint = new Paint();
paint.setColor(Color.parseColor("#BAB399"));
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
- 1. dibujar un círculo lleno
- 2. WPF: cómo dibujar este polígono?
- 3. Cómo dibujar un círculo lleno en Java?
- 4. cómo dibujar un polígono transparente en openGL
- 5. PyPNG para dibujar un cuadro lleno simple
- 6. ¿Cómo dibujar un polígono en colores de píxeles específicos solamente?
- 7. Dibuja un semicírculo lleno
- 8. ¿Cómo puedo crear un polígono lleno a partir de datos de borde no ordenados en MATLAB?
- 9. OpenGL GLSL Shader: dibujar un círculo en un polígono plano
- 10. Dibujar bordes de un polígono con shaders de OpenGL
- 11. Cómo dibujar el polígono más grande a partir de un conjunto de puntos
- 12. ¿Cómo puedo dibujar un arco lleno de degradado, es decir, arcoíris?
- 13. Eliminar polígono del mapa
- 14. Cómo dibujar una forma borrosa?
- 15. El búfer SocketAsyncEventArgs está lleno de ceros
- 16. ¿Cómo lleno automáticamente campos en django?
- 17. ¿Cómo lidiar con escenarios de "disco lleno"?
- 18. C# Punto en el polígono
- 19. Cómo aplanar el formulario PDF ya lleno con iTextSharp
- 20. Dibuje un polígono que se interseca en el lienzo HTML
- 21. NSArray lleno de objetos bool
- 22. ¿Cómo escalo un polígono SVG en ems?
- 23. Polígono reutilizable
- 24. Google maps optimización de polígono
- 25. Transparencia de un trazo lleno en HTML5
- 26. Determine si se puede dibujar un polígono 2d con un solo ventilador de triángulo
- 27. Delaunay triangulando el polígono 2d con agujeros
- 28. Desalojo de Memcached cuando el caché está lleno al 40%
- 29. Detectando si el caché de un navegador está lleno
- 30. Segmento-polígono intersección
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