了解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

 

原文地址:https://www.cnblogs.com/johnnyzhao/p/14143227.html