Cómo dibujar triángulo lleno en el lienzo android
Tengo la clase MyView que extiende la clase de la visión. MyView debe dibujar triángulo lleno. Dibujé un triángulo pero no puedo llenarlo. Este es mi método onDraw ():
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(android.graphics.Color.BLACK); canvas.drawPaint(paint); paint.setStrokeWidth(4); paint.setColor(android.graphics.Color.RED); paint.setStyle(Paint.Style.FILL_AND_STROKE); paint.setAntiAlias(true); Point a = new Point(0, 0); Point b = new Point(0, 100); Point c = new Point(87, 50); Path path = new Path(); path.setFillType(FillType.EVEN_ODD); path.moveTo(ax, ay); path.lineTo(bx, by); path.moveTo(bx, by); path.lineTo(cx, cy); path.moveTo(cx, cy); path.lineTo(ax, ay); path.close(); canvas.drawPath(path, paint); }
Esto es lo que obtengo como resultado:
- Android: ¿Cómo puedo utilizar la capa de lista y los elementos de forma para dibujar una regla horizontal cuando se establece como fondo?
- Cambiar el color sólido de la forma en el tiempo de ejecución dentro del xml Drawable usado como fondo
- Dibujar la forma de Android xml diagonal con triángulos
- Android - cómo definir ShapeDrawables mediante programación?
- ¿Cómo enviar datos multipart / form a un servidor web desde android?
- Cómo enmascarar una región simple al pintar en Android?
- Atributo size ignorado en la lista de capas
- ¿Cómo agrego el relleno a un mapa de bits y un color en una lista de capas
- forma androide con un fondo repetido
- Cómo obtener la forma redonda en Android
- Android - Drawable repetir forma para crear patrón
- Necesito cambiar el color del trazo a un color definido por el usuario. Nada que ver con el estado
- ¿Cómo inserto texto dentro de un rectángulo redondeado en la vista de Android?
He encontrado la respuesta
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(android.graphics.Color.BLACK); canvas.drawPaint(paint); paint.setStrokeWidth(4); paint.setColor(android.graphics.Color.RED); paint.setStyle(Paint.Style.FILL_AND_STROKE); paint.setAntiAlias(true); Point a = new Point(0, 0); Point b = new Point(0, 100); Point c = new Point(87, 50); Path path = new Path(); path.setFillType(FillType.EVEN_ODD); path.lineTo(bx, by); path.lineTo(cx, cy); path.lineTo(ax, ay); path.close(); canvas.drawPath(path, paint); }
Es probable que necesite hacer algo como:
Paint red = new Paint(); red.setColor(android.graphics.Color.RED); red.setStyle(Paint.Style.FILL);
Estos enlaces son muy útiles.
Me gustaría señalar que nunca se debe inicializar un objeto de onDraw (), ya que se llama varias veces y conduce a problemas de rendimiento.
Esta respuesta proporciona un poco de claridad sobre dónde vienen los números dados en la respuesta por @Egis. (Esto dibujará un triángulo equilátero al revés y se escribe en kotlin)
class TriangleView(context: Context?, attrs: AttributeSet?) : View(context, attrs) { val paint = Paint() val path = Path() override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) canvas ?: return canvas.drawPath(configurePath(canvas.width.toFloat(), path), configurePaint(paint)) } fun getHeight(width: Double): Float { return Math.sqrt((Math.pow(width, 2.0) - Math.pow((width / 2), 2.0))).toFloat() } fun configurePaint(paint: Paint): Paint { paint.color = android.graphics.Color.WHITE paint.isAntiAlias = true return paint } fun configurePath(width: Float, path: Path): Path { path.lineTo((width / 2f), getHeight(width.toDouble())) path.lineTo(width, 0F) path.lineTo(0f, 0f) return path } }
La función get height es el teorema de Pitágoras y siempre encontrará que la altura de un triángulo equilátero es ~ 87% de su longitud lateral
Gist se puede encontrar aquí, contiene código para la otra dirección
- Inicio de NFC cuando la pantalla está bloqueada en Android
- Por qué no es posible reproducir un archivo de audio en una llamada de voz en android