Android自定义View - Shader

143 阅读2分钟

BitmapShader

使用paint.setShader()可以给画笔设置着色器。

BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)

tileX和tileY分别是瓦片模式,即x和y轴方向上的像素如果不够铺满宽或高,那么使用什么样的方式补齐。

  • TileMode.CLAMP 拉伸,使用边缘像素补齐
  • TileMode.REPEAT 重复,复用原像素序列补齐
  • TileMode.MIRROR 镜像,和重复模式类似,只不过将像素序列反转后补齐,如果反转的像素序列也用完了,再反转回来继续补齐,以此类推

PorterDuffXfermode

val xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_IN)
paint.setXfermode(xfermode)

给画笔设置XFermode。如果该坐标原来就有色值,那么通过XFermode可以叠加图层。有SRC和DST两个概念,SRC代表source原图,DST代表destination目的地。简单说,就是在绘制之前该位置就有的像素叫作DST,当下绘制的像素叫作SRC。或者我们把DST叫作下面的图层,而SRC叫作上面的图层。

PorterDuff.Mode的类型如下:

  • PorterDuff.Mode.CLEAR:SRC和DST图层都清除
  • PorterDuff.Mode.SRC:显示上层图像
  • PorterDuff.Mode.DST:显示下层图像
  • PorterDuff.Mode.SRC_OVER:显示上下层图像,上层盖住下层
  • PorterDuff.Mode.DST_OVER:显示上下层图像,下层盖住上层,相当于反过来看
  • PorterDuff.Mode.SRC_IN:取上下层交集部分,显示上层图像,相当于取上下层交集的形状,取上层的色彩
  • PorterDuff.Mode.DST_IN:取上下层交集部分,显示下层图像,相当于取上下层交集的形状,取下层的色彩
  • PorterDuff.Mode.SRC_ATOP:交集部分取上层的色彩,和下层非交集部分的图像
  • PorterDuff.Mode.DST_ATOP:交集部分取下层的色彩,和上层非交集部分的图像
  • PorterDuff.Mode.SRC_OUT:取上层非交集部分,交集部分透明,相当于使用下层图像的裁掉上层一部分
  • PorterDuff.Mode.XOR:取上下层非交集部分,交集部分透明
  • PorterDuff.Mode.DARKEN:取上下层全部区域,交集部分颜色变暗
  • PorterDuff.Mode.LIGHTEN:取上下层全部区域,交集部分颜色变亮
  • PorterDuff.Mode.MULTIPLY:取上下层交集部分,交集部分颜色叠加
  • PorterDuff.Mode.SCREEN:取上下层全部区域,交集部分滤色
  • PorterDuff.Mode.ADD:取上下层全部区域,交集部分饱和度叠加
  • PorterDuff.Mode.OVERLAY:取上下层全部区域,交集部分颜色叠加