Как нарисовать заполненный треугольник на Android Canvas



У меня есть класс MyView, который расширяет класс View. Мой взгляд должен нарисовать заполненный треугольник. Я нарисовал треугольник, но не могу его заполнить. Это мой метод 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);
}


Вот что я получаю в результате:



Введите описание изображения здесь

868   4  

4 ответов:

Я нашел ответ

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

Я хотел бы отметить, что вы никогда не должны инициализировать объект из onDraw (), так как он вызывается несколько раз и приводит к проблемам с производительностью.

Этот ответ дает немного ясности о том, откуда берутся числа, приведенные в ответе @Egis. (это нарисует перевернутый равносторонний треугольник и написано на Котлине)

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

Функция get height является Теоремой Пифагора и всегда будет находить высоту равностороннего треугольника равной ~87% его длины стороны

Gist можно найти здесь, он содержит код для другого направления

Comments

    Ничего не найдено.