- ppi
pixel per inch,每英寸像素數,針對顯示器的設計時,dpi=ppi。ppi計算方法是長寬各自平方之和開方,除以對角線長度(機關英寸)。
- dpi
dot per inch,每英寸多少點,是由ppi确定的。實際上dpi有:
-
- low:120
- medium:160
- hdpi:240
- xhdpi:260, 280, 300, 320
- xxhdpi:340, 360, 400, 420, 480
- xxxhdpi: 560, 640
我們可以通過
getResources().getDisplayMetrics().densityDpi
擷取手機實際的dpi。
可以更改手機的dip:
-
- 需要root手機
- 更改/system/build.prop中的ro.sf.lcd_density屬性,這個值越小,螢幕的密度越高
- adb reboot重新開機手機
快速檢視手機螢幕資訊:
adb shell dumpsys display | findstr DisplayDeviceInfo
- dp或dip
是android開發用的機關,1dp表示在螢幕點密度為160ppi時1px長度;因為android裝置螢幕衆多,不可能為每個螢幕單獨開發,是以用公式 px=dp*(ppi/160) 來計算在不同螢幕上的像素數。
舉例:
HVGA屏320*480,一般是3.5寸屏,計算點密度為: √(320^2 + 480^2) / 3.5 = 164,約等于160,1dp=1px;
WVGA屏480*800,按3.8寸屏,點密度:√(320^2 + 480^2) / 3.5 = 245,約等于240,1dp=1.5px;
- px
像素(pixel),螢幕上的實體點,最小的獨立顯示機關。
- 與圖檔記憶體的關系
如果将180*180的圖檔放hdpi目錄中,那實際顯示的圖檔大小應該為 180 * (560/240) + 0.5f = 420px,圖檔的大小應該為420px,同理:
放入xhdpi目錄中,實際大小應該為 180 * (560/320) + 0.5f = 315px
放入xxhdpi目錄中,實際大小應該為 180 * (560/480) + 0.5f = 210px
現在我們知道一張圖檔放置在不同的資源目錄中,系統decode的bitmap的size大小是如何計算了。那一張圖檔大概占多少記憶體?其實隻用看一個像素占用多少記憶體就可以嗎?
我們知道螢幕上的顔色是有R,G,B加透明度表示的,Android官方支援的rgb格式,主要是: alpha_8, rgb_565, argb_4444, argb_8888這幾種。
以argb_8888為例,表示一個像素點,使用8位表示透明度,8位表示Red, 8位表示Green, 8位表示Blue,加起來,一個像素就需要4byte,同理,rgb_565一個像素需要2byte。
Android decode資源圖檔時預設會選擇argb_8888,我們知道将180*180放入hdpi目錄中,那實際大小應該為420px,那像素記憶體大小為 420 * 420 * 4 = 705600byte = 689kb。同理:
放入xhdpi目錄中,實際大小應該為 180 * (560/320) + 0.5f = 315px,那像素記憶體大小為 315 * 315 * 4 = 396900byte = 387.6kb;
放入xxhdpi目錄中,實際大小應該為 180 * (560/480) + 0.5f = 210px,那像素記憶體大小為 210 * 210 * 4 = 176400byte = 172.2kb;