Viewクラスを拡張するMyViewクラスがあります。 MyViewは塗りつぶされた三角形を描画する必要があります。三角形を描きましたが、塗りつぶすことができません。これは私の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);
}
これは私が結果として得るものです:
答えを見つけた
@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);
}
この回答は、@ Egisによって回答で与えられた数字がどこから来たのかを少し明確にします。 (これは逆正三角形を描き、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
}
}
高さの取得関数は ピタゴラスの定理 であり、常に正三角形の高さがその辺の長さの〜87%であることがわかります
Gist はここにあります。反対方向のコードが含まれています
オブジェクトが複数回呼び出されてパフォーマンスの問題が発生するため、onDraw()からオブジェクトを初期化しないでください。