Android一個小知識點: 多個介面同時使用一個資源佈局的時候,修改背景需要注意的坑

大笨豬的小槑發表於2020-12-28
需求是將系統中底部的白色背景改成黑色背景
  =》
查詢工程看底部呼叫的程式碼是公共程式碼位於,
idh.code\vendor\sprd\platform\frameworks\support\featurebar\*
於是將color由white修改為black,以為就好了.結果發現大部分介面如預期都好了,可是桌面部分應用底部顯示還是白色,錄音機應用顯示為半灰色。查詢程式碼發現這些問題介面中並未對此背景進行二次設定color,再這些介面重新設定color又好了,百思不得其解.......
今天查詢了一天原因,終於從這個坑裡面拔出來了……
原因是
android中從同一個資原始檔中載入出來的drawable會共享狀態,如果你載入出來多個drawable,當改變了其中一個的狀態時,其他drawable的狀態也會相應改變。
在待機桌面介面的時候,對底部的背景alpha進行了修改:
        FeatureBarUtil.setBackgroundAlpha(mFeatureBarHelper,
                Math.round(255 * (visible ? mSoftBarAlpha : 1.0f)));
       public static void setBackgroundAlpha(FeatureBarHelper fbh, int alpha) {
        Drawable bg = getBackground(fbh);
        if (bg != null) {
            bg.setAlpha(alpha);
        }
    }
解決方案:
 
方案解釋:
/**
* Make this drawable mutable. This operation cannot be reversed. A mutable
* drawable is guaranteed to not share its state with any other drawable.
* This is especially useful when you need to modify properties of drawables
* loaded from resources. By default, all drawables instances loaded from
* the same resource share a common state; if you modify the state of one
* instance, all the other instances will receive the same modification.
*
* Calling this method on a mutable Drawable will have no effect.
*
* @return This drawable.
* @see ConstantState
* @see #getConstantState()
*/
public Drawable mutate() {
return this;
}
 
翻譯過來就是:
使這個drawable變得狀態不定。這個操作不能還原(變為不定後就不能變為原來的狀態)。一個狀態不定的drawable可以保證它不與其他任何一個drawabe共享它的狀態。這對於你需要更改從同一資源載入來的drawable的屬性時非常有用。 預設情況下,所有的從同一資源(R.drawable.XXX)載入來的drawable例項都共享一個共用的狀態,如果你更改一個例項的狀態,其他所有的例項都會收到相同的通知。 這個方法對於已經是mutable的drawable沒有效果。
 
 

相關文章