Android一個小知識點: 多個介面同時使用一個資源佈局的時候,修改背景需要注意的坑
需求是將系統中底部的白色背景改成黑色背景
=》
查詢工程看底部呼叫的程式碼是公共程式碼位於,
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沒有效果。
相關文章
- 使用各類BeanUtils的時候,切記注意這個坑!Bean
- 每日一個知識點:什麼時候會觸發Full GCGC
- 一個任務代辦的定時提醒應該需要掌握哪些知識點?
- golang split需要注意的一個點Golang
- 一行命令同時修改maven專案中多個mudule的版本號Maven
- 當我們開發一個介面時需要注意些什麼
- JAVA 兩個類同時實現同一個介面的方法Java
- 如何一臺機器同時使用多個git祕鑰Git
- Android 實現一個通用的圓角佈局Android
- 怎麼給多個影片同時新增上背景圖
- 使用regulator_get時的一個小注意事項
- video.js 一個頁面同時播放多個視訊IDEJS
- 學習openresty時,nginx的一個坑RESTNginx
- 關於range的一個知識點
- foreach使用引用時的一個坑-foreach原始碼分析原始碼
- 多個知乎賬號一起登陸,同時管理運營的神器!
- 一個表單同時提交多條記錄
- Android的四個基本佈局Android
- adb 可以多個視窗同時連線一個裝置嗎?
- 關於 JavaScript 字串的一個小知識JavaScript字串
- 微信小程式開發需要注意的29個坑微信小程式
- linux安裝nginx時遇到的一個坑LinuxNginx
- PHP Composer 的一個小坑PHP
- Golang Recover的一個小坑Golang
- python 同時迭代多個序列Python
- 使用 yogaKit 實現一個資訊流佈局
- JavaScript ES6 Fetch API時需要注意的一個Cookie問題JavaScriptAPICookie
- 掌握一個事物時所需要學會的
- selenium-grid 有多個節點,但 pytest.main 批次執行用例,每次只有一個節點執行用例,不能同時多個節點執行,要怎樣才能多個節點同時執行AI
- Redis 修改過期 key 的一個坑Redis
- 利用js寫一個分時問候JS
- 關於C++ scanf的一個小知識C++
- 運維需要掌握的12個路由知識點運維路由
- 在一臺Mac上不同平臺同時使用多個Git賬號MacGit
- npm 設定同時從多個包源載入包的方法NPM
- go select case的一個小坑Go
- 你認為一個好的佈局應該是什麼樣的?有哪些需要注意的地方?
- 存在多個不同註冊中心的時候,如何平滑的統一註冊中心?