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:
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);
}
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
Ich möchte darauf hinweisen, dass Sie niemals ein Objekt von onDraw () initialisieren sollten, da es mehrfach aufgerufen wird und zu Leistungsproblemen führt.