Как применить цветовые фильтры к конкретным объектам рисования в 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) может быть расширен для проверки не только нажатого состояния, и соответственно могут применяться различные цветовые фильтры.

Другие вопросы по тегам