Beim googeln habe ich zwei Möglichkeiten gefunden, dies für Android zu tun: benutze ShaderFactory oder erweitere View , mit new Shader(new LinearGradient())
. Beide Antworten machen das gleiche - Aufruf von new Shader()
für jeden View.onDraw(Canvas canvas)
Methodenaufruf. Es ist wirklich teuer, wenn die Anzahl solcher animierten Farbverläufe mehr als ~ 3 beträgt.
Also habe ich es anders gemacht. Ich vermied es, new
alle onDraw()
aufzurufen, indem ich eine einzige vorberechnete LinearGradient
verwendete. So sieht es aus (gif, also animierte Animation):
Der Trick besteht darin, LinearGradient
zu erstellen, was colorsCount
mal größer ist als View.getWidth()
. Danach kannst du canvas.translate()
verwenden, während du den Farbverlauf zeichnest, um seine Farbe zu ändern, also ruft% new
in onDraw()
überhaupt nicht auf.
Um einen Verlauf zu erstellen, benötigen Sie die aktuelle Breite und Höhe. Ich habe es in onSizeChanged()
gemacht. Auch hier habe ich Shader
eingestellt.
Ich benutze Pfad wegen der Parallelogrammansichten, Sie können verwenden, was Sie wollen. Bei der Implementierung der Zeichnung sollten Sie zwei Dinge beachten: Sie müssen translate()
whole canvas
für den aktuellen Offset und offset()
für Ihre Füllform verwenden:
Auch sollten Sie canvas.save()
& amp; %Code%. Es wird die innere Matrix der Arbeitsfläche speichern und entsprechend wiederherstellen.
Das letzte, was Sie tun müssen, ist canvas.restore()
zu animieren. Sie können alles verwenden, was Sie wollen ObjectAnimator (Property Animation) . Ich habe TimeAnimator verwendet, weil ich gradientOffset
kontrollieren und den Offset direkt starten musste. Hier ist meine Erkenntnis (ein bisschen schwierig und hart):
Der vollständige Code updateTick
finden Sie hier
Tags und Links android animation gradient android-custom-view ondraw