安卓的圖片佔用內存,圖片分辨率,圖片適配不同屏幕的研究

首先本文主要解決以下幾個問題:

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相匹配的圖片資源文件夾的資源,如果沒有找到,就取更高分辨率文件夾的資源,如果還找不到,就取低分辨率的文件夾資源。

 

 

各位看客老爺,如果這篇文章對你有把幫助,請點贊!

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章