2012-02-14 27 views
17

Dưới đây là làm thế nào để tạo ra một khu vực cắt hình dạng của một vòng tròn:Trên Android, làm cách nào để tạo các vùng cắt hình kỳ lạ?

Path path = new Path(); 
path.addCircle(200,200,100,Direction.CW); 
c.clipPath(path); // c is a Canvas 

Bây giờ có một khu vực cắt trên Canvas, giúp ngăn chặn vẽ bất cứ điều gì ngoài giới hạn của vòng tròn đó. Nhưng, nếu tôi muốn có khu vực cắt có hình dạng như một chiếc bánh rán (hoặc bất kỳ thứ gì)?

tôi đã cố gắng chơi xung quanh với việc tạo ra một con đường thứ hai và sử dụng toggleInverseFillType vào nó và sau đó nói thêm rằng với các đường dẫn gốc, nhưng điều đó dường như không làm việc.

Ngoài ra, thay vì sử dụng một con đường, là nó có thể chỉ cần tạo một Bitmap để sử dụng như một chiếc mặt nạ và đặt nó như một clipping mask trên Canvas bằng cách nào đó?

EDIT: Câu trả lời là chính xác những gì tôi cần với một bổ sung nhỏ. Khi thực hiện nhiều thao tác trên canvas, luôn sử dụng Op.REPLACE trên lời gọi clipPath đầu tiên. Điều đó sẽ thay thế bất kỳ clipPath hiện có nào trên Canvas đó.

Để tham khảo, dưới đây là những gì tôi đã khám phá ý nghĩa của 6 giá trị Region.Op khác nhau. Hãy tưởng tượng một sơ đồ venn với 2 vòng tròn. "B" là phần mà 2 vòng tròn trùng nhau. "A" là vòng tròn trái không trùng lặp. "C" là vòng tròn bên phải không trùng lặp.

c.clipPath(a,Region.Op.REPLACE); 
c.clipPath(b,???); 

Region.Op.DIFFERENCE   -> A..    
Region.Op.INTERSECT   -> .B.    
Region.Op.REPLACE   -> .BC    
Region.Op.REVERSE_DIFFERENCE -> ..C    
Region.Op.UNION    -> ABC 
Region.Op.XOR    -> A.C 

"." cho biết phần không được vẽ. Xin lỗi nếu điều đó không rõ ràng. Thật khó để mô tả tốt mà không có đồ họa.

Trả lời

18

Từ Canvasjavadoc:

Canvas#clipPath(Path path, Region.Op op) - Sửa clip hiện tại với đường dẫn cụ thể.

Vì vậy, ví dụ bánh rán của bạn:

  1. Tạo 2 Paths. Một cho vòng tròn lớn hơn, một cho vòng tròn nhỏ hơn.
  2. Canvas#clipPath(Path) với vòng tròn lớn hơn Path.
  3. Gọi phương thức Canvas#clipPath(Path, Region.Op) trên canvas của bạn với vòng tròn nhỏ hơn Path cho đối số đầu tiên và giá trị enum thích hợp cho đối số thứ hai.

    Path largePath = new Path(); 
    largePath.addCircle(200,200,100,Direction.CW); 
    Path smallPath = new Path(); 
    smallPath.addCircle(200,200,40,Direction.CW); 
    c.clipPath(largePath); // c is a Canvas 
    c.clipPath(smallPath, Region.Op.DIFFERENCE); 
    

Một lần nữa, thay đổi giá trị Region.Op enum để có được hiệu ứng khác nhau ...

+0

clipPath không được hỗ trợ trên Android 4 – Renetik

+2

Clippath được hỗ trợ tốt, nếu bạn tắt tăng tốc phần cứng cho tầm nhìn của bạn/hoạt động /ứng dụng. Sự khác biệt với Android 4+ là HA được bật theo mặc định. – Plato

+1

clipPath bây giờ cũng là HA trong 4.3+ – Ruxton

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