Ich versuche , einen allgemeinen Rahmen Funktion zu machen , die jede Drawable macht hervorgehoben werden , wenn sie gedrückt / fokussiert / ausgewählt / etc .
Meine Funktion nimmt ein Drawable und gibt ein StateListDrawable zurück, wobei der Standardstatus das Drawable selbst ist und der Status für android.R.attr.state_pressed
dasselbe Drawable ist, nur mit einem Filter, der mit angewendet wird setColorFilter
.
Mein Problem ist, dass ich das Drawable nicht klonen und mit dem angewendeten Filter eine separate Instanz davon erstellen kann. Folgendes versuche ich zu erreichen:
StateListDrawable makeHighlightable(Drawable drawable)
{
StateListDrawable res = new StateListDrawable();
Drawable clone = drawable.clone(); // how do I do this??
clone.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
res.addState(new int[] {android.R.attr.state_pressed}, clone);
res.addState(new int[] { }, drawable);
return res;
}
Wenn ich nicht klone, wird der Filter offensichtlich auf beide Zustände angewendet. Ich habe versucht, damit zu spielen, mutate()
aber es hilft nicht.
Irgendwelche Ideen?
Aktualisieren:
Die akzeptierte Antwort klont tatsächlich ein Drawable. Es hat mir jedoch nicht geholfen, da meine allgemeine Funktion bei einem anderen Problem fehlschlägt. Es scheint, dass beim Hinzufügen eines Zeichens zu einer StateList alle Filter verloren gehen.
quelle
ImageView.setImageDrawable
und den ich dank der akzeptierten Antwort umgehen konnte.Antworten:
Versuche Folgendes:
quelle
.mutate()
(siehe meine Antwort).Wenn Sie einen Filter / etc auf ein mit erstelltes Drawable
getConstantState().newDrawable()
anwenden, werden auch alle Instanzen dieses Drawables geändert, da Drawables dasconstantState
als Cache verwenden!Wenn Sie also einen Kreis mit einem Farbfilter und a färben
newDrawable()
, ändern Sie die Farbe aller Kreise.Wenn Sie diese zeichnbare Datei aktualisierbar machen möchten, ohne andere Instanzen zu beeinflussen, müssen Sie diesen vorhandenen konstanten Status ändern.
Für eine gute Erklärung siehe:
http://www.curious-creature.org/2009/05/02/drawable-mutations/
http://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate ()
quelle
Das funktioniert bei mir.
quelle
Dies ist meine Lösung, basierend auf dieser SO-Frage .
Die Idee ist, dass
ImageView
der Farbfilter abgerufen wird, wenn der Benutzer ihn berührt, und der Farbfilter entfernt wird, wenn der Benutzer ihn nicht mehr berührt. Es befindet sich nur 1 Zeichen- / Bitmap im Speicher, sodass Sie diese nicht verschwenden müssen. Es funktioniert wie es sollte.Verwendung:
quelle
Ich antwortete eine ähnliche Frage hier
Grundsätzlich scheint es, als ob StateListDrawables tatsächlich ihre Filter verlieren. Ich habe eine neue BitmapDrawale aus einer geänderten Kopie der Bitmap erstellt, die ich ursprünglich verwenden wollte.
quelle
falls
getConstantState()
zurückkommtnull
.quelle