Ich versuche in regelmäßigen Abständen (einige Male pro Sekunde) verschiedene Farben auf den Bildschirm zu bringen.
Um die Farben zu ändern, verwende ich Drawable.setColorFilter(int color, Mode mode)
auf dem Hintergrund meiner Hauptansicht:
myView.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.SRC);
Zu Debugging-Zwecken habe ich eine andere Ansicht hinzugefügt, die ich mit View.setBackgroundColor(int color)
ändere.
Das Problem besteht darin, dass die Aufrufe von setColorFilter()
auf Lollipop funktionieren, aber in früheren Versionen (speziell Nexus 7 v4) nicht funktionieren. 4.4, Galaxy Nexus v4.2.1).
Ich rufe den farbändernden Code innerhalb einer Runnable
auf, die in regelmäßigen Intervallen von einem Handler
ausgelöst wird.
Der Handler wird auf allen Plattformen aufgerufen (ich sehe die Hintergrundänderungen aufgrund der Debugging setBackgroundColor()
-Aufrufe).
Unten ist der Farbzykluscode:
%Vor% Ich habe verschiedene PorterDuff.Mode
-Werte ausprobiert - kann immer noch nicht auf Android 4 funktionieren.
Was ist anders zwischen Android v4 und v5, das die Funktionsweise von setColorFilter()
ändern würde?
Letztendlich scheint es, als ob das Problem darin besteht, dass KitKat die Verwendung eines ColorFilters (oder implizit eines Alphas) in Drawable nicht unterstützt, das wiederum in einer StateListDrawable enthalten sein wird. Meine Lösung bestand darin, dasselbe zu verwenden, um das komplexe Drawable zu konstruieren und es dann in ein einfaches BitMapDrawable zu rendern:
%Vor% Es gibt ein Problem in AppCompat mit der Verbindung Drawable
unterhalb der API 21, die meiner Meinung nach verwandt ist:
Ссылка
Die einfache Lösung verwendet keine Zeichen aus XML, sondern erstellt sie im Code und wendet dann setColorFilter
an. Deshalb hat @Hardeep Lösung funktioniert.
Fun Trivia: In meinem Fall setColorFilter
auf XML-erstellt TextView
drawableLeft
hat gut funktioniert, aber nur, wenn über Klick-Handler / verzögert aufgerufen. Beim Aufruf in onCreate
/ onResume
usw. ist nichts passiert.
Für mich würde ein ColorFilter nicht auf ein Farbelement in einer StateListDrawable angewendet werden.
Erstellen Sie ein Drawable, um diese Farbe darzustellen, und verwenden Sie stattdessen das StateListDrawable-SetColorFilter, das auf Pre-Lollipop-Geräten funktioniert, die ich getestet habe.
Als Randnotiz habe ich ein rein weißes Drawable gemacht, damit die Tönungsfarbe bei voller Deckkraft aufgetragen wird.
Um auf allen Android-Versionen für beliebig viele Zustände zeichnen zu können, können Sie diese Hilfsklasse verwenden:
%Vor%}
Tags und Links android android-4.0 android-5.0-lollipop