自定义View之Paint

来源:互联网 发布:全聚合电视直播软件 编辑:程序博客网 时间:2024/05/19 14:15

LinearGradient

LinearGradient被称为线性渲染,其意味着着色器使用线性变化的颜色来进行渲染。以做到这样的效果:

这里写图片描述

LinearGradient有两个构造函数:

  • LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
  • 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:表示渲染的颜色,它是一个颜色数组,数组长度必须大于等于2
  • positions:表示相对位置数组,表示colors数组中几个颜色的相对位置,是一个float类型的数组,该数组的长度必须与colors数组的长度相同。如果这个参数使用null也可以,这时系统会按照梯度线来均匀分配colors数组中的颜色。
  • tile:表示平铺模式

先来看第一个构造函数:

val lgsShader = LinearGradient(0f, 0f, widthView / 4f, heightView/4f,        colorResA, colorResB, Shader.TileMode.REPEAT)mPaint.shader = lgsShadercanvas?.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), mPaint)

效果图:

这里写图片描述


实际上,线性变化的起始位置和结束位置用来指定线性变化的的方向,而起始位置和结束位置只不过是线性变化的方向的两个点。当然,它不仅决定了颜色线性变化的方向,同时还决定了渲染的位置。当需要渲染的尺寸超过线性变化的指定尺寸时,就交由Shader.TileMode来决定渲染的平铺模式。

关于Shader.TileMode前面已经做了介绍。下面来看,如果在X轴方向的颜色线性渲染,此时我们只需要将起始位置和结束位置的y坐标设置为0,也就是说在Y轴方向不做线性变化:

val lgsShader = LinearGradient(0f, 0f, widthView / 4f, 0f,        colorResA, colorResB, Shader.TileMode.REPEAT)mPaint.shader = lgsShadercanvas?.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), mPaint)

效果图:

这里写图片描述

接下来看,第二个构造函数,与第一个构造函数不同的是,它需要制定一个颜色数组和颜色的相对位置数组:

val colorResA = resources.getColor(android.R.color.holo_red_dark)val colorResB = resources.getColor(android.R.color.holo_blue_dark)val colorResC = resources.getColor(android.R.color.black)val colorResD = resources.getColor(android.R.color.holo_green_dark)val colorArray = intArrayOf(colorResA, colorResB, colorResC, colorResD)val positionArray = floatArrayOf(0.0f, 0.3f, 0.4f, 1.0f)val lgsShader = LinearGradient(0f, 0f, widthView / 4f, 0f,        colorArray, positionArray, Shader.TileMode.REPEAT)mPaint.shader = lgsShadercanvas?.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), mPaint)

效果图:

这里写图片描述

这里需要注意的是:

  1. 相对位置数组可以为NULL,当设置为NULL时,颜色沿梯度线性均匀变化
  2. 如果设置了相对位置数组,该数组的的大小必须与颜色数组的长度一致。因为它的值一一对应了颜色的值。
  3. 相对位置数组的值在0-1之间的Float值,它决定了相对应颜色的线变区间
  4. 颜色数组的长度必须大于2

现将位置数组设置为NULL,此时,颜色应沿梯度线性均匀变化,来看下效果图:

val lgsShader = LinearGradient(0f, 0f, widthView / 4f, 0f,        colorArray, null, Shader.TileMode.REPEAT)mPaint.shader = lgsShadercanvas?.drawRect(0f, 0f, measuredWidth.toFloat(), measuredHeight.toFloat(), mPaint)

效果图:

这里写图片描述




若想了解更多Paint相关的内容,请跳入: 自定义View系列文章目录




如果觉得我的文章对您有用,请随意点赞、评论。您的支持将鼓励我继续创作!