Android绘图之Shader


Shader是绘图过程中的着色器,它有五个子类:

  • BitmapShader
  • ComposeShader
  • LinearGradient
  • RadialGradient
  • SweepGradient

它一般用在paint.setShader(shader)中,paint是一个Paint对象,shader是一个Shader对象。

1. BitmapShader


BitmapShader是用来做位图绘制时纹理的着色器,位图可以通过指定的平铺模式进行重复或者镜像。

BitmapShader的构造方法:

  • BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
    • bitmap是我们要进行着色的位图
    • tileX是我们在X轴的平铺模式
    • tileY是我们在Y轴的平铺模式

平铺模式有三种:

  • Shader.TileMode.CLAMP:如果着色器超出原始边界范围,会复制边缘颜色。
  • Shader.TileMode.MIRROR:横向和纵向的重复着色器的图像,交替镜像图像是相邻的图像总是接合。这个官方的说明可能不太好理解,说白了,就是图像不停翻转来平铺,直到平铺完毕。
  • Shader.TileMode.REPEAT: 横向和纵向的重复着色器的图像。

一般来说,当Canvas的宽度(高度)小于等于BitmapShader中Bitmap的宽度(高度),我们会使用Shader.TileMode.CLAMP模式,否则我们会使用Shader.TileMode.MIRROR或者Shader.TileMode.REPEAT模式。

  • X轴和Y轴平铺模式分别设置为BitmapShader.TileMode.REPEAT,BitmapShader.TileMode.MIRROR
  • X轴和Y轴平铺模式分别设置为BitmapShader.TileMode.MIRROR,BitmapShader.TileMode.REPEAT
  • X轴和Y轴平铺模式都设置为BitmapShader.TileMode.MIRROR
  • X轴和Y轴平铺模式都设置为BitmapShader.TileMode.REPEAT
  • X轴和Y轴平铺模式都设置为BitmapShader.TileMode.CLAMP

可以很明显的看到当X轴和Y轴平铺模式都设置为BitmapShader.TileMode.CLAMP,Canvas的宽度(高度)大于BitmapShader中Bitmap的宽度(高度)时,绘制出来的图像比较丑,我们来看看Canvas的宽度(高度)小于等于BitmapShader中Bitmap的宽度(高度)时的绘图情况,这种情况下面我们一般可以将我们的图像剪切成各种形状,最常见的是将图像剪切成图像。

2. ComposeShader


ComposeShader是一个组合着色器,它通过Xfermode将两个着色器组合起来。

ComposeShader有两个构造方法:

  • ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)
    • shaderA:这个着色器中的颜色被视为Xfermode模式中的“dst”
    • shaderB:这个着色器中的颜色被视为Xfermode模式中的“src”
    • mode:Xfermode的模式
  • ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
    • mode:也可以看成是Xfermode的模式,更具体地说它是PorterDuffXfermode的模式

3. LinearGradient


LinearGradient是线性渐变的着色器。

LinearGradient有两个构造方法:

  • LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
    • x0表示渐变的起始点x坐标
    • y0表示渐变的起始点y坐标
    • x1表示渐变的终点x坐标
    • y1表示渐变的终点y坐标
    • colors表示渐变的颜色数组
    • positions用来指定颜色数组的相对位置,可以为null,为null是表示颜色均匀分布
    • tile表示平铺模式
  • LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
    • color0表示渐变开始颜色
    • color1表示渐变结束颜色

利用LinearGradient实现一个从蓝色线性渐变到红色的圆形图:

4. RadialGradient


RadialGradient是径向渐变着色器。

RadialGradient有两个构造方法:

  • RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)
    • centerX:渐变中心x坐标
    • centerY:渐变中心y坐标
    • radius:渐变圆的半径
    • colors:分布在渐变圆中心到边缘的颜色
    • stops:取值0-1之间,用来指定颜色数组的相对位置,可以为null,为null是表示颜色均匀分布
    • tile表示平铺模式
  • RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)
    • centerColor表示渐变中心的颜色
    • edgeColor:表示渐变边缘的颜色

利用RadialGradient实现一个从蓝色径向渐变到红色的圆形图:

5. SweepGradient


SweepGradient是绕着一个中心点进行扫描的渐变着色器。

SweepGradient有两个构造方法:

  • SweepGradient(float cx, float cy, int[] colors, float[] positions)
    • cx:中心点的x坐标
    • cy:中心点的y坐标
    • colors:在中心点周围分配的颜色数组,最少包含两种颜色
    • positions:取值0-1之间,用来指定颜色数组的相对位置,可以为null,为null是表示颜色均匀分布
  • SweepGradient(float cx, float cy, int color0, int color1)
    • color0:开始扫描的颜色
    • color1:结束扫描的颜色

利用SweepGradient实现一个从蓝色扫描渐变到红色的圆形图:

更多相关文章

  1. android 更改TextView部分字体颜色、大小、背景
  2. Android(安卓)设计中常用的设计模式
  3. Android颜色选择器库
  4. 【Android(安卓)应用开发】 自定义 圆形进度条 组件
  5. Android面试题集锦(四)
  6. Android(Java):音量调节
  7. MaterialDesign中控件属性表
  8. Android(安卓)平铺背景图片
  9. Android(安卓)setTextColor 不生效

随机推荐

  1. Android图片放大修改代码
  2. Android之AIDL
  3. Android(安卓)解决 RecyclerView 嵌套 Sc
  4. Android(安卓)响应键盘移动图标
  5. android alertdialog 弹出框
  6. android 自定义progressBar
  7. PduHeader
  8. 引入layoutlib.jar
  9. android 多点触摸 放大 缩小 图片
  10. 闹铃设置