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 に答える