Helpex - Trao đổi & giúp đỡ Đăng nhập
79

Vì vậy, tôi đang vẽ tam giác này trong bản đồ Android bằng cách sử dụng mã dưới đây trong phương thức vẽ của mình:

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 là tọa độ mà tôi nhận được từ các trường. Chúng cơ bản là vĩ độ và kinh độ. Kết quả là một hình tam giác đẹp nhưng người trong cuộc trống rỗng và do đó tôi có thể nhìn thấy bản đồ. Có cách nào để lấp đầy nó bằng cách nào đó?

79 hữu ích 2 bình luận 92k xem chia sẻ
40

Bạn có thể cần phải làm một cái gì đó như:

Paint red = new Paint();

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

Và sử dụng màu này cho đường dẫn của bạn, thay vì ARGB của bạn. Hãy chắc chắn rằng điểm cuối cùng của con đường của bạn kết thúc ở điểm đầu tiên, nó cũng có ý nghĩa.

Hãy cho tôi biết nếu nó hoạt động!

40 hữu ích 2 bình luận chia sẻ
73

Ok tôi đã làm nó. Tôi đang chia sẻ mã này trong trường hợp người khác sẽ cần nó:

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;

Cảm ơn gợi ý Nicolas!

73 hữu ích 5 bình luận chia sẻ
11

bạn cũng có thể sử dụng đỉnh:

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());
11 hữu ích 2 bình luận chia sẻ
6

Làm thế nào để vẽ một hình tam giác đầy trong canvas android?

Hàm này hiển thị cách tạo tam giác từ bitmap. Đó là, tạo hình ảnh cắt hình tam giác. Hãy thử mã dưới đây hoặc tải xuống ví dụ demo

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

Hàm trên trả về một hình ảnh tam giác được vẽ trên vải. Đọc thêm

6 hữu ích 0 bình luận chia sẻ
5

Sử dụng câu trả lời của @ Pavel làm hướng dẫn, đây là phương pháp trợ giúp nếu bạn không có điểm nhưng bắt đầu x, y và chiều cao và chiều rộng. Cũng có thể vẽ ngược / lộn ngược - rất hữu ích cho tôi vì nó được sử dụng như là kết thúc của barchart dọc.

 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);
    }
5 hữu ích 0 bình luận chia sẻ
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);

}
4 hữu ích 2 bình luận chia sẻ
3

Bạn cần xóa path.moveTo sau lần đầu tiên.

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();
3 hữu ích 1 bình luận chia sẻ
1

Đừng moveTo()sau mỗilineTo()

Nói cách khác, loại bỏ mọi moveTo()ngoại trừ cái đầu tiên.

Nghiêm túc mà nói, nếu tôi chỉ sao chép-dán mã của OP và loại bỏ các moveTo()cuộc gọi không cần thiết , nó sẽ hoạt động.

Không có gì khác cần phải được thực hiện.


EDIT: Tôi biết OP đã đăng "giải pháp làm việc cuối cùng" của mình, nhưng anh ấy không nói rõ tại sao nó hoạt động. Lý do thực sự khá ngạc nhiên đối với tôi, vì vậy tôi cảm thấy cần phải thêm một câu trả lời.

1 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java android google-maps android-canvas , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading