studio drawtextonpath customview custom control activity android android-canvas shape

customview - drawtextonpath android



Cómo dibujar triángulo relleno en Android Canvas (4)

Esta respuesta proporciona un poco de claridad sobre de dónde provienen los números dados en la respuesta de @Egis. (Esto dibujará un triángulo equilátero invertido y está escrito 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 de obtener la altura es el Teorema de Pitágoras y siempre encontrará que la altura de un triángulo equilátero es ~ 87% de su longitud de lado

Gist se puede encontrar aquí, contiene código para la otra dirección

Tengo clase MyView que extiende la clase de vista. MyView debe dibujar un triángulo relleno. 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(a.x, a.y); path.lineTo(b.x, b.y); path.moveTo(b.x, b.y); path.lineTo(c.x, c.y); path.moveTo(c.x, c.y); path.lineTo(a.x, a.y); path.close(); canvas.drawPath(path, paint); }

Esto es lo que obtengo como resultado:



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(b.x, b.y); path.lineTo(c.x, c.y); path.lineTo(a.x, a.y); path.close(); canvas.drawPath(path, paint); }


Me gustaría señalar que nunca debe iniciar un objeto desde onDraw (), ya que se le llama varias veces y provoca problemas de rendimiento.