包装StateListDrawable

时间:2013-07-17 13:57:58

标签: android android-layout android-drawable

我有一个视图,在其上我将StateListDrawable(定义{{​​1}}和默认状态)设置为XML中的state_pressed。这很好,所有状态都按预期显示。

我现在想以编程方式在background之上绘制一些内容,无论它处于哪种状态。为此,我创建了一个扩展StateListDrawable的Java类,它保留了原始的可绘制背景;在Drawable中,它首先将原始drawable绘制到画布上,然后绘制自己的附加内容。这也有效,但原始drawable的状态不会改变。

我可以看到我的自定义onDraw的{​​{1}}被setState调用,其中包含Drawable其他州。我将该调用委托给原始drawable,但stateSet始终返回android.R.attr.state_pressed并且其状态不会更改。只有在我传递的setState 除了false 之外,它才会发生变化。

似乎stateSet以某种方式可以宣布它感兴趣的stateSets和android.R.attr.state_pressed的调用者尊重这一点,尽管我没有在文档或Android源中找到任何相关内容。

这是我的StateListDrawable

setState

我的原始背景setState

@Override public boolean setState(int[] stateSet) {
    boolean changed = super.setState(stateSet);
    if (originalBackground != null) {
        // this call only returns true and changes the state if
        // the stateSet *only* contains the pressed state
        changed |= originalBackground.setState(stateSet);
    }
    return true;
}

如何在不过滤Drawable的{​​{1}}的情况下使原始drawable更改其状态?

1 个答案:

答案 0 :(得分:1)

感谢pskink的示例,我尝试在invalidateSelf中调用onStateChanged,这就是诀窍。