0

我有一个视图,在该视图上我将一个StateListDrawable(定义state_pressed和默认状态)设置为backgroundXML 中的一个。这工作正常,所有状态都按预期显示。

我现在想以编程方式在 之上绘制一些东西StateListDrawable,无论它处于哪种状态。为此,我创建了一个扩展的 Java 类Drawable,它包含原始背景可绘制对象;它onDraw首先将原始可绘制对象绘制到画布上,然后将其添加到画布上。这也有效,但原始可绘制对象的状态不会改变。

我可以看到setState我的自定义Drawable是用stateSet包含android.R.attr.state_pressed其他一些状态的 a 调用的。我将该调用委托给原始可绘制对象,但setState总是返回false并且其状态不会改变。只有当我传递一个stateSet包含.android.R.attr.state_pressed

似乎可以以StateListDrawable某种方式宣布它感兴趣的 stateSets 和尊重它的调用者setState,尽管我在文档或 Android 源代码中没有找到任何相关内容。

这是我的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

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@color/red"/>
    <item android:drawable="@color/green"/>
</selector>

如何在不过滤stateSetfor的情况下使原始可绘制对象更改其状态state_pressed

4

1 回答 1

1

感谢 pskink 的示例,我尝试调用invalidateSelfin onStateChanged,这成功了。

于 2013-07-17T14:34:13.217 回答