一、首先看幾個基本概念
● 解析度:解析度就是手機螢幕的==畫素點數==,一般描述成螢幕的“寬×高”,安卓手機螢幕常見的解析度有480×800、720×1280、1080×1920等。720×1280表示此螢幕在寬度方向有720個畫素,在高度方向有1280個畫素。
● 螢幕大小 : 螢幕大小是手機對角線的物理尺寸,以英寸(inch)為單位。比如某某手機為“5寸大屏手機”,就是指對角線的尺寸,5寸×2.54釐米/寸=12.7釐米。
● 螢幕密度:就是每英寸的畫素點數,數值越高當然顯示越細膩;就是螢幕對角線的長度 / 螢幕大小,如下圖:
安卓手機標準的螢幕密度圖,如下:
xxx-hdpi 的 密度值是 640,解析度是 3840*2160
二、圖片所佔的記憶體是如何計算的?
先說結論啊。可分為以下幾種情況:
現在有一張圖片: ==寬度 = 450畫素==,==高度 = 300畫素==
1. 如果在與手機螢幕密度相同的資料夾下存在此資源,那麼記憶體=圖片的寬度(畫素)圖片的高度(畫素)色彩格式所佔的位元組數;
比方說 你的手機解析度 是 ==xxhdpi==,你有一張圖片放在 ==drawable-xxhdpi==資料夾中,圖片的色彩格式為 ARGB-8888,即每個畫素站4個位元組;
圖片佔用的記憶體 = 450 300 4 = 540_000 位元組= 527 kb
2. 如果手機螢幕密度相同的資料夾下不存在此檔案,而在大於手機螢幕密度的資料夾下存在此資源, 會進行==縮小==相應的倍數的平方。
xx-hdpi 的密度值是 480, xxx-hdpi 的密度值是640
比方說 你的手機還是 ==xxhdpi== ,此時你的圖片放在 ==drawable-xxxhdpi==資料夾下;
圖片佔用的記憶體 = 450 / (640/480) 300 / (640/480) 4 = 303_750 位元組 = 297kb
3. 若在大於手機螢幕密度的資料夾下沒找到此資源,則會向小於手機螢幕密度的資料夾下查詢,如果存在,則會進行==放大==相應的倍數的平方。
比方說 你的手機還是 ==xxhdpi== ,此時你的圖片放在 ==drawable-xhdpi==資料夾下;
xx-hdpi 的密度值是 480, x-hdpi 的密度值是320
圖片佔用的記憶體 = 400 (480 / 320) 350 (480 / 320) 4 = 1215_000 位元組 =1187 kb
三、驗證結果
驗證的手機為 華為P40: 解析度為 :2340 * 1080 螢幕尺寸:6.1 可以算出來,螢幕密度為 422,即 xx-hdpi。
圖片大小:450*300
驗證1:手機螢幕密度與圖片所在的資料夾解析度相同
即 圖片也放在 xx-hdpi 目錄下:
計算圖片的寬度和高度:
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.a1);
int width = bm.getWidth();
int height = bm.getHeight();
Log.e("ARouterMainActivity", "width = " + width + ", height = " + height);
可以驗證上面的情況1啦。
驗證情況2:如果手機螢幕密度相同的資料夾下不存在此檔案,而在大於手機螢幕密度的資料夾下存在此資源:
即 寬度 = 圖片寬度 450 / (640/480) = 337.5。 高度 = 圖片寬度 300 / (640/480) = 225。 此時的記憶體= 337.5 225 4 = 303_750 位元組
即情況2也滿足, ==情況3==就不驗證了,感興趣的可以自己驗證下。
四、結論
- 將圖片放在比手機解析度小的目錄,圖片所佔的記憶體會 放大 手機密度/圖片對應目錄的密度的平方倍。
- 將圖片放在比手機解析度大的目錄,圖片所佔的記憶體會 縮小 圖片對應目錄的密度 / 手機密度的平方倍。
- 相等情況下: 等於 圖片的寬度 圖片的高度 色彩格式對應的位元組數