Próbuję stworzyć ogólną funkcję ramową, która sprawia, że każdy Drawable zostanie podświetlony po naciśnięciu / skupieniu / wybraniu / itp .
Moja funkcja przyjmuje Drawable i zwraca StateListDrawable, gdzie domyślnym stanem jest sam Drawable, a stan dla android.R.attr.state_pressed
jest taki sam do rysowania, tylko z filtrem zastosowanym przy użyciu setColorFilter
.
Mój problem polega na tym, że nie mogę sklonować tego, co można narysować, i utworzyć oddzielną instancję z zastosowanym filtrem. Oto, co próbuję osiągnąć:
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;
}
Jeśli nie klonuję, filtr jest oczywiście stosowany do obu stanów. Próbowałem się bawić, mutate()
ale to nie pomaga ...
Jakieś pomysły?
Aktualizacja:
Zaakceptowana odpowiedź rzeczywiście klonuje element do wyciągnięcia. Nie pomogło mi to jednak, ponieważ moja ogólna funkcja zawodzi w innym problemie. Wygląda na to, że kiedy dodajesz drawable do StateList, traci wszystkie swoje filtry.