由于Android的屏幕尺寸的碎片化,時至今日Android的UI適配依然是開發(fā)中必不可少的步驟。
UI適配的適配,是通過dp、權(quán)重,通配符等方式使View能按我們意愿的準確的顯示在不同手機上。除了對view的尺寸適配,我們還要對圖片適配,合適的把切圖放在正確的位置,能有效的降低內(nèi)存占用和圖片變形。
本篇是對圖片適配的探索
首先,準備一張200*200像素的圖片(img.jpg)放在Android Studio (以下簡稱AS)的drawable文件目錄下,
然后對比不同drawable在不同手機(dpi)下,圖片的大小。
>>> xml
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img"
/>
>>> java 打印當前手機中圖片的大小
private void printBitmapSize(ImageView imageView) {
Drawable drawable = imageView.getDrawable();
if (drawable != null) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
Log.i("sky", " width = " + bitmap.getWidth() + " height = " + bitmap.getHeight());
} else {
Log.i("sky", "Drawable is null !");
}
}
Android中圖片默認類型是AEGB_8888,故width*height4=占用內(nèi)存大小(B)
通過查看AS中的profiler查看內(nèi)存占用,
MI 4 (MIUI10、1980*1080、xxhdpi、480dpi)當不加載圖片時的初始內(nèi)存為23.6*
| drawable | 內(nèi)存大小 | 圖片尺寸 |
|---|---|---|
| mdpi | 55.6-23.6= 30m | 3000 ->34.3 |
| hdpi | 35.6-23.6= 12m | 2000 -> 15.25 |
| xhdpi | 29.2-23.6= 5.6 | 1500 -> 8.58 |
| xxhdpi | 21.1-23.6= -2.5 | 1000 -> 3.81 |
| xxxhdpi | 19-23.6= -4.6 | 750 -> 2.14 |
MZ 6p(Flyme7、1920*1080、 xxhdpi、480dpi)當不加載圖片的初始內(nèi)存為41.4
| drawable | 內(nèi)存大小 | 圖片尺寸 |
|---|---|---|
| mdpi | 116.5-41.4= 75.1 | 3000->34.3 |
| hdpi | 75.1-41.4= 33.7 | 2000->15.25 |
| xhdpi | 58.6-41.4= 17.2 | 1500->8.58 |
| xxhdpi | 50.4-41.4= 9.0 | 1000->3.81 |
| xxxhdpi | 47.1-41.4= 5.7 | 750->2.14 |
從上面可以看出本來應該放在xxhdpi中的圖片,當放置低于xxhdpi的文件夾目錄,會產(chǎn)生內(nèi)存占用增大(圖片顯示尺寸增大);當放置高于xxhdpi的文件夾目錄,會產(chǎn)生內(nèi)存占用減?。▓D片顯示尺寸減小);
PS:敲黑板,仔細看參數(shù)的同學一定發(fā)現(xiàn)了計算的內(nèi)存占用和實際內(nèi)存占用對不上,在小米4中甚至出現(xiàn)了加載圖片內(nèi)存反而變小的情況。。。。
原因呢?
我也不知道。有知道的同學請指教。
不過我們的重點不在值是否正確,而是放在不同dpi目錄下對內(nèi)存影響的趨勢,對不!對比上面表格內(nèi)的內(nèi)存占用基本也符合下圖的比例(2 3 4 6 8)。

補充下,(點9)圖片,左上是拉伸,右下是內(nèi)容顯示區(qū)域
圖片適配到這里已經(jīng)結(jié)束了。
簡單總結(jié)下:把正確的切圖放在正確的dpi文件目錄,能有效的解決開發(fā)中可能遇到的圖片內(nèi)存占用過大和顯示尺寸不正確情況;