3

似乎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没有应用过滤器的颜色。

4

1 回答 1

5

要解决此问题,您必须StateListDrawable根据可绘制对象所处的状态将颜色过滤器应用于自身。以下扩展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)可以进一步扩展以测试不仅仅是按下状态,并且可以相应地应用不同的滤色器。

于 2014-04-22T14:24:46.020 回答