Frage

Ich möchte einen Bogen mit Leinwand mit einer Verlaufsfüllung zeichnen.Wie kann dies erreicht werden?

War es hilfreich?

Lösung

Hey, ich habe das hier gestohlen: Zeichnen Sie einen Bogen mit einem SweepGradientin Android

aber es funktioniert gut, ich habe stattdessen einen LinearGradient verwendet.

Shader gradient = new SweepGradient (0,getMeasuredHeight()/2, Color.RED, Color.WHITE);
lightRed.setShader(gradient);
canvas.drawArc(rectf, -90, 360, false, lightRed);

Andere Tipps

In meiner Sache musste ich jemanden wie diesen zeichnen:

Vielleicht auch Sie.

Also, lass uns nachdenken! Wie funktioniert Sweep Gradient? Wenn Sie diesbezüglich richtig zeichnen:

     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)

wird sein:

Die Idee ist also, es zu drehen!

 sweepGradient.apply {
            val rotate = 270f
            val gradientMatrix = Matrix()
            gradientMatrix.preRotate(rotate, mWidth / 2F, mHeight / 2F)
            setLocalMatrix(gradientMatrix)
        }

Endlich können wir unseren Bogen zeichnen:

 mPaint.shader = gradient
 canvas.drawArc(rectF, startAngle, finishedSweepAngle, false, mPaint)

Siehe meine vollständige Quellcode für benutzerdefinierte Ansicht auf github Repository .

Sie können auch eine Reihe von Farben und variablen Positionen verwenden. Definieren Sie beispielsweise 10 Farben, eine mit jeweils 10% Fortschritt:

<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>

Fügen Sie alle diese Farben wie folgt in ein Farben-IntArray ein:

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)
        )

Definieren Sie dann Positionen.Die Positionen reichen von 0,0 bis 1,0 (Positionen 0,1 entsprechen color_10, Position 0,2 bis color_20 usw.)

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)

Sobald wir Positionen definiert haben, können wir den SweepGradient auf unsere Farbe setzen

Shader gradient = new SweepGradient (0,getMeasuredHeight()/2, colors, positions);
lightRed.setShader(gradient);

Endlich können wir unseren Bogen mit unserer Shader-Farbe zeichnen:

 canvas.drawArc(rectf, -90, 360, false, lightRed);

Endgültiger Effekt in meiner benutzerdefinierten Ansicht:

 Bildbeschreibung hier eingeben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top