J'ai la classe MyView qui étend la classe View. MyView doit dessiner un triangle rempli. J'ai dessiné un triangle mais je ne peux pas le remplir. Voici ma méthode 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);
}
C’est ce que j’obtiens à la suite:
J'ai trouvé la réponse
@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);
}
Cette réponse fournit un peu de clarté sur l’origine des chiffres donnés par @Egis dans la réponse. (cela va tracer un triangle équilatéral à l'envers et est écrit 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 fonction get height est le théorème de Pythagore et trouvera toujours la hauteur d'un triangle équilatéral égale à ~ 87% de la longueur de ses côtés
Gist peut être trouvé ici, il contient le code pour l'autre sens
Je tiens à souligner que vous ne devez jamais initialiser un objet à partir de onDraw () car il est appelé à plusieurs reprises et entraîne des problèmes de performances.