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
代码
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 ( ) ,
mDrawRect. centerY ( ) ,
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
画笔绘制具有扫描渐变的内容,从渐变中心点开始顺时针旋转,进行扫描渐变
构造函数
public SweepGradient ( float cx,
float cy,
@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]
这个区间
mSweepGradient = SweepGradient (
mDrawRect. centerX ( ) ,
mDrawRect. centerY ( ) ,
intArrayOf ( mStartColor, mMiddleColor, mEndColor) ,
floatArrayOf ( 0f , 0.5f , 1f )
)
SweepGradient
没有映射方式
SweepGradient
没有 TileMode
着色器映射方式,用于创建完整的圆周渐变,没有边缘、重复、镜像的颜色去绘制着色器区域之外的渐变,绘制起始点和结束点都是同一个,为创建SweepGradient
对象传入