当前位置:   article > 正文

Android Paint.Xfermode及离屛绘制_android paint xfermode

android paint xfermode

离屏绘制

通过使用离屛绘制,把要绘制的内容单独绘制在缓冲层,保证Xfermode的使用不会出现错误的结果。

离屏缓冲的两种方式:

  • Canvas.saveLayer() 可以做短时离屏缓冲,在绘制之前保存,绘制之后恢复,如:
//Canvas.saveLayer可以做离屏缓冲,在绘制之前保存当前图层,绘制之后恢复
int saveId = canvas.saveLayer(0, 0, mWidth, mHeight, mUpPaint, Canvas.ALL_SAVE_FLAG);
//绘制圆形
canvas.drawBitmap(circelBitmap, 0, 0, mUpPaint);
//设置Xfermode
mUpPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
//绘制方形
canvas.drawBitmap(rectBitmap, 0, 0, mUpPaint);
//清除Xfermode
mUpPaint.setXfermode(null);
//方式1、恢复之前的图层
canvas.restoreToCount(saveId);
//方式2、恢复之前的图层
canvas.restore();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • View.setLayerType()直接把整个View都绘制在离屏缓冲中
//使用一个Bitmap来缓冲
setLayerType(LAYER_TYPE_SOFTWARE, null);
//使用GPU来缓冲
setLayerType(LAYER_TYPE_HARDWARE, null);
  • 1
  • 2
  • 3
  • 4

Paint.setXfermode(Xfermode xfermode)

//绘制不会提交到画布上
new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
//显示上层绘制的图像
new PorterDuffXfermode(PorterDuff.Mode.SRC),
//显示下层绘制的图像
new PorterDuffXfermode(PorterDuff.Mode.DST),
//正常绘制显示,上下层绘制叠盖
new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),

//上下层都显示,下层居上显示
new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
//取两层绘制交集,显示上层
new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
//取两层绘制交集,显示下层
new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
//取上层绘制非交集部分,交集部分变透明
new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),

//取下层绘制非交集部分,交集部分变透明
new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
//取上层交集部分与下层非交集部分
new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
//取下层交集部分与上层非交集部分
new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
//取出两个图层交集部分
new PorterDuffXfermode(PorterDuff.Mode.XOR),

//取两图层全部区域,交集部分颜色加深
new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
//取两图层全部区域,交集部分颜色点量
new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
//取两图层交集部分,颜色叠加
new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
//取两图层全部区域,交集部分滤色
new PorterDuffXfermode(PorterDuff.Mode.SCREEN),

//取两图层全部区域,交集部分饱和度相加
new PorterDuffXfermode(PorterDuff.Mode.ADD),
//取两图层全部区域,交集部分叠加
new PorterDuffXfermode(PorterDuff.Mode.OVERLAY)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

对应效果:
image.png

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

闽ICP备14008679号