Android分辨率适配

DPI:每英寸像素数

简单的屏幕分辨率计算方法:

DisplayMetrics metrics = this.getResources().getDisplayMetrics();
float density = metrics.density;
int dpi = metrics.densityDpi;
int heightPixels = metrics.heightPixels;
int widthPixels = metrics.widthPixels;
Log.e("---metrics---", "比例:"+density+"dpi:"+dpi+"高像素:"+heightPixels+"宽像素:"+widthPixels);


在给手机屏幕适配的时候有下面几点需要注意的地方:
1、使用dpi 屏幕密度去适配。
2、公共的部分大小和字体的大小都应该统一去定义,比如标题栏、文章内容字体大小等等。
3、非主流的分辨率、厂商改变过density的手机,我们都可能要做单独的处理。

density和分辨率的关系表
屏幕级别
屏幕密度
比率(相对)
物理大小(英寸)
像素大小
通常的分辨率
ldpi
120
3
0.75
1
120

mdpi
160
4
1
1
160
320*480
hdpi
240
6
1.5
1
240
480*800
xhdpi
320
8
2
1
320
720*1280
xxhdpi
480
12
3
1
480
1080*1800
xxxhdpi
640
16
4
1
648
3840×2160
hdpi 比率是1,其他的按照这个比率可以计算出demins的值,当屏幕密度是160,1dp=1px,
这下我们可以建自己的demins.xml来适配


注:Android studio mipmap文件夹只存放启动图标icon

概念区分

  • px(pixels)像素,屏幕上的点,不同设备显示效果相同,例如,HVGA代表320×480像素。
  • in(英寸)屏幕的物理尺寸, 每英寸等于2.54厘米。
    • 例如我们经常说的手机屏幕大小有,5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是4英寸,表示手机的屏幕(可视区域)对角线长度是4 X 2.54 = 10.16厘米。
  • pt(point)标准长度单位, 1pt=1/72英寸,用于印刷业,UI设计师会用,iOS字体单位,Android开发不涉及。
  • dpi(dots per inch) 打印分辨率,每英寸所能打印的点数,即打印精度; 每英寸点数,即每英寸包含像素个数。
    • 比如320X480分辨率的手机,宽2英寸,高3英寸, 每英寸包含的像素点的数量为320/2=160dpi(横向)或480/3=160dpi(纵向),160就是这部手机的dpi,横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。
  • ppi (pixels per inch)图像分辨率, 像素密度,在图像中, 每英寸所包含的像素数目。
  • density(屏幕密度), density和dpi的关系为 density = dpi/160。density这个概念方便理解不同dpi的倍数关系。
  • dp(也即dip,device independent pixels)设备独立像素,Android特有的单位,与密度无关的像素,基于屏幕密度的抽象单位,在320x480分辨率,同时每英寸160点(dpi = 160)的显示器上,1dp = 1px。
  • sp(scaled pixels)放大像素,与刻度无关的像素,字体单位,可以根据用户的字体大小首选项进行缩放。sp和dp一样,是android开发里特有的单位, 查看TextView的源码可知 Android 默认使用 sp 作为字号单位。以160ppi屏幕为标准,当字体大小为 100%时, 1sp=1px。

为什么要把sp和dp代替px?最简单的原因是他们不会因为ppi的变化而变化,在相同物理尺寸和不同ppi/dpi下,他们呈现的高度大小是相同。也就是说更接近物理呈现,而px则不行。

换算关系

px = dp * (dpi / 160),原来这里的dpi是归一化后的dpi。
则dp = px / (ppi / 160)
ppi = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数
dp*ppi/160 = px。比如1dp x 320ppi/160 = 2px。

疑问:dpi和ppi是不是数值等同的?为何文档中的计算方式对不上?

划分标准

Google官方指定的dpi区分标准(第1列和第2列):

名称 像素密度范围 屏幕密度 图片icon尺寸
drawable-ldpi ppi=120-160 density=0.75 36*36
drawable-mdpi ppi=160-240 density=1(baseline) 48*48
drawable-hdpi ppi=240-320 density=1.5 72*72
drawable-xhdpi ppi=320-480 density=2 96*96
drawable-xxhdpi ppi=480-640 density=3 144*144
drawable-xxxhdpi ppi=640-800 density=4 192*192

* 小规律:比值(各种屏幕密度的比值)
ldpi:mdpi:hdpi:xhdpi:xxhdpi:xxxdpi = 0.75:1:1.5:2:3:4 = 3:4:6:8:12:16
这个比值乘以12就得到对应屏幕密度手机桌面icon图标大小

Android手机常见尺寸和对应分辨率

  • 摘自网络,有待验证。
4:3 尺寸 对应分辨率
VGA 640*480 (Video Graphics Array) -
QVGA 320*240 (Quarter VGA) -
HVGA 480*320 (Half-size VGA) mdpi
SVGA 800*600 (Super VGA) -
5:3 尺寸 对应分辨率
WVGA 800*480 (Wide VGA) hdpi
16:9 尺寸 对应分辨率
FWVGA 854*480 (Full Wide VGA) hdpi
HD 1920*1080 High Definition -
QHD 960*540 hdpi
720p 1280*720 xhdpi
1080p 1920*1080 xxhdpi

部分Android测试机分析

   在项目开发过程中,遇到屏幕很大的手机,结果显示的图标却很小,和预期不一致,例如华为机型MT1-U06。
   原因是:真机屏幕的ppi会取和谷歌标准最相近的标准ppi,然后density按照最相近的ppi来定。
  • 1
  • 2
  • 3

以谷歌的标准,按安卓屏幕宽度为例,一般来说480px对应的density是1.5(也就是hdpi)对应320dp,720px对应的density是2.0(也就是xhdpi)对应360dp,1080px对应的density是3.0(也就是xxhdpi)对应360dp;

如果非要拿屏幕ppi说事的话,就是这样,以160ppi为基准,160ppi对应的density是1.0,240ppi对应的density是1.5,320ppi对应的density是2.0…

你可能感兴趣的:(Android分辨率适配)