如何解決Android中使用背景色Alpha值遇到的一個(gè)坑-創(chuàng)新互聯(lián)

這篇文章主要介紹如何解決Android中使用背景色Alpha值遇到的一個(gè)坑,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

成都創(chuàng)新互聯(lián)公司主營寧武網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),寧武h5微信平臺小程序開發(fā)搭建,寧武網(wǎng)站營銷推廣歡迎寧武等地區(qū)企業(yè)咨詢

前言

Android通過設(shè)置Alpha值圖片淡化、透明度大家應(yīng)該都知道,下面是段簡單的示例代碼:

View v = findViewById(R.id.img_layout); 
v.getBackground().setAlpha(77);// 設(shè)置背景圖片透明度;0~255透明度值

以上是個(gè)簡單的介紹,但本文介紹的是公司項(xiàng)目一個(gè)留了很久的 bug,嘗試找了很多次原因都沒有頭緒。

這個(gè) bug 是這樣的:

定義了一個(gè)主題色為例如 #FF0000,很多界面控件都用了這個(gè)顏色??墒沁@個(gè)顏色在 app 使用過程中用著用著就會出現(xiàn)變成了透明的情況,而且出現(xiàn)透明之后,所有使用這個(gè)顏色的控件都會變成透明。

更奇怪的是,重啟應(yīng)用會恢復(fù)這個(gè)問題,但是操作一會兒又會出現(xiàn)。

項(xiàng)目有個(gè)隨著頁面滾動標(biāo)題欄從透明過渡到主題色的界面實(shí)現(xiàn),類似于 Design 庫中 AppBar 的那種效果。實(shí)現(xiàn)方法是這樣的:

// 滾動監(jiān)聽器 偽代碼
someParams -> {
 //...
 view.getBackground().setAlpha(percent);
 //...
}

今天「代碼級復(fù)用」這一 feature 時(shí),發(fā)現(xiàn)把 bug 也引入了新項(xiàng)目,才發(fā)現(xiàn)這個(gè)實(shí)現(xiàn)的問題之所在……

首先,view.getBackground() 獲得的是一個(gè) ColorDrawable,然后給這個(gè) ColorDrawable 設(shè)置 Alpha 值的話,會影響所有設(shè)置 background 為這個(gè)顏色的背景色的 Alpha 值。

然后就寫了個(gè)小 demo 驗(yàn)證了一下這個(gè)說法,雖然不是立即生效的,然后返回退出應(yīng)用后,兩個(gè)相同顏色背景的 view,改變其中一個(gè)確實(shí)會影響到另一個(gè)。

當(dāng)時(shí)反應(yīng)就是:WTF?難不成全局的相同顏色的 Drawable 都是同一個(gè)對象?不過很快打印了一下 background 的 drawable 對象驗(yàn)證了并不是這樣——雖然這些 view 獲得的 ColorDrawable 的 Alpha 值都相同,但 hashcode 都是不同的。

所以我更傾向于這是 Android 內(nèi)存優(yōu)化帶來的 bug,即使這個(gè)顏色在定義時(shí)就有 Alpha 值,在修改后也會被忽略,并影響到其他的 view。該問題只在布局文件里設(shè)置 background 為一個(gè) color 的 id 或者值,或者 setBackgroundResource 為一個(gè) color 時(shí)存在。如果使用 new ColorDrawable(int) 來構(gòu)造一個(gè)使用相同顏色值的對象則不受影響,我目前也正是使用這個(gè)方法來躲避掉這個(gè) feature。

UPDATE:

發(fā)現(xiàn)文檔里有這個(gè)方法,驗(yàn)證了之前的說法,從同一資源加載的 drawable 確實(shí)會共享狀態(tài),不過有一個(gè) mutate 方法來禁用這一特性。文檔如下:

Drawable mutate ()

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.

翻譯:

Drawable mutate ()

讓一個(gè) Drawable 變?yōu)?mutable 的。這個(gè)操作是不可逆的。一個(gè) mutable 的 drawable 可以保證不會分享自己的狀態(tài)給其他 drawable。當(dāng)一個(gè) drawable 是從 resource 加載的,在需要更改它狀態(tài)時(shí)這個(gè)方法特別有用。在默認(rèn)情況下,所有從相同 resource 的 drawable 的實(shí)例是共享一個(gè)通用狀態(tài)的;如果你修改了其中一個(gè)的狀態(tài),所有其他的實(shí)例也會收到相同的改動。在一個(gè)已經(jīng)是可變的 drawable 上調(diào)用該方法沒有效果。

所以,上述代碼只要在 drawable 獲取之后,調(diào)用一下 mutate() 方法即可。

以上是“如何解決Android中使用背景色Alpha值遇到的一個(gè)坑”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

標(biāo)題名稱:如何解決Android中使用背景色Alpha值遇到的一個(gè)坑-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://muchs.cn/article12/cddodc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、動態(tài)網(wǎng)站、虛擬主機(jī)、企業(yè)網(wǎng)站制作自適應(yīng)網(wǎng)站、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站