天天看點

了解dpi,ppi,dp,px與android bitmap的關系

  • 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;