setColorFilter () ist unter Android 4 defekt und arbeitet unter Android 5

9

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?

    
Richard Le Mesurier 25.02.2015, 11:27
quelle

7 Antworten

6

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%     
Harry Sharma 17.08.2015 10:39
quelle
2

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.

    
InTwoMinds 08.11.2015 23:52
quelle
0

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.

    
straya 29.10.2015 13:01
quelle
0

Hast du das direkt versucht?!

%Vor%     
Hardik 15.08.2015 10:13
quelle
0

Ich hatte das gleiche Problem auf Pre-Lollipop, löste ich ersetzen:

%Vor%

mit:

%Vor%     
mengoni 27.07.2017 13:05
quelle
0

Um auf allen Android-Versionen für beliebig viele Zustände zeichnen zu können, können Sie diese Hilfsklasse verwenden:

%Vor%

}

    
Anton Kizema 30.11.2017 16:38
quelle
-4
%Vor%

Ich erinnere mich, dass diese Funktion irgendwo in meinem Projekt funktioniert. Bitte testen Sie das selbst.

    
Y2K 14.08.2015 15:53
quelle