wake-up-neo.net

So zeichnen Sie ein gefülltes Dreieck auf Android Canvas

Ich habe die Klasse MyView, die die View-Klasse erweitert. MyView sollte ein gefülltes Dreieck zeichnen. Ich habe ein Dreieck gezeichnet, aber ich kann es nicht füllen. Dies ist meine onDraw () -Methode:

@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);
}

Das bekomme ich als Ergebnis:

enter image description here

17
Egis

Ich habe die Antwort gefunden

@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

Diese Antwort gibt ein wenig Klarheit darüber, woher die in der Antwort von @Egis angegebenen Zahlen kommen. (Dies wird ein auf dem Kopf stehendes gleichseitiges Dreieck zeichnen und ist in Kotlin geschrieben.)

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
    }
}

Die Funktion get height ist Pythagoras 'Theorem und wird die Höhe eines gleichseitigen Dreiecks immer mit ~ 87% der Seitenlänge ermitteln

Gist kann hier gefunden werden, es enthält Code für die andere Richtung 

1
Joe Maher
0
Yogendra

Ich möchte darauf hinweisen, dass Sie niemals ein Objekt von onDraw () initialisieren sollten, da es mehrfach aufgerufen wird und zu Leistungsproblemen führt.

0
Bismeet Singh