web-dev-qa-db-ja.com

塗りつぶされた三角形をAndroid Canvasに描画する方法

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

これは私が結果として得るものです:

enter image description here

20
Egis

答えを見つけた

@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

この回答は、@ 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 はここにあります。反対方向のコードが含まれています

1
Joe Maher
0
Yogendra

オブジェクトが複数回呼び出されてパフォーマンスの問題が発生するため、onDraw()からオブジェクトを初期化しないでください。

0
Bismeet Singh