XML
文件
xml
<com.example.myapplication.MyView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_gravity="center"
android:layout_height="400dp"/>
自定义View
代码
kotlin
class MyView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private var mStartColor = Color.RED
private var mMiddleColor = Color.BLUE
private var mEndColor = Color.GREEN
private var mDrawRect = RectF()
private var mSweepGradient: SweepGradient? = null
private var mDrawPaint = Paint()
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
mDrawRect = RectF(0f, 0f, w.toFloat(), h.toFloat())
mSweepGradient = SweepGradient(
mDrawRect.centerX(), // 渐变中心的 x 坐标,设置为矩形中心的 x 坐标
mDrawRect.centerY(), // 渐变中心的 y 坐标,设置为矩形中心的 y 坐标
intArrayOf(mStartColor, mMiddleColor, mEndColor), // 渐变颜色数组
floatArrayOf(0f, 0.5f, 1f) // 颜色位置数组
)
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
mSweepGradient?.let {
mDrawPaint.shader = it
canvas.drawRect(mDrawRect, mDrawPaint)
}
}
}
RadialGradient
线性着色器参数详解
RadialGradient
扫描渐变着色器赋值给Paint
画笔,可以使用Canvas
画布和Paint
画笔绘制具有扫描渐变的内容,从渐变中心点开始顺时针旋转,进行扫描渐变
构造函数
- 构造函数:多色渐变
java
public SweepGradient(float cx, // 渐变中心的 x 坐标
float cy, // 渐变中心的 y 坐标
@NonNull int[] colors, // 渐变颜色数组
@Nullable float[] positions) // 颜色位置数组
cx, cy
: 渐变中心的坐标colors
: 定义渐变的颜色数组,至少需要两个颜色positions
: 可选的颜色位置数组,定义每个对应颜色的相对位置(0 到 1 之间的浮点数)。如果为 null,颜色将在渐变中均匀分布
渐变中心点(x, y)
只决定中心位置,映射方向按照顺时针旋转扫描绘制
颜色数组IntArray
和位置数组FloatArray
决定颜色的数量和位置
- 起始颜色
mStartColor
和过渡颜色mMiddleColor
只作用于[0f, 0.5f]
这个区间 - 过渡颜色
mMiddleColor
和结束颜色mEndColor
只作用于[0.5f, 1f]
这个区间
kotlin
mSweepGradient = SweepGradient(
mDrawRect.centerX(), // 渐变中心的 x 坐标,设置为矩形中心的 x 坐标
mDrawRect.centerY(), // 渐变中心的 y 坐标,设置为矩形中心的 y 坐标
intArrayOf(mStartColor, mMiddleColor, mEndColor), // 渐变颜色数组
floatArrayOf(0f, 0.5f, 1f) // 颜色位置数组
)
SweepGradient
没有映射方式
SweepGradient
没有TileMode
着色器映射方式,用于创建完整的圆周渐变,没有边缘、重复、镜像的颜色去绘制着色器区域之外的渐变,绘制起始点和结束点都是同一个,为创建SweepGradient
对象传入