web-dev-qa-db-fra.com

Comment dessiner un triangle rempli sur Android Canvas

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:

enter image description here

17
Egis

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);
}
22
Egis

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 

1
Joe Maher
0
Yogendra

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.

0
Bismeet Singh