首先本文主要解決以下幾個問題:
1.什麼是DPI,什麼是dp,什麼是PX,什麼是desity,這些幹嘛用?
2.一張圖片在安卓中到底佔多少內存?
3.爲什麼安卓app的res目錄下要用多個文件夾存放圖片,有什麼作用?
先聊聊屏幕分辨率相關的知識。
像素:由圖像的小方格組成的,這些小方格的色彩數值和位置,決定了圖像呈現的樣子。
1像素就代表1px。
什麼是屏幕尺寸? 屏幕對角線的長度
什麼是屏幕分辨率 ? 屏幕分辨率=屏幕的寬有多少個像素*屏幕高有多少個像素。指顯示器能顯示的像素有多少。
屏幕大概分以下幾種分辨率:
1920*1080 =2073600像素,俗稱1080p屏幕。
2k屏,屏幕橫向像素達到2000以上。主流是2560*1440,還有2048×1536(QXGA)、2560×1600(WQXGA)、2560×1440(Quad HD),也是2k屏家族的。
4K屏,名稱來源於其橫向解析度約爲4000像素.屏幕分2種,有4096×2160和3840*2160。
什麼是DPI? 每英寸中的像素數。比如設備分辨率是320*240,屏幕的長2英寸,寬1.5英寸,dpi=320/2=240/1.5=160
什麼是density?每平方英寸的像素數。
但是在安卓中定義如下:
在DisplayMetrics類中屬性density的值爲dpi/160
density=dpi/160
什麼是dp?dp是安卓的特有單位,
dp=px/density
dp=px/(dpi/160)
如果dpi=160,那麼在這個設備上的1dp=1px
這裏展開說一下,其實我們藍湖上看到的1280*720,單位是dp
而實際的設備有多少PX呢。如果是2K屏幕 一般就是2560*1440 ,因爲density=px/dp ,也就是屏幕實際寬度/設計圖的寬度,或者屏幕實際高度/設計圖高度。
所以density=2560/1280=1440/720=2
來算算4K屏 按照4096*2160算 橫向 density = 4096/1280=3.2 縱向density=2160/720=3
大致可以看作 density=3
dp:安卓特殊的一種單位,是實際屏幕分辨率寬或者高/density
安卓的幾個文件夾定義:
drawable-ldpi:低分辨率(基本沒人用了):
density =0.75 , 分辨率是240*320, dp=px/0.75
drawable-mdpi:中分辨率
density=1 , 分辨率是320*480 ,dp=px/1
drawable-hdpi:高分辨率
density=1.5,分辨率是480*800,dp=px/1.5
drawable-xhdpi:較高分辨率
density=2,分辨率=720*1280,dp=px/2
drawable-xxhdpi:超級高分辨率
density=3 ,分辨率=1080*1920 ,dp=px/3
drawable-xxxhdpi:頂級分辨率
density=4,分辨率=2560*4096 ,dp=px/4
一般都是做法是一套xxhdpi的切圖,這樣可以向上和向下兼容,節省apk的大小
當然,現在項目需求是2K屏和4K屏,也可以在資源中放2套圖,這樣,低分辨率的屏幕不用因爲拿着高分辨率的圖渲染而浪費內存。
如果嚴格按照需求,只要在drawable-xhdpi(對應2k屏)和drawable-xxhdpi(對應4K屏)放入相應的圖片就能達到最好的圖片清晰度適配。
我們來計算一下一張圖片到底佔多少內存
這裏要補一些基礎知識
1G=1024M=1024*1024k=1024*1024*1024字節(Byte) =1024*1024*1024*8位(bit)
bit代表最基本的0或者1
安卓默認顏色是格式是ARGB_888 :
A代表透明度 ,取值範圍是0-255 換算成二進制就是 2的8次方 剛好就是1個byte =8bit
R代表紅色red,取值範圍0-255,也是相當於一個byte
G代表綠色green,取值範圍0-255,相當於一個byte
b代表藍色blue,取值範圍0-255.,相當於一個byte
任何顏色只要通過ARGB這4個元素的組合就能表現出來。
那一個像素需要多少內存呢?
答案是4個byte
那一張100px*100px的圖片在 2k屏幕中佔多少內存呢?
正常情況下不考慮安卓這邊做縮放處理
內存消耗=圖片長度*圖片寬度*4=40000B≈39.06K
這裏要考慮到設別本身的dpi,還有文件存放的目錄
一張圖片實際在安卓設備中消耗的內存=圖片長*圖片寬*4*(設備橫向的dpi/圖片存放文件夾對應的dpi)*(設備縱向dpi/圖片存放文件夾對應的dpi)
如下舉例說明:
比如 當前設備density=2,也就是dpi=2*160=320,這個圖片放在xhdpi中(這個文件夾本身對應dpi=320),
內存消耗的計算公式是 100*100*4*(320/320)*(320/320)≈39.06K
那麼這張圖片的內存消耗是39.06K
如果當前設備density=3,也就是dpi=3*160=480,這個圖片仍然放在xhdpi中(這個文件夾本身對應dpi=320)
內存消耗的計算公式是100*100*4*(480/320)*(480/320)=87.89k
安卓圖片資源的尋找規則是按照優先找設備dpi相匹配的圖片資源文件夾的資源,如果沒有找到,就取更高分辨率文件夾的資源,如果還找不到,就取低分辨率的文件夾資源。
各位看客老爺,如果這篇文章對你有把幫助,請點贊!