Canvas的裁剪功能

20 篇文章 0 订阅
8 篇文章 0 订阅


http://ipjmc.iteye.com/blog/1299476


canvas.clipRect(,,,,op);

op 的值可以是Region.Op类型的枚举值



public class TestView extends View {
	
	private Paint mPaint = new Paint();

	public TestView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	@Override  
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		
		drawBg(canvas);
		drawDiff(canvas);
		drawReplace(canvas);
		drawUnion(canvas);
		drawXor(canvas);
		drawReverse(canvas);
		drawIntersect(canvas);
	}
	//背景
	private void drawScene(Canvas canvas) {
		canvas.clipRect(0, 0, 100, 100);
		
		canvas.drawColor(Color.WHITE);
	 
		mPaint.setColor(Color.RED);
		canvas.drawLine(0, 0, 100, 100, mPaint);
	 
		mPaint.setColor(Color.GREEN);
		canvas.drawCircle(30, 70, 30, mPaint);
	 
		mPaint.setColor(Color.BLUE);
		canvas.drawText("Clipping", 50, 50, mPaint);
	}
	//背景
	private void drawBg(Canvas canvas){
		canvas.save();
		canvas.translate(10,10);
		drawScene(canvas);
		canvas.restore();
	}
	//相减
	private void drawDiff(Canvas canvas){
		canvas.save();
		canvas.translate(160, 10);
		canvas.clipRect(0, 0, 60, 60);
		canvas.clipRect(40, 40, 100, 100, Region.Op.DIFFERENCE);
		drawScene(canvas);
		canvas.restore();

	}
	
	//取代
	private void drawReplace(Canvas canvas){
		Path path = new Path();
		canvas.save();
		canvas.translate(10, 160);
		path.reset();
		canvas.clipPath(path); // makes the clip empty
		path.addCircle(50, 50, 50, Path.Direction.CCW);
		canvas.clipPath(path, Region.Op.REPLACE);
		drawScene(canvas);
		canvas.restore();
		
		canvas.save();
		canvas.translate(10, 160);
		canvas.clipRect(0, 0, 60, 60);
		canvas.clipRect(40, 40, 100, 100, Region.Op.REPLACE);
		drawScene(canvas);
		canvas.restore();
	}
	//并集
	private void drawUnion(Canvas canvas){
		canvas.save();
		canvas.translate(160, 160);
		canvas.clipRect(0, 0, 60, 60);
		canvas.clipRect(40, 40, 100, 100, Region.Op.UNION);
		drawScene(canvas);
		canvas.restore();
	}
	//存异去同XOR
	private void drawXor(Canvas canvas){
		canvas.save();
		canvas.translate(10, 310);
		canvas.clipRect(0, 0, 60, 60);
		canvas.clipRect(40, 40, 100, 100, Region.Op.XOR);
		drawScene(canvas);
		canvas.restore();
	}
	//Difference的相反运算,将后画的部分中去掉先前的部分
	private void drawReverse(Canvas canvas){
		canvas.save();
		canvas.translate(160, 310);
		canvas.clipRect(0, 0, 60, 60);
		canvas.clipRect(40, 40, 100, 100,
		Region.Op.REVERSE_DIFFERENCE);
		drawScene(canvas);
		canvas.restore();
		
//		canvas.save();
//		canvas.translate(160, 310);
//		canvas.clipRect(0, 0, 60, 60);
//		canvas.clipRect(40, 40, 100, 100,
//		Region.Op.INTERSECT);
//		drawScene(canvas);
//		canvas.restore();
	}
	//交集
	private void drawIntersect(Canvas canvas){
		canvas.save();
		canvas.translate(10, 460);
		canvas.clipRect(0, 0, 60, 60);
		canvas.clipRect(40, 40, 100, 100,
		Region.Op.INTERSECT);
		drawScene(canvas);
		canvas.restore();
	}
}



显示如下:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值