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.
ImageView.setImageDrawable
und den ich dank der akzeptierten Antwort umgehen konnte.