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

java android google-maps android-canvas

93527 просмотра

8 ответа

Поэтому я рисую этот треугольник на картах Android, используя код ниже в моем методе рисования:

paint.setARGB(255, 153, 29, 29);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setAntiAlias(true);

Path path = new Path();
path.moveTo(point1_returned.x, point1_returned.y);
path.lineTo(point2_returned.x, point2_returned.y);
path.moveTo(point2_returned.x, point2_returned.y);
path.lineTo(point3_returned.x, point3_returned.y);
path.moveTo(point3_returned.x, point3_returned.y);
path.lineTo(point1_returned.x, point1_returned.y);
path.close();

canvas.drawPath(path, paint);

PointX_returned - это координаты, которые я получаю из полей. Они в основном широты и долготы. В результате получается красивый треугольник, но инсайдер пуст, и поэтому я могу видеть карту. Есть ли способ как-нибудь его заполнить?

Автор: Pavel Источник Размещён: 12.11.2019 09:15

Ответы (8)


40 плюса

Решение

Вам, вероятно, нужно сделать что-то вроде:

Paint red = new Paint();

red.setColor(android.graphics.Color.RED);
red.setStyle(Paint.Style.FILL);

И используйте этот цвет для вашего пути, вместо вашего ARGB. Убедитесь, что последняя точка вашего пути заканчивается первой, это также имеет смысл.

Подскажите пожалуйста работает ли он!

Автор: Nicolas C. Размещён: 17.08.2010 09:50

74 плюса

Хорошо, я сделал это. Я делюсь этим кодом на случай, если кому-то еще понадобится:

super.draw(canvas, mapView, true);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setStrokeWidth(2);
paint.setColor(android.graphics.Color.RED);     
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setAntiAlias(true);

Point point1_draw = new Point();        
Point point2_draw = new Point();    
Point point3_draw = new Point();

mapView.getProjection().toPixels(point1, point1_draw);
mapView.getProjection().toPixels(point2, point2_draw);
mapView.getProjection().toPixels(point3, point3_draw);

Path path = new Path();
path.setFillType(Path.FillType.EVEN_ODD);
path.moveTo(point1_draw.x,point1_draw.y);
path.lineTo(point2_draw.x,point2_draw.y);
path.lineTo(point3_draw.x,point3_draw.y);
path.lineTo(point1_draw.x,point1_draw.y);
path.close();

canvas.drawPath(path, paint);

//canvas.drawLine(point1_draw.x,point1_draw.y,point2_draw.x,point2_draw.y, paint);

return true;

Спасибо за подсказку Николас!

Автор: Pavel Размещён: 17.08.2010 10:58

11 плюса

Вы также можете использовать вершины:

private static final int verticesColors[] = {
    Color.LTGRAY, Color.LTGRAY, Color.LTGRAY, 0xFF000000, 0xFF000000, 0xFF000000
};
float verts[] = {
    point1.x, point1.y, point2.x, point2.y, point3.x, point3.y
};
canvas.drawVertices(Canvas.VertexMode.TRIANGLES, verts.length, verts, 0, null, 0, verticesColors,   0, null, 0, 0, new Paint());
Автор: GBouerat Размещён: 18.08.2010 07:51

8 плюса

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

эта функция показывает, как создать треугольник из растрового изображения. То есть создайте обрезанное изображение треугольной формы. Попробуйте код ниже или скачайте демонстрационный пример

 public static Bitmap getTriangleBitmap(Bitmap bitmap, int radius) {
        Bitmap finalBitmap;
        if (bitmap.getWidth() != radius || bitmap.getHeight() != radius)
            finalBitmap = Bitmap.createScaledBitmap(bitmap, radius, radius,
                    false);
        else
            finalBitmap = bitmap;
        Bitmap output = Bitmap.createBitmap(finalBitmap.getWidth(),
                finalBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, finalBitmap.getWidth(),
                finalBitmap.getHeight());

        Point point1_draw = new Point(75, 0);
        Point point2_draw = new Point(0, 180);
        Point point3_draw = new Point(180, 180);

        Path path = new Path();
        path.moveTo(point1_draw.x, point1_draw.y);
        path.lineTo(point2_draw.x, point2_draw.y);
        path.lineTo(point3_draw.x, point3_draw.y);
        path.lineTo(point1_draw.x, point1_draw.y);
        path.close();
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(Color.parseColor("#BAB399"));
        canvas.drawPath(path, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(finalBitmap, rect, rect, paint);

        return output;
    }

Функция выше возвращает треугольное изображение, нарисованное на холсте. Читать далее

Автор: Daniel Nyamasyo Размещён: 01.01.2017 10:52

6 плюса

Используя ответ @ Pavel в качестве руководства, вот вспомогательный метод, если у вас нет точек, но есть начальные x, y, высота и ширина. Также можно нарисовать перевернутый / перевернутый - это полезно для меня, так как оно использовалось как конец вертикальной диаграммы.

 private void drawTriangle(int x, int y, int width, int height, boolean inverted, Paint paint, Canvas canvas){

        Point p1 = new Point(x,y);
        int pointX = x + width/2;
        int pointY = inverted?  y + height : y - height;

        Point p2 = new Point(pointX,pointY);
        Point p3 = new Point(x+width,y);


        Path path = new Path();
        path.setFillType(Path.FillType.EVEN_ODD);
        path.moveTo(p1.x,p1.y);
        path.lineTo(p2.x,p2.y);
        path.lineTo(p3.x,p3.y);
        path.close();

        canvas.drawPath(path, paint);
    }
Автор: scottyab Размещён: 08.03.2016 05:06

4 плюса

private void drawArrows(Point[] point, Canvas canvas, Paint paint) {

    float [] points  = new float[8];             
    points[0] = point[0].x;      
    points[1] = point[0].y;      
    points[2] = point[1].x;      
    points[3] = point[1].y;         
    points[4] = point[2].x;      
    points[5] = point[2].y;              
    points[6] = point[0].x;      
    points[7] = point[0].y;

    canvas.drawVertices(VertexMode.TRIANGLES, 8, points, 0, null, 0, null, 0, null, 0, 0, paint);
    Path path = new Path();
    path.moveTo(point[0].x , point[0].y);
    path.lineTo(point[1].x,point[1].y);
    path.lineTo(point[2].x,point[2].y);
    canvas.drawPath(path,paint);

}
Автор: Faakhir Размещён: 08.05.2012 11:06

3 плюса

Вам нужно удалить path.moveTo после первого инициала.

Path path = new Path();
path.moveTo(point1_returned.x, point1_returned.y);
path.lineTo(point2_returned.x, point2_returned.y);
path.lineTo(point3_returned.x, point3_returned.y);
path.lineTo(point1_returned.x, point1_returned.y);
path.close();
Автор: kaftanati Размещён: 01.12.2014 03:45

2 плюса

Не moveTo()после каждогоlineTo()

Другими словами, удалите все, moveTo()кроме первого.

Серьезно, если я просто копирую и вставляю код OP и удаляю ненужные moveTo()вызовы, это работает.

Больше ничего не нужно делать.


РЕДАКТИРОВАТЬ: Я знаю, что ОП уже опубликовал свое «окончательное рабочее решение», но он не сказал, почему это работает. Фактическая причина была довольно удивительной для меня, поэтому я почувствовал необходимость добавить ответ.

Автор: oli.G Размещён: 14.07.2017 12:29
Вопросы из категории :
32x32