Как применить цветовые фильтры к конкретным объектам рисования в StateListDrawable?
Кажется, что StateListDrawable
будет игнорировать цветовые фильтры, применяемые к чертежам, которые они содержат. Например:
StateListDrawable sld = new StateListDrawable();
Drawable pressedState = Context.getResources().getDrawable(R.drawable.solid_green);
pressedState.setColorFilter(Color.RED, PorterDuff.Mode.SRC);
sld.addState(new int[] {android.R.attr.state_pressed}, pressedState);
// Other states...
Если вы подаете заявку sld
к фону представления можно ожидать, что при его нажатии фон представления станет сплошным красным. Вместо этого он станет зеленым - цвет pressedState
без применения фильтров.
1 ответ
Решение
Чтобы обойти это, вы должны применить цветной фильтр к StateListDrawable
сам по себе, в зависимости от состояния, в котором находится drawable. Следующее расширение StateListDrawable
выполняет это.
public class SelectorDrawable extends StateListDrawable {
public SelectorDrawable(Context c) {
super();
addState(new int[] {android.R.attr.state_pressed}, c.getResources().getDrawable(R.drawable.solid_green));
// Other states...
}
@Override
protected boolean onStateChange(int[] states) {
boolean isClicked = false;
for (int state : states) {
if (state == android.R.attr.state_pressed) {
isClicked = true;
}
}
if (isClicked)
setColorFilter(Color.RED, PorterDuff.Mode.SRC);
else
clearColorFilter();
return super.onStateChange(states);
}
}
Логика в onStateChange(int[] states)
может быть расширен для проверки не только нажатого состояния, и соответственно могут применяться различные цветовые фильтры.