Drawable共享狀態(tài)問(wèn)題

結(jié)論:android中從同一個(gè)資源文件中加載出來(lái)的drawable會(huì)共享狀態(tài),如果有加載出來(lái)多個(gè)drawable的實(shí)例對(duì)象,當(dāng)改變了其中一個(gè)的狀態(tài)時(shí),其他drawable的狀態(tài)也會(huì)相應(yīng)改變。

實(shí)例:在修改一個(gè)view,或者它的background,即時(shí)是新創(chuàng)建的view對(duì)象,如果它是從同一個(gè)xml中加載出來(lái)的(包括矢量圖、shape等),在代碼中動(dòng)態(tài)修改的它顏色,會(huì)影響到其他從該xml加載出的view。這是因?yàn)樗膍GradientState是被復(fù)用的。

下面兩個(gè)圖,是從同一個(gè)xml中加載的view對(duì)象(在recyclerView的兩個(gè)item中),在動(dòng)態(tài)改變了第二個(gè)view的background顏色后,如果第一個(gè)view所在的item重新bind,新創(chuàng)建出的view,也表現(xiàn)出和原來(lái)第二個(gè)view同樣的背景顏色。修改顏色的方法如下:

private fun changeBackgroundColor(@ColorInt argb: Int?) {
        argb?.let {
            if (mRootView?.background is GradientDrawable) {
                val grad: GradientDrawable = mRootView?.background as GradientDrawable
                grad.setColor(argb)
            }
        }
    }
View-1的background

--

View-2的background

可以看到,這個(gè)兩個(gè)view的background對(duì)象,確實(shí)是兩個(gè)不同的對(duì)象,但是他們的mGradientState,是同一個(gè)GradientState對(duì)象,這里發(fā)生了復(fù)用。

所以,在動(dòng)態(tài)修改drawable的顏色(或者GradientState中其他屬性)時(shí),需要將改該drawable設(shè)置為mutate狀態(tài),即調(diào)用mutate()方法,該方法會(huì)為drawable創(chuàng)建新的mGradientState(Drawable的各派生類(lèi)實(shí)現(xiàn)有所不同)。舉例如下:GradientDrawable.mutate()方法如下:


GradientDrawable.mutate()

所以需要將上述修改背景顏色的方法,修改如下:

    private fun changeBackgroundColor(@ColorInt argb: Int?) {
        argb?.let {
            if (mRootView?.background is GradientDrawable) {
                val grad: GradientDrawable = (mRootView?.background as GradientDrawable).mutate() as GradientDrawable
                grad.setColor(argb)
            }
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線(xiàn)程,因...
    小菜c閱讀 7,330評(píng)論 0 17
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,656評(píng)論 1 32
  • 前段時(shí)間一直整理java方面的知識(shí)了,先過(guò)渡一段時(shí)間到android上面來(lái),后期還是會(huì)整理java相關(guān)的東西,至于...
    的一幕閱讀 3,345評(píng)論 0 21
  • 1、Drawable 簡(jiǎn)介 Drawable——可簡(jiǎn)單理解為可繪制物,表示一些可以繪制在 Canvas 上的對(duì)象。...
    牧秦丶閱讀 15,349評(píng)論 0 15
  • 概述 Android把任何可繪制在屏幕上的圖形圖像都稱(chēng)為drawable 資源,你可以通過(guò)類(lèi)似getDrawabl...
    小蕓論閱讀 2,903評(píng)論 2 5

友情鏈接更多精彩內(nèi)容