我想使用渐变填充使用画布绘制弧。怎么能实现这个目标?
答案 0 :(得分:10)
嘿,我从这里偷走了这个:Draw an arc with a SweepGradient in Android
但它工作正常,我使用的是LinearGradient。
Shader gradient = new SweepGradient (0,getMeasuredHeight()/2, Color.RED, Color.WHITE);
lightRed.setShader(gradient);
canvas.drawArc(rectf, -90, 360, false, lightRed);
答案 1 :(得分:1)
您还可以使用颜色和可变位置的数组。 例如,定义10种颜色,每种10%进度:
<color name="color_0">#3C3C3F41</color>
<color name="color_10">#1AFF2323</color>
<color name="color_20">#33FF2323</color>
<color name="color_30">#4DFF2323</color>
<color name="color_40">#66FF2323</color>
<color name="color_50">#80FF2323</color>
<color name="color_60">#99FF2323</color>
<color name="color_70">#B3FF2323</color>
<color name="color_80">#CCFF2323</color>
<color name="color_90">#E6FF2323</color>
<color name="color_100">#FFFF2323</color>
将所有这些颜色放入如下的颜色intArray中:
var colors = intArrayOf(
ContextCompat.getColor(context, R.color.color_0),
ContextCompat.getColor(context, R.color.color_10),
ContextCompat.getColor(context, R.color.color_20),
ContextCompat.getColor(context, R.color.color_30),
ContextCompat.getColor(context, R.color.color_40),
ContextCompat.getColor(context, R.color.color_50),
ContextCompat.getColor(context, R.color.color_60),
ContextCompat.getColor(context, R.color.color_70),
ContextCompat.getColor(context, R.color.color_80),
ContextCompat.getColor(context, R.color.color_90),
ContextCompat.getColor(context, R.color.color_100)
)
然后,定义位置。位置从0.0扫描到1.0(位置0.1对应于color_10,位置0.2对应于color_20等)
var positions = floatArrayOf(0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f)
一旦定义了位置,就可以将SweepGradient设置为绘画
Shader gradient = new SweepGradient (0,getMeasuredHeight()/2, colors, positions);
lightRed.setShader(gradient);
最后,我们可以使用着色器颜料绘制弧形:
canvas.drawArc(rectf, -90, 360, false, lightRed);
最终效果在我的自定义视图中:
答案 2 :(得分:1)
出于我的原因,我不得不画一个像这样的人:
也许你也是
所以,让我们想一想! 扫描渐变如何工作? 如果您通过此方式绘制矩形:
private val colors = intArrayOf(ContextCompat.getColor(context, R.color.progress_from_color),
ContextCompat.getColor(context, R.color.progress_to_color))
private var positions = floatArrayOf(0.0f, 1.0f)
private var sweepGradient : SweepGradient? = null
sweepGradient = SweepGradient(w / 2F,h / 2F,colors, positions)
将是:
所以想法是旋转它!
sweepGradient.apply {
val rotate = 270f
val gradientMatrix = Matrix()
gradientMatrix.preRotate(rotate, mWidth / 2F, mHeight / 2F)
setLocalMatrix(gradientMatrix)
}
最后我们可以画出弧线:
mPaint.shader = gradient
canvas.drawArc(rectF, startAngle, finishedSweepAngle, false, mPaint)
在github custom view source code上查看我的完整repository。