我試圖製作一個通用框架函數,使任何Drawable在被按下/聚焦/選中/ /等時變亮。Android:克隆drawable以使StateListDrawable具有過濾器
我的函數需要一個Drawable並返回一個StateListDrawable,其中默認狀態是Drawable本身,並且android.R.attr.state_pressed
的狀態與drawable相同,只是使用setColorFilter
應用了一個過濾器。
我的問題是,我無法克隆drawable,並使用應用的過濾器製作一個單獨的實例。這是我想要實現的:
StateListDrawable makeHighlightable(Drawable drawable)
{
StateListDrawable res = new StateListDrawable();
Drawable clone = drawable.clone(); // how do I do this??
clone.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
res.addState(new int[] {android.R.attr.state_pressed}, clone);
res.addState(new int[] { }, drawable);
return res;
}
如果我不克隆,那麼過濾器顯然適用於兩種狀態。我試過與mutate()
玩,但它沒有幫助..
任何想法?
更新:
接受的答案確實是克隆一個繪製。它並沒有幫助我,但是因爲我的一般功能在另一個問題上失敗了。看起來,當你將一個drawable添加到一個StateList時,它將失去所有的過濾器。
嗨,你有沒有找到一個解決方案drawables丟失過濾器?我遇到了同樣的問題:(我最終通過克隆位圖並逐個像素地應用濾鏡來從源圖像中生成其他圖像。是的,這是效率低下的,但我只處理了一堆小圖像 – port443
I無法用StateListDrawable解決它,但如果你不使用StateListDrawable並仍然失去你的過濾器,請確保你的位圖是可變的。有很好的相關問題:http://stackoverflow.com/questions/5499637/drawable-setcolorfilter -not-working-on-android-2-1,我也發現LightingColorFilter在PorterDuff失敗的地方工作..喜歡這個機器人:) – talkol
在這個鏈接很好的答案http://stackoverflow.com/questions/ 10889415 /添加一個顏色過濾器到可繪製的變化 - 所有按鈕使用相同的可繪製 – Alan