当前位置:   article > 正文

自定义组件重写onDraw()方法,Canvas类中的saveLayout()、save()、restore()方法

重写ondraw

自定义组件重写onDraw方法,内容如下

  1. @Override
  2. protected void onDraw(Canvas canvas) {
  3. super.onDraw(canvas);
  4. Paint paint = new Paint();
  5. paint.setColor(Color.RED);
  6. RectF rectF = new RectF(100, 100, 400, 400);
  7. canvas.drawRect(rectF, paint);
  8. }

此时画出来的红色矩形(父布局的背景是白色)

我们再调小一点矩形的范围,再画一个小一点的蓝色矩形

  1. //再画一个小一点的蓝色的矩形
  2. paint.setColor(Color.BLUE);
  3. rectF.set(150, 150, 350, 350);
  4. canvas.drawRect(rectF, paint);

emmmm,我想在蓝色的矩形中间抠出一个小的矩形,让他露出红色的底色,利用PorterDuff.Mode.CLEAR

  1. //扣出蓝色矩形中的一块区域
  2. rectF.set(200, 200, 300, 300);
  3. paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
  4. canvas.drawRect(rectF, paint);

what?黑色的?,连白色的背景也没了?因为现在是在同一个canvas中操作的,这一层的东西都会受影响,有点像是Photoshop中的图层概念。那只想让他抠掉蓝色的那一层怎么办?在画好红色的矩形后调用saveLayer()方法来保存当前图层和新建一个图层,然后再画一个蓝色的矩形,再抠出中间的位置,上代码:

  1. Paint paint = new Paint();
  2. paint.setColor(Color.RED);
  3. RectF rectF = new RectF(100, 100, 400, 400);
  4. canvas.drawRect(rectF, paint);
  5. //画好红色的矩形后保存图层
  6. canvas.saveLayer(null, null);
  7. //再画一个小一点的蓝色的矩形
  8. paint.setColor(Color.BLUE);
  9. rectF.set(150, 150, 350, 350);
  10. canvas.drawRect(rectF, paint);
  11. //扣出蓝色矩形中的一块区域
  12. rectF.set(200, 200, 300, 300);
  13. paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
  14. canvas.drawRect(rectF, paint);

效果:

saveLayer有两个参数,第一个参数是一个RectF类,你可以用这个类来指定保存的canvas的位置和大小

啊?这是什么操作,先保存蓝色矩形左上角的位置试试看,改一下刚刚到saveLayer()方法,贴一下全部代码:

  1. Paint paint = new Paint();
  2. paint.setColor(Color.RED);
  3. RectF rectF = new RectF(100, 100, 400, 400);
  4. canvas.drawRect(rectF, paint);
  5. //画好红色的矩形后保存图层
  6. rectF.set(150,150, 250, 250);
  7. canvas.saveLayer(rectF, null);
  8. //再画一个小一点的蓝色的矩形
  9. paint.setColor(Color.BLUE);
  10. rectF.set(150, 150, 350, 350);
  11. canvas.drawRect(rectF, paint);
  12. //扣出蓝色矩形中的一块区域
  13. rectF.set(200, 200, 300, 300);
  14. paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
  15. canvas.drawRect(rectF, paint);

效果:

emmmmm,去掉抠颜色的代码看看

  1. //扣出蓝色矩形中的一块区域
  2. // rectF.set(200, 200, 300, 300);
  3. // paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
  4. // canvas.drawRect(rectF, paint);

再运行的效果:

到这里就能理解了,用saveLayer()保存了蓝色那一小块的地方,同时新创建的一张canvas大小也是只有蓝色矩形那一小块,所有只能操作这一小块了,还有restore()方法可以恢复上一个canvas,canvas是由一个栈去管理,drawXXX()操作的是栈顶的canvas,画一张图方便理解

----------------------------------------------------------

还有save()方法,这个方法是用来保存坐标系等状态的,这些状态也是由一个栈去管理。当你画好一个图形后,画另一个图形需要对坐标系进行旋转操作和改变画笔颜色,画完后再画别的图形又要把画笔和坐标系的角度调回来,这时save()方法就派上用场了,在你画好第一个图形后调用save()方法可以保存好当前的状态,再去调画笔颜色和坐标系角度去画另一个图形,画好后再调用restore()方法就可以恢复之前的画笔状态和坐标系状态。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/765472
推荐阅读
相关标签
  

闽ICP备14008679号