9

我想使用使用渐变填充的画布绘制弧线。怎样才能做到这一点?

4

3 回答 3

12

嘿,我从这里偷了这个: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);
于 2012-06-21T14:26:18.850 回答
10

在我的事业中,我不得不画这样的人:

也许你也是。

所以,让我们想想!扫描渐变如何工作?如果你通过这个绘制矩形:

     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存储库上查看我的完整自定义视图源代码

于 2019-02-24T12:25:43.187 回答
2

您还可以使用一组颜色和可变位置。例如,定义 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>

将所有这些颜色放入 colors 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);

我的自定义视图中的最终效果:

在此处输入图像描述

于 2018-12-21T11:55:00.770 回答