Wie animieren Sie die Änderung der Hintergrundfarbe einer Ansicht auf Android?
Zum Beispiel:
Ich habe eine Ansicht mit einer roten Hintergrundfarbe. Die Hintergrundfarbe der Ansicht ändert sich in Blau. Wie kann ich einen reibungslosen Übergang zwischen Farben vornehmen?
Wenn dies mit Ansichten nicht möglich ist, ist eine Alternative willkommen.
android
animation
view
background-color
hpique
quelle
quelle
Antworten:
Am Ende fand ich eine (ziemlich gute) Lösung für dieses Problem!
Sie können dazu ein TransitionDrawable verwenden . In einer XML-Datei im Zeichenordner können Sie beispielsweise Folgendes schreiben:
Dann würden Sie in Ihrem XML für die tatsächliche Ansicht auf dieses TransitionDrawable im
android:background
Attribut verweisen .An diesem Punkt können Sie den Übergang in Ihrem Code auf Befehl einleiten, indem Sie Folgendes tun:
Oder führen Sie den Übergang in umgekehrter Reihenfolge aus, indem Sie Folgendes aufrufen:
In der Antwort von Roman finden Sie eine andere Lösung mit der Eigenschaftsanimations-API, die zum Zeitpunkt der ursprünglichen Veröffentlichung dieser Antwort nicht verfügbar war.
quelle
Sie können die neue Eigenschaftsanimations-API für Farbanimationen verwenden:
Verwenden Sie für die Abwärtskompatibilität mit Android 2.x die Nine Old Androids-Bibliothek von Jake Wharton.
Die
getColor
Methode war in Android M veraltet, sodass Sie zwei Möglichkeiten haben:Wenn Sie die Support-Bibliothek verwenden, müssen Sie die
getColor
Anrufe ersetzen durch:Wenn Sie die Support-Bibliothek nicht verwenden, müssen Sie die
getColor
Anrufe ersetzen durch:quelle
ValueAnimator.ofArgb(colorFrom, colorTo)
sieht eher auf den Punkt aus, ist aber leider neu.Abhängig davon, wie Ihre Ansicht ihre Hintergrundfarbe erhält und wie Sie Ihre Zielfarbe erhalten, gibt es verschiedene Möglichkeiten, dies zu tun.
Die ersten beiden verwenden das Android Property Animation Framework.
Verwenden Sie einen Objektanimator, wenn:
argb
Wert in einer XML-Datei definiert.view.setBackgroundColor()
Der Objektanimator ruft auf,
view.setBackgroundColor
der das definierte Drawable ersetzt, es sei denn, es handelt sich um eine Instanz von aColorDrawable
, was selten der Fall ist. Dies bedeutet, dass zusätzliche Hintergrundeigenschaften aus einem Zeichenelement wie Strich oder Ecken entfernt werden.Verwenden Sie einen Werteanimator, wenn:
Verwenden Sie eine Übergangszeichnung, wenn:
Ich hatte einige Leistungsprobleme mit Transition-Drawables, die ausgeführt werden, während ich ein DrawerLayout öffne, das ich nicht lösen konnte. Wenn Sie also auf unerwartetes Stottern stoßen, sind Sie möglicherweise auf denselben Fehler gestoßen wie ich.
Sie müssen das Beispiel für den Wertanimator ändern , wenn Sie eine Zeichnungsdatei für StateLists oder eine Zeichnungsliste für LayerLists verwenden möchten. Andernfalls stürzt sie in der
final GradientDrawable background = (GradientDrawable) view.getBackground();
Zeile ab.Objektanimator :
Ansichtsdefinition:
Erstellen und verwenden Sie eine
ObjectAnimator
solche.Sie können die Animationsdefinition auch mit einem AnimatorInflater aus einer XML laden, wie dies XMight in Android objectAnimator tut. Animieren Sie backgroundColor of Layout
Wertanimator :
Ansichtsdefinition:
Zeichnungsfähige Definition:
Erstellen und verwenden Sie einen ValueAnimator wie folgt:
Übergang zeichnbar :
Ansichtsdefinition:
Zeichnungsfähige Definition:
Verwenden Sie das TransitionDrawable wie folgt:
Sie können die Animationen umkehren, indem Sie die Animationsinstanz aufrufen
.reverse()
.Es gibt einige andere Möglichkeiten, Animationen zu erstellen, aber diese drei sind wahrscheinlich die häufigsten. Ich benutze normalerweise einen ValueAnimator.
quelle
Sie können einen Objektanimator erstellen. Zum Beispiel habe ich eine Zielansicht und möchte Ihre Hintergrundfarbe ändern:
quelle
ofArgb(targetView, "backgroundColor", colorFrom, colorTo)
. Die Umsetzung ist gerechtofInt(...).setEvaluator(new ArgbEvaluator())
.Wenn Sie eine solche Farbanimation wünschen,
Dieser Code hilft Ihnen:
quelle
anim.setRepeatCount(ValueAnimator.INFINITE);
nicht Animation.INFINITE sein, imAm besten verwenden Sie ValueAnimator und
ColorUtils.blendARGB
quelle
Eine andere einfache Möglichkeit, dies zu erreichen, besteht darin, eine Überblendung mit AlphaAnimation durchzuführen.
quelle
Dies ist die Methode, die ich in einer Basisaktivität verwende, um den Hintergrund zu ändern. Ich verwende GradientDrawables, die im Code generiert wurden, aber möglicherweise angepasst werden können.
Update: Falls jemand auf dasselbe Problem
setCrossFadeEnabled(true)
stößt, das ich aus irgendeinem Grund unter Android <4.3 mit einem unerwünschten White-Out-Effekt festgestellt habe, musste ich mit der oben genannten @ Roman Minenok ValueAnimator-Methode für <4.3 zu einer Volltonfarbe wechseln.quelle
Die Antwort wird auf viele Arten gegeben. Sie können auch
ofArgb(startColor,endColor)
von verwendenValueAnimator
.für API> 21:
quelle
Hier ist eine nette Funktion, die dies ermöglicht:
Und in Kotlin:
quelle
Die Dokumentation zu XML-basierten Animationen ist schrecklich. Ich habe gerade um Stunden durchsucht die Hintergrundfarbe einer Schaltfläche zu animieren , wenn drücken ... Das Traurige daran ist , dass die Animation weg nur ein Attribut ist: Sie können
exitFadeDuration
in derselector
:Dann verwenden Sie es einfach wie
background
für Ihre Ansicht. Kein Java / Kotlin-Code erforderlich.quelle
android:enterFadeDuration
; Meine Erfahrung war, dass meine Animation ohne sie das zweite Mal nicht funktionierte.einen Ordner hinzufügen Animator in res Ordner. (Der Name muss Animator sein ). Fügen Sie eine Animator-Ressourcendatei hinzu. Zum Beispiel res / animator / fade.xml
Rufen Sie dies in der Java-Aktivitätsdatei auf
quelle
Verwenden Sie die folgende Funktion für Kotlin:
Übergeben Sie die Ansicht, deren Farbe Sie ändern möchten.
quelle
Ich habe festgestellt, dass die Implementierung
ArgbEvaluator
im Android-Quellcode beim Farbwechsel am besten funktioniert. Bei der Verwendung von HSV sprang der Übergang je nach den beiden Farben durch zu viele Farbtöne für mich. Aber diese Methode funktioniert nicht.Wenn Sie einfach animieren versuchen, den Einsatz
ArgbEvaluator
mitValueAnimator
wie vorgeschlagen hier :Wenn Sie jedoch wie ich sind und Ihren Übergang mit einer Benutzergeste oder einem anderen Wert verknüpfen möchten, der von einer Eingabe übergeben wird,
ValueAnimator
ist dies keine große Hilfe (es sei denn, Sie zielen auf API 22 und höher ab. In diesem Fall können Sie dieValueAnimator.setCurrentFraction()
Methode verwenden ). Wenn Sie auf API 22 abzielen, schließen Sie den im Quellcode gefundenenArgbEvaluator
Code in Ihre eigene Methode ein, wie unten gezeigt:Und benutze es wie du willst.
quelle
Basierend auf der Antwort von ademar111190 habe ich diese Methode erstellt, die die Hintergrundfarbe einer Ansicht zwischen zwei beliebigen Farben pulsiert :
quelle