原文:Android dev tip: Replace PNG assets with XML drawables
譯者注:我個人在開發(fā)中還是比較喜歡用xml drawable的方式來替代一些可以被替代的圖片 职恳,看的n多圖片就鬧心部凑。
Android開發(fā)中解決OutOfMemoryException問題最好方法是永遠不要產(chǎn)生它們,所以限制app使用內存是非常重要的煮纵。有時候這意味要涉及到設計師胖腾。讓我用一個案例來解釋為什么呢采呐。低淡。旧蛾。
你的設計師給了你一個png像上面的設計
小事一件张遭,就是300*100dp的圖片邓萨。然后放進界面中,運行app菊卷,一切都正常運行缔恳,直到你查看Android Studio的內存監(jiān)視器Memory Monitor然后注意到你的內存飆升了大概1MB.
發(fā)生了什么?
你看一下你剛才添加的png,只有10kb,心想:應該不是它引起的吧洁闰?不褐耳,就是它。你在文件夾里面看到是壓縮的圖片文件渴庆,但是Android加載它的時候已經(jīng)不是壓縮文件了铃芦。它會渲染你的png成Bitmap,它以非壓縮的方式存儲圖片雅镊。就是每個像素顏色的一個大矩陣。默認刃滓,Android用ARGB_8888格式就是每個像素4個字節(jié)來處理仁烹。是的,現(xiàn)在看看XXHDPI文件夾咧虎,我們的300dp事實上是900像素卓缰,這意味的我們的“小圖片” 900*300轉換成Bitmap時用了1080000字節(jié)(1.03MB)
好吧,非常糟糕
那么現(xiàn)在擺在眼前的是:1MB快要讓你的app內存溢出了砰诵,然后你要告訴你的設計師說你們這群渣渣征唬,快要弄死我的APP了?(不要這樣做,容易干架)
有一個更好的方式實現(xiàn)這個按鈕界面茁彭,那就是用XML Drawable和一個Button
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners android:radius="10dp" />
<solid android:color="#FFFFFF" />
<stroke
android:color="#000000"
android:width="5dp"
/>
</shape>
<Button
android:layout_width="300dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:background="@drawable/button_xml"
android:text="I'm A Button!"
android:textSize="24sp"
android:textAllCaps="false"
/>
讓我們再來看一下占用內存
XML drawable只用了504字節(jié)內存总寒。太好了
最后總結
顯然,并不是每個文件都可以用這種方式替代的理肺,一旦遇到一些基本的形狀最好用xml替代它摄闸。這樣當你面對不可避免的會OutOfMemoryException,你起碼延遲了出現(xiàn)的時間妹萨。