【Android】關於Drawable共用問題的初步探索

 在進入正題以前,先回顧一下以前寫的文章《Android內存優化測試(原創)》,html

文章中有提到,儘可能使用Drawable而非Bitmap來存放圖片資源,由於Drawable佔用的內存更小,能夠在必定程度上避免OOM錯誤。測試

        最近遇到了一個十分奇怪的問題,令我開始想要深刻了解Drawable的原理。優化

        問題描述:url

        相信不少開發者都喜歡使用自定義的TitleBar組件,而不是用系統自帶的ActionBar或者AppBar。我遇到的問題,就是跟TitleBar的Drawable相關。3d

        一、正常狀況下是這樣的調試

        二、由於產品需求,須要將返回按鈕變爲灰色,按鈕的圖標也變爲灰色,以下:htm

        三、這個時候若是進入到其它頁面,會驚訝都發現,顯示不正常,以下:blog

 

        四、有時候返回原來的頁面時,還會變成這樣:事件

        

         文字和圖標的顏色對不上。以上狀況大部分國內手機都會,像HTC就不會。圖片

        通過調試以後,「編輯頭像」那個頁面的按鈕變灰,是由於「個人信息」中調用了設置爲灰色的代碼(drawableLeft.setColorFilter(0xbbbbbb,PorterDuff.Mode.SRC_IN);)

        反覆修改都沒有結果,最後想,會不會是由於是Drawable在內存中是共用的,不一樣的引用作了修改以後,其它Drawable也會發生相應的變化呢?

        因而寫了個例子測試一下

       1、這個例子的界面是這樣的:

       2XML代碼以下:

        3、接着編寫Activity的代碼,以下:

        以上代碼的意思是,當Activity被觸摸產生ACTION_UP事件時,更改左邊TextView的CompoundDrawable的顏色,同時讓右邊的TextView重繪。

        注意,這裏並無更改右邊TextView的Drawable,只是讓它重繪。

         4、最後運行的效果以下:

        上面的效果圖代表,當左邊的Drawable發生變化的時候,右邊的Drawable也發生變化了,甚至連標題欄也發生了變化

       總結一下:對於引用同一個資源ID的不一樣Drawable,當其中一個發生了變化,其它Drawable也會跟着發生變化。

        其實,這也能夠證實引用同一個資源ID的不一樣Drawable在內存中是共用一個Bitmap

       這就解釋了最近遇到的問題了

       關於Drawable的深刻了解準備放到下次再說,先看看源碼總結一下先。

 

 

http://blog.sina.com.cn/s/blog_5de73d0b0102xbak.html

相關文章
相關標籤/搜索