2013-07-17 42 views
0

我有一個視圖,我在其中設置StateListDrawable(定義state_pressed和默認狀態)作爲XML中的background。這工作正常,所有狀態都按預期顯示。包裝StateListDrawable

我現在想以編程的方式在StateListDrawable上繪製一些東西,不管它處於哪種狀態。爲此,我創建了一個擴展了Drawable的Java類,它保存了原始的可繪製背景;在onDraw它首先繪製原始繪圖到畫布,然後自己添加。這也適用,但原始可繪製的狀態不會改變。

我可以看到我的自定義DrawablesetState被稱爲stateSet,其中包含android.R.attr.state_pressed在其他一些州。我將該調用委託給原始可繪製對象,但setState始終返回false,並且其狀態不會更改。它只會改變,當我通過stateSet包含只有android.R.attr.state_pressed

好像StateListDrawable以某種方式可以宣佈它感興趣的stateSet和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> 

我怎樣才能使原來繪製改變其狀態不過濾stateSetstate_pressed

+2

Hannes,請參閱我的答案在這裏:http://stackoverflow.com/questions/13927896/android-button-with-text-and-image/17542264#17542264 – pskink

回答

1

感謝pskink的例子,我試過在onStateChanged中撥打invalidateSelf,這個做法很有用。

+0

btw如果你擴展Drawable,你重寫isStateful() ? – pskink

+0

是的,如果我沒有,我認爲setState根本不會被調用。 –