2010-08-17 70 views
70

Vì vậy, tôi vẽ tam giác này trong các bản đồ android sử dụng mã dưới đây vào phương pháp bốc thăm của tôi:Làm thế nào để vẽ một hình tam giác đầy trong canvas 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); 

Các pointX_returned là tọa độ mà tôi nhận được từ các lĩnh vực. Chúng về cơ bản là vĩ độ và kinh độ. Kết quả là một hình tam giác đẹp nhưng nội bộ bên trong trống và do đó tôi có thể thấy bản đồ. Có cách nào để lấp đầy nó bằng cách nào đó không?

+0

Như tôi đã đăng trong câu trả lời của tôi, chỉ cần không moveTo() sau mỗi lineTo(), đó là tất cả những gì có. –

+0

Tôi biết đó là câu hỏi cũ đã có câu trả lời được chấp nhận (không chính xác) và bạn cũng đã đăng giải pháp cuối cùng hoạt động ... nhưng bạn không nêu lý do tại sao nó hoạt động và tôi hy vọng nhận xét của tôi có thể tiết kiệm thời gian "Chỉ cần chi tiêu vào điều này :) –

Trả lời

35

Bạn có thể cần phải làm điều 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 con đường 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 vào đầu tiên, nó cũng có ý nghĩa.

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

+0

Thật không may điều này không giúp –

+0

@Nicolas Những gì để sử dụng thay vì ARGB, nếu chúng ta phải tùy chỉnh màu sắc với giá trị RGB thay vì sử dụng các giá trị được xác định trước? –

66

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

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!

+4

Tôi chắc rằng bạn không cần 'lineTo()' cuối cùng. 'close()' tự động thực hiện điều đó. – Timmmm

+0

@Timmmm Tôi đã kiểm tra, bạn nói đúng, không cần dòng cuối cùng(). – banxi1988

+0

Cảm ơn bạn rất nhiều. Tôi không biết tại sao tôi có quá nhiều vấn đề vẽ một hình tam giác, nhưng tôi đã dành 20 phút qua với nhiều lỗi khác nhau về vấn đề nhỏ bé này. –

10

bạn cũng có thể sử dụng vertice:

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()); 
+2

Tôi không nghĩ rằng giải pháp này xử lý hình dạng đầy. (không thể kiểm tra, tôi không có IDE của tôi tại thời điểm này) –

+3

Điều này có vẻ như giải pháp hiệu quả hơn, nhưng tiếc là phương pháp này không được hỗ trợ trên chế độ xem tăng tốc phần cứng. Bạn có thể tắt tăng tốc phần cứng, nhưng sau đó bạn mất hiệu suất tăng của nó: http://developer.android.com/guide/topics/graphics/hardware-accel.html – SurlyDre

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

} 
+0

Điều này đang hoạt động! Đừng quên sử dụng paint.setAntiAlias ​​(true) để có hình tam giác mượt mà. –

+1

Lệnh gọi drawVertices là gì? – PsiX

3

Bạn cần loại bỏ path.moveTo sau khi ban đầu đầ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(); 
+0

Tôi không có 3 điểm nhưng chỉ có một điểm x nad y làm thế nào tôi có thể vẽ một hình tam giác từ điểm đó. – Pranav

3

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 - điều này 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); 
    } 
4

enter image description here

chức năng này cho thấy làm thế nào để tạo ra một hình tam giác từ bitmap. Tức là, tạo ra hình ảnh cắt hình tam giác. Hãy thử mã bên dưới hoặc download demo example

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ề hình ảnh tam giác được vẽ trên canvas. Read more

1

Đừng moveTo() sau mỗi lineTo()

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

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

Không cần làm gì khác.


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

Các vấn đề liên quan