2010-07-26 6 views
32
public class POCII extends Activity { 

    myView mv = new myView(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(mv); 
    } 
} 


class myView extends View { 

    public myView(Context context) { 
     super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     Paint paint = new Paint(); 

     canvas.drawRect(0,0,100,100, paint); 
     canvas.clipRect(0,0,50,50); 
    } 
} 

Câu hỏi của tôi là, không phải đoạn mã trên vẽ hình chữ nhật và sau đó cắt phần trên cùng bên trái? Hình chữ nhật không bị cắt.Sử dụng clipRect - giải thích

Vui lòng giải thích clipRect nào. Nó thực sự là gì? Liệu nó có kẹp dưới dạng một hình chữ nhật, cho các tọa độ không? Nếu vậy, Tại sao mã trên không hoạt động?

+2

séc http://youtu.be/vkTn3Ule4Ps?list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu –

Trả lời

66

Canvas. clipRect(left, top, right, bottom) làm giảm vùng màn hình mà các thao tác vẽ trong tương lai có thể ghi vào. Nó đặt clipBounds là giao điểm không gian của hình chữ nhật cắt hiện tại và hình chữ nhật được chỉ định. Có rất nhiều biến thể của phương thức clipRect chấp nhận các biểu mẫu khác nhau cho các vùng và cho phép các phép toán khác nhau trên hình chữ nhật cắt. Nếu bạn muốn đặt rõ ràng vùng cắt, hãy thử:

canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE); 

Đối số thứ 5 có nghĩa là thay thế hình chữ nhật cắt thay vì tạo giao lộ với phiên bản trước.

Thử di chuyển câu lệnh ClipRect trước câu lệnh drawRect. Hoặc, hãy thử thêm:

paint.setColor(Color.YELLOW); 
drawRect(0,0,75,75); 

sau báo cáo clip hiện tại của bạn. Nó sẽ vẽ một hình vuông màu vàng 50x50 so với những gì bạn đã có trước đây.

Lưu ý khác: (sau khi thất vọng lâu với mã View/ViewGroup/drawing rõ ràng), tôi thấy rằng canvas.translate (x, y) cũng điều chỉnh clipRect. Sự tương tác của clipRect và ma trận vẽ rất khó hiểu. Nó rất hữu ích để in ra:

canvas.getMatrix() 

canvas.getClipBounds() 

trước và sau khi sửa đổi vào khung và trước khi rút ra điều này.

+2

Những lưu ý về canvas.translate (x, y) can thiệp vào clipRect là rất hữu ích. Đã cứu tôi rất nhiều thất vọng. Cảm ơn! –

+0

Các phương pháp với 'Region.Op' dường như không còn được dùng nữa. – Suragch

+0

Cách lấy canvas gốc từ canvas bị cắt bớt? –

3

Để cắt phần trên bên trái, làm:

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE); 
// secondly... 
canvas.drawRect(0,0,100,100, paint); 
4

ICS trở lên ...

XOR Difference và ReverseDifference đoạn chế độ được bỏ qua bởi ICS nếu tăng tốc phần cứng đang được kích hoạt.

Chỉ cần vô hiệu hóa tăng tốc phần cứng 2D theo quan điểm của bạn:

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

Reference Android: Howto use clipRect in API15