android 屏幕密度范围,Android屏幕密度

概念:

一、几个概念

1、ppi-pixel per inch,ppi单位长度像素个数。计算方法是宽宽 + 长长,然后开方(即对角线的像素个数),然后除以对角线的长度。

例如iphone4s:960x640像素,对角线3.5英寸,则ppi=(960*960 +640*640)/ 3.5 = 329.6ppi

2、dpi-dolt per inch,dpi单位长度像素点数,感觉和ppi定义类似,其计算方法也一样,可以粗略理解为两者一样,只不过这里一个点代表一个像素.如果A手机屏幕宽度是5CM,B手机宽度是10Cm,宽度分辨率都是320,那么显示同一张图片时,B手机上的图片就会显的大一点,并且没有A手机上的清晰。为什么呢,这就是我们常见的密度(DPI)概念,即每英寸多少个点。—–(理解dp:屏幕分辨率;px:像素)

3、dip - density-independent pixel:dip密度无关像素,其实并不是像素,与pixel有如下转换关系:

px = dp * (dip / 160); (之所以要除以160,是因为定义对于dip为160的屏幕,其一个像素与一个dp相同)

4、屏幕大小(Screen Size):屏幕的实际尺寸,指屏幕对角线的长度,单位inch,android中根据屏幕大小,把屏幕氛围几个等级:small、normal、large、extra-large

5、屏幕密度(Screen density):用dpi来表示,android把屏幕密度分为:low、medium, high、extra high

6、sp(scaled-independent pixel):可以把它理解为dip(或dp),只不过专门用来表示字符大小

7、分辨率:显示器能够示显的像素多少。(水平×垂直 如1028×768)

ldpi: 屏幕密度为120的手机设备

mdpi: 屏幕密度为160的手机设备(此为baseline,其他均以此为基准,在此设备上,1dp = 1px)

hdpi: 屏幕密度为240的手机设备

xhdpi: 屏幕密度为320的手机设备

xxhdpi:屏幕密度为480的手机设备

如果是480x800的切图,则应该放入drawable-hdpi目录下,

如果是320x480的切图,则应该放在mdpi目录下。

如果是720x1280的切图,则应该放在xhdpi目录下。

把同样图片放在不同的drawable文件夹中,显示效果是不一样的。效果如下

0818b9ca8b590ca3270a3433284dd417.png

Tip1:屏幕密度的应用:

已知:屏幕密度(Screen density):用dpi来表示,android把屏幕密度分为:low、medium, high、extra high。在实际应用中,与图片显示有关。

0818b9ca8b590ca3270a3433284dd417.png

从上表可以得出如下结论

1. 图片放在drawable中,等同于放在drawable-mdpi中,原因为:drawable目录不具有屏幕密度特性,所以采用基准值,即mdpi

2. 图片放在某个特定drawable中,比如drawable-hdpi,如果设备的屏幕密度高于当前drawable目录所代表的密度,则图片会被放大,否则会被缩小;放大或缩小比例 = 设备屏幕密度 / drawable目录所代表的屏幕密度

3. 为了更全面的适配所有设备,我们应该提供一套针对主流屏幕密度的图片(目前为hdpi或xhdpi),其他密度通过系统自动缩放得到图片

Tip2:dp

dp工作原理

最关键要记住一个公式:

android在计算pixel值时会首先判断屏幕的密度。如果我们把mdpi设为1,则hdpi就等于1.5. 如果我们使用dp为单位,android在转换为pixel时会依据下面公式:

px = dp * density;

像素数 = dp * 每英寸的逻辑点数。

dp表示独立像素密度,所谓独立,就是不依赖与屏幕的密度。

从本质上来看,dp其实表示是相同的物理长度,注:不是以像素为单位,而是以inch为单位。

例如对于mdpi,长度为m inch的屏幕,其像素数为n1,dp数为n2.

对于hdpi,也是长度为m inch,包含的像素数为n1 * 1.5. 根据公式可以算出,其dp值为n1 * 1.5 / 1.5 = n1. 对于xhdpi的也是n1.

即:相同的物理长度其dp值相同。

float a = this.getResources().getDisplayMetrics().density; //dp

int b = this.getResources().getDisplayMetrics().densityDpi; //密度值

可以通过上面的代码来获取当前设备的屏幕密度,a为dp值,b为密度值,如a=1则表示你的设备屏幕类型为Mdpi

DisplayMetrics dm = new DisplayMetrics();

dm = cx.getApplicationContext().getResources().getDisplayMetrics();

int screenWidth = dm.widthPixels; 屏幕宽度

图片显示:

android系统加载图片资源遵循下面的规则:首先判断手机的屏幕密度,然后在相应的密度下文件夹中查找图片资源。如果找到,则进行显示。如果找不到,则会从drawable或者其他drawable-*文件夹中寻找。找到后,将文件夹所表示的密度与手机实际密度进行比较,从而缩放图片。例如在drawable下找到资源(等价于从drawable-mdpi),而手机又是hdpi的,这样android在显示图片时会将图片进行放大,以满足hdpi手机显示需要。不难想象,图片肯定会变模糊。

如果放错文件夹,系统会进行相应的缩放,使图片进行错误的缩放。例如hdpi的图片放到mdpi中,在hdpi的手机显示,会比原图片大

设计给切图,最好根据那个dpi呢?是都可以吗?一般应该给480*800的hdpi的切图。这样对于mdpi,可以自动缩小。图像显示质量不受影响。对于xdpi,放大幅度不大,图像显示质量影响较小。

那么为什么不用xhdpi呢,这样都是缩小图像不是更好吗?有两个理由,一是增大了apk的尺寸,另一个就是容易引起切图的变形,影响显示。主要是对于.9的图片,有对某一方向进行了压缩,如果设置时,拉伸区域太小,再压缩时可能变形。当然这也不是绝对的,可以通过增大.9.png文件的拉伸区域来实现。 或许还有个理由,xhpi的机型比较不占多数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值