android clipPath切割画布

(转自:http://wallage.blog.163.com/blog/static/1738962420101012439991/)


public class PictureTestActivity extends Activity {
 
	   @Override
	   public void onCreate(Bundle savedInstanceState){
		   super.onCreate(savedInstanceState);
		   setContentView(new SampleView(this));
	   }
	    private static class SampleView extends View {
	        private Paint mPaint;
	        private Path mPath;
	        public SampleView(Context context) {
	            super(context);
	            setFocusable(true);
	            
	            mPaint = new Paint();
	            mPaint.setAntiAlias(true);
	            mPaint.setStrokeWidth(6);
	            mPaint.setTextSize(16);
	            mPaint.setTextAlign(Paint.Align.RIGHT);
	            
	            mPath = new Path();
	        }
	        
	        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", 100, 30, mPaint);
	        }
	        
	        @Override 
	        protected void onDraw(Canvas canvas) {
	            canvas.drawColor(Color.GRAY);            
	            canvas.save();
	            canvas.translate(10, 10);
	            drawScene(canvas);
	            canvas.restore();
	            
	            canvas.save();
	            canvas.translate(160, 10);
	            canvas.clipRect(10, 10, 90, 90);
	            canvas.clipRect(30, 30, 70, 70, Region.Op.DIFFERENCE);
	            drawScene(canvas);
	            canvas.restore();
	            
	            canvas.save();
	            canvas.translate(10, 160);
	            mPath.reset();
	            canvas.clipPath(mPath); // makes the clip empty
	            mPath.addCircle(50, 50, 50, Path.Direction.CCW);
	            canvas.clipPath(mPath, Region.Op.REPLACE);
	            drawScene(canvas);
	            canvas.restore();
	            
	            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();
	            
	            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();
	            
	            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.clipRect(30, 30, 70, 70, Region.Op.XOR);最后一个参数有多个选择分别是:

            //DIFFERENCE是第一次不同于第二次的部分显示出来
            //REPLACE是显示第二次的
            //REVERSE_DIFFERENCE 是第二次不同于第一次的部分显示
            //INTERSECT交集显示
            //UNION全部显示
            //XOR补集 就是全集的减去交集生育部分显示


  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值