2010-08-27 35 views
1

禁用單選按鈕不會像禁用複選框一樣「灰化」控件。 我在想,在整個單選按鈕視圖中放置一個半透明的黑色位圖會有多困難,從而使它看起來更暗?Android:如何灰化單選按鈕

不是真的知道從哪裏開始就這一個,任何想法?

回答

3

現有的圖像或可繪製上添加單板最好用ColorFilter完成。

您可以創建兩個單獨的圖形內容,並把它們添加到StateListDrawable,並給予殘疾人繪製一個灰色的彩色濾光片。這可能會耗費你一些內存,因爲你複製了一個drawable,而且聽起來你只是使用Android的股票單選按鈕,所以創建它的副本可能會很痛苦。

做的更普遍的方式就是採用彩色濾光片每當視圖被禁用。嘗試繼承的單選按鈕和壓倒一切的drawableStateChanged()像這樣:

@Override 
public void drawableStateChanged() { 
    Drawable background = getBackground(); 
    if(background != null) { 
     if(!isEnabled()) { 
      background.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY); 
     } else { 
      background.setColorFilter(null); 
     } 
    } 
} 

編輯:
嗯,哦,我看到CompoundButton有一個方法setButtonDrawable()。所以複合按鈕不能使用背景作爲他們的drawable,就像普通的按鈕一樣。當然,mButtonDrawable是一個私有變量,並沒有相應的「獲取」方法 - 非常感謝谷歌。由於缺乏通過反射訪問它,您可能需要爲此創建自己的可繪製資源。 :-(

創建您自己的可繪製按鈕可以讓您更好地控制應用程序的外觀,但這當然意味着您不會匹配您運行的任何設備的主題,而且還會增加您的應用程序,因爲你最終會加入像8個PNG資源,它的大小,你可以嘗試重寫onDraw()像你講的,並把某種半透明ColorDrawable在它的上面,但每次我已經試過了自己這。看起來像廢話完整

之前下降或者那些路,試試這個:幸運的是,單選按鈕繪製android.R.drawable.btn_radio所以公開的公共API中,你可能會膨脹到這並嘗試以某種方式向其添加狀態。其中一種方法可能是這樣的:

StateListDrawable draw = (StateListDrawable) getResources().getDrawable(android.R.drawable.btn_radio); 
    Drawable radioBtnNormal = draw.getCurrent(); 
    Drawable radioBtnDisabled = new LayerDrawable(new Drawable[]{radioBtnNormal}); 
    radioBtnDisabled.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY); 
    draw.addState(new int[]{-android.R.attr.state_enabled}, radioBtnDisabled); 
    button.setButtonDrawable(draw); 

您可能需要在那裏倒數第二行的狀態;我總是很難讓狀態恰到好處,以便它能做到我想要的。還請注意state_enabled前面的負號,表示禁用狀態。

如果這不適用於您,您也可以嘗試將原始繪圖包裝在您自己的子類LayerDrawable中,並覆蓋onStateChanged方法以根據您的狀態添加/移除顏色過濾器。

我也做過類似的事情,但不是這個具體的事情,所以我不知道這是否會工作,但我希望我已經給了你足夠的想法,你就會發現,你的作品!

+0

乾杯尼爾。我試過了,但沒有效果。 我把以下內容作爲程序的第一行,因爲沒有它,它沒有顯示哪些被點擊: super。drawableStateChanged(); 我的代碼被稱爲isEnabled的兩個值,但它們之間的顯示沒有區別。 我也嘗試setBackgroundColor在整個視圖,但也沒有工作。 我正在使用默認的黑色背景控件,是否會有所作爲? – FrinkTheBrave 2010-09-02 21:31:19

+0

好吧,我只是意識到它不是使用背景,而是繪製按鈕本身。我編輯了我的帖子,爲此提出了一些解決方法。 – 2010-09-03 19:14:40