Region.Op.XOR两次的非交集
异或,取两次交集外的区域
有点类似PorterDuffXfermode图像处理的效果
2.2 CilpPath 裁切不规则画布裁切出一个圆形区域的画布
private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Color.WHITE); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5f); path = new Path(); path.addCircle(300,300,100, Path.Direction.CCW); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //绘制底色 蓝 canvas.drawColor(Color.BLUE); //裁切画布 canvas.clipPath(path); //绘制裁切后的区域底色 canvas.drawColor(Color.parseColor("#FF4081")); //绘制辅助圆形 canvas.drawCircle(300,300,100,mPaint); }
裁切圆形的画布
clip的方法基本就学到这里
3.其他方法画布除了裁切外,还有可以进行旋转
3.1 rotate 旋转方法 private void init() { rectP1 = new Paint(Paint.ANTI_ALIAS_FLAG); rectP1.setColor(Color.BLUE); rectP2 = new Paint(Paint.ANTI_ALIAS_FLAG); rectP2.setColor(Color.parseColor("#FF4081")); rectF1 = new RectF(100,100,400,400); rectF2 = new RectF(200,200,300,300); } /** * 旋转画布 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //旋转30° canvas.rotate(30); canvas.drawRect(rectF1,rectP1); canvas.drawRect(rectF2,rectP2); }
旋转30度
整个画布进行了顺时针旋转30°,参数为正时,是顺时针旋转,负数为逆时针旋转
如果只想让小的红色的矩形进行旋转,而蓝色的大矩形不旋转,需要了解画布中的层
3.2 save和restore方法简单修改代码,加入save和restore两个方法
private void init() { rectP1 = new Paint(Paint.ANTI_ALIAS_FLAG); rectP1.setColor(Color.BLUE); rectP2 = new Paint(Paint.ANTI_ALIAS_FLAG); rectP2.setColor(Color.parseColor("#FF4081")); rectF1 = new RectF(100,100,400,400); rectF2 = new RectF(200,200,300,300); } /** * 旋转画布 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawRect(rectF1,rectP1); canvas.save(); //旋转30° canvas.rotate(30); canvas.drawRect(rectF2,rectP2); canvas.restore(); }
旋转小矩形
save()就是保存当前图层
restore() 就是把图层恢复到最近一次save()方法前的状态
关于保存图层,还有一个更加强大的saveLayer(),这个方法就等用到时,再进行学习
3.3 translate 平移画布这个方法使用很简单
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //平移 canvas.translate(800,200); //绘制矩形 canvas.drawRect(rectF1,rectP1); canvas.drawRect(rectF2,rectP2); //在(100,100)处绘制一个小圆,用来辅助观察坐标系的改变 canvas.drawCircle(100,100,30,rectP2); }
平移
这个方法需要注意的是,Canvas的坐标系就进行了改变,观察小圆的位置
3.4 scale 缩放方法缩放的使用也非常简单
protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.scale(0.5F, 1.0F); canvas.drawBitmap(bitmap,0,0,null); }
缩放
缩放有效值为0~1f,1表示不进行缩放,原始大小
缩放方法有个重载方法scale(float sx, float sy, float px, float py)
简单修改代码
canvas.scale(0.5F, 1.0F,540,0);
指定缩放中心
px,py确定缩放中心,canvas.scale(0.5F, 1.0F)默认为(0,0)为缩放中心,指定(540,0)为缩放中心时,屏幕宽度为1080,Canvas就在水平居中缩放
3.5 skew 错切简单使用
protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.skew(0.5f,0); canvas.drawBitmap(bitmap,0,0,null); }