0 前言

快乐李同学最新在学习Android屏幕适配相关的知识点,其中涉及到了很多Android屏幕适配相关概念和度量单位,但是快乐李同学掌握的相关知识不牢固,于是决定写出这两篇文章对这方面的知识点做一个总结,Android屏幕适配系列文章共两篇:

  1. 《2021年最全Android屏幕适配的度量单位px dp(dip) ppi dpi sp pt的区别》
  2. 《2021年最详细的Android屏幕适配方案汇总》

1 Android屏幕适配相关概念

1.1 屏幕尺寸(Screen Size)

1.1.1 设备的屏幕尺寸

设备的屏幕尺寸是设备屏幕的对角线的长度,单位是英寸,1英寸等于2.54厘米。比如常见的设备屏幕尺寸有3.5"、4.0"、5.5"等。

1.1.2 应用的屏幕尺寸

应用的屏幕尺寸是Android系统为该应用所提供的可见空间。应用的屏幕尺寸并非设备的屏幕尺寸,而是综合考虑屏幕方向、系统装饰(如标题栏和导航栏)和窗口配置更改(例如当用户启用多窗口模式时)后的尺寸。

多窗口模式:Android7.0及以上设备支持的分屏模式、Android7.0及以上的大尺寸屏幕设备支持的自由窗口模式、Android8.0及以上设备支持的画中画模式。

例如以设备屏幕尺寸为1080px*2400px的Redmi K30Pro设备为例,我们把开发助手APP分别在不带导航栏的全屏模式、带导航栏的全屏模式、分屏模式和自由窗口模式下打开并检测屏幕属性,截图如下:
我们可以发现:这四种情况下检测出的屏幕分辨率永远都是1080px*2400px,这就是我们所说的设备的屏幕尺寸;但这四种情况下检测出的可用屏幕分辨率却各不相同,上图的蓝框圈中的区域便是可用屏幕分辨率所描述的区域,这也就是我们所说的应用的屏幕尺寸

1.2 屏幕分辨率(Screen Resolution)

屏幕分辨率是指在横向和纵向上的像素点数、单位是px(pixel),1px等于1个像素点,一般设备的屏幕分辨率以“纵向像素*横向像素”来表示,例如1920px*1080px。

1.3 度量单位px、dp(dip)、ppi、dpi、sp、pt

1.3.1 像素px(pixel)

像素,1px代表物理屏幕上面的一个像素点。由于Android设备分辨率繁杂、厂商过多的原因,px在实际的开发过程中不建议被使用。如宽高都为100px的图片,在不同分辨率的设备上可能显示的大小不一致,如下图(图片来自android_developer_screens_support):

1.3.2 密度无关像素dp/dip(Density-independent Pixels)

密度无关像素是一个基于屏幕物理密度的度量单位,在160dpi的屏幕中1dp大约等于1px。当在更高密度的屏幕上运行时,用于绘制1dp的像素数量会被一个适合屏幕dpi的density因子放大,例如在320dpi的屏幕中1dp大约等于2px。而在低密度屏幕上,1dp的像素数量会减少。

也就是说,dp与px的比值与屏幕物理密度成正相关,但不一定成正比。度量单位dp可以在布局中适当地调整UI组件的大小,以适合不同的屏幕密度。换句话说,它为您在不同设备上的UI元素的真实大小提供了一致性。

为什么说dp与px的比值与屏幕物理密度成正相关,而不是成正比呢?


这主要是因为Android开发者可以在代码中指定浮点数的dp或者px,但当在设备屏幕上按照对应的dp或px显示内容时要进行四舍五入取整,因为设备屏幕都是一个个像素点构成的,因此它们的关系是成正相关。


举个例子,一个宽高为11dp*11dp的ImageView,在density为1.0的设备屏幕上显示的实际像素为11px*11px,但在density为1.5的设备屏幕上显示的实际像素为17px*17px,而不是16.5px*16.5px。因为一个1px*1px的像素点只能是要么显示,要么不显示,所以Android系统中会将16.5px*16.5px四舍五入取整为17px*17px。

Android官方文档《支持不同的像素密度》对于屏幕适配的观点是:必须避免的第一个陷阱是使用像素px来定义距离或尺寸。使用像素来定义尺寸会带来问题,因为不同的屏幕具有不同的像素密度,所以同样数量的像素在不同的设备上可能对应于不同的物理尺寸。

例如下方同样是4.0英寸的两部手机,左边那台手机的分辨率很低,是320px*180px,右边那台是960px*540px。如果将显示字母a图片的ImageView宽高都设置为100px,那么左边手机显示的字母a图片很大,而右边手机显示的字母a图片很小。

只有将显示字母a图片的ImageView宽高都设置为100dp,才能出现下面的效果,即该字母a图片在两台分辨率不同的手机看起来实际的物理宽高差不多一致,而不是一大一小。

要在密度不同的屏幕上保持一个UI组件显示出相同的尺寸,您必须使用密度无关像素 (dp) 作为度量单位来设计界面。dp 是一个虚拟像素单位,1 dp 约等于在在基准密度160dpi屏幕上的1px。对于其他每个密度,Android 会将此值转换为相应的实际像素数。

1.3.3 像素密度ppi(pixels per inch)

像素密度是一个表示打印图像或显示器单位面积上像素数量的指数。一般用来计量电脑显示器、电视机和手机屏幕的精细程度,例如手机销售商一般会标识出售手机的ppi,例如淘宝店中小米K30Pro手机标识的ppi为395。通常情况下,ppi越高的屏幕,屏幕显示的内容更细腻和真实,其中ppi的计算公式如下:

以分辨率1280*720、屏幕对角线尺寸为4.3英寸的设备为例:ppi = √(12802+7202) / 4.3 = 341.5359……≈342。

1.3.4 屏幕密度dpi(dots per inch)

屏幕密度是一个用于点阵数位影像的度量单位,意思是每一英寸长度中取样点或可显示点的数目。为简便起见,Android 将所有屏幕密度分组为六种通用密度,具体如下表:

类别 屏幕密度dpi 密度无关像素dp的缩放因子density
ldpi ~120dpi 0.75
mdpi ~160dpi 1.0
hdpi ~240dpi 1.5
xhdpi ~320dpi 2.0
xxhdpi ~480dpi 3.0
xxxhdpi ~640dpi 4.0

1.3.4.1 密度无关像素dp的缩放因子density

在《Android官方文档-Reference-DisplayMetrics.density》中对屏幕密度dpi的缩放因子density有以下的解释:

density是密度无关像素dp的缩放因子,体现在android.util包中的DisplayMetrics.density 字段。将dp单位转换为px单位时,该字段是必须使用的缩放系数,160dpi屏幕的density是1,而240dpi屏幕的density是1.5,以此类推。利用density可以简单转换dp和px这两个度量单位:

px = dp * density = dp * (dpi / 160)

假设在某一应用中,用户的手指至少移动16px之后,系统才会识别出滚动或滑动手势。在160dpi基准屏幕上,用户必须移动 16 pixels / 160 dpi(等于一英寸的 1/10 或 2.5 毫米),系统才会识别该手势。而在配备高密度显示屏 (240dpi) 的设备上,用户的手指必须至少移动 16 pixels / 240 dpi,相当于 1 英寸的 1/15(1.7 毫米)。此距离短得多,因此用户会感觉应用在该设备上更灵敏。

要解决此问题,必须在代码中以 dp 表示手势阈值,然后再转换为实际像素。例如:

//以dp为度量单位的手势阈值
private static final float GESTURE_THRESHOLD_DP = 16.0f;
//获得当前设备的密度无关像素dp的缩放因子density
final float density = getResources().getDisplayMetrics().density;
//基于density将dp转化为当前设备适应的px,
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * density + 0.5f)
//使用以px为度量单位的mGestureThreshold变量值作为当前APP的手势阈值

DisplayMetrics.density 字段根据当前像素密度指定将 dp 单位转换为像素时所必须使用的缩放系数。在中密度屏幕上,DisplayMetrics.density 等于 1.0;在高密度屏幕上,它等于 1.5;在超高密度屏幕上,等于 2.0;在低密度屏幕上,等于 0.75。此数字是一个系数,用其乘以 dp 单位,即可得出当前屏幕的实际像素数。

1.3.4.2 ppi与dpi的区别

dpi(dots per inch)、ppi(pixels per inch),前者突出dot(物理像素点),后者突出pixel(像素),dot是一个物理的像素点,pixel就不一定了,一个pixel可能由很多个物理dot组成。

PPI描述了数字图像的像素分辨率,而DPI描述了打印图像上的墨点数量。尽管PPI在很大程度上是指屏幕显示,但它也会影响设计的打印尺寸,从而影响输出的质量。而DPI与数字化无关,主要涉及印刷。

对Android而言,dpi等同于ppi,具体可以参考文章《PPI vs. DPI: what’s the difference?》。

1.3.5 缩放无关像素sp(Scale-independent Pixel)

在定义文本大小时,应该用可缩放像素sp作为单位。sp与dp很类似,但唯一的区别是:Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等),当文字尺寸是“正常”时,1sp=1dp,而当文字尺寸是“大”或者“超大”时,1sp>1dp。

1.3.6 点pt(point)

pt在两种环境中有两种不同的含义:在PhotoShop中,pt用来指定电子图像的尺寸并映射到印刷设备;而在iOS应用开发中,pt用来将指定电子图像的尺寸并映射到iOS设备。

但在上述两种环境下,pt都是逻辑单位,用来隔离输出设备的精度差异,保证输出结果的物理尺寸不会忽大忽小。

1.3.6.1 iOS设备中的点pt(point)

在iOS应用开发中,pt用来将指定电子图像的尺寸并映射到iOS设备。在163ppi的iOS设备中,1pt映射成1px,且1inch(英尺)等于163pt。而对于其他不同ppi的iOS设备,1pt可能会映射成2px、3px等像素,具体可参考下述表格:

1.3.6.2 PhotoShop中的点pt(point)

在PhotoShop中,pt用来指定电子图像的尺寸并映射到印刷设备。其中PhotoShop指定,当ppi为72时,PhotoShop中1pt映射成1px。且1inch等于72pt。

2 2021年最详细的Android屏幕适配方案汇总

请阅读快乐李同学写的文章《2021年最详细的Android屏幕适配方案汇总》。


本文参考文献:

Android开发者-文档-指南-应用资源概览

Android开发者-文档-指南-设备兼容性-设备兼容性概览

Android开发者-文档-指南-设备兼容性-支持不同的屏幕尺寸

Android开发者-文档-指南-设备兼容性-支持不同的像素密度

【Android屏幕适配】浅析px、dp、ppi、dpi、sp

iOS开发中使用的单位pt与ps中的pt是不是同一个概念?个人觉得不是。望高手解答…?

腾讯何家成-Android 屏幕适配:最全面的解决方案

张鸿洋-Android 屏幕适配方案

2021年最全Android屏幕适配的度量单位px dp(dip) ppi dpi sp pt的区别(最详细,屏幕尺寸,屏幕分辨率,屏幕兼容,屏幕适配)相关推荐

  1. android 密度像素,Android屏幕密度适配问题之px,dp,sp等详细介绍

    一  ,android屏幕相关知识 屏幕大小:指屏幕对角线的长度,使用"寸"度量,如4.7寸手机 分 辨  率:分辨率指手机屏幕的像素点个数,如720*1280 指屏幕宽有720个 ...

  2. android中的尺寸单位是什么,Android中各种长度尺寸单位(dp,dip,px,sp,pt)的区别

    dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和 QVGA 推荐使用这个,不依赖像素 ...

  3. android编程:调节视频画面分辨率,Android编程实现屏幕自适应方向尺寸与分辨率的方法...

    本文实例讲述了Android编程实现屏幕自适应方向尺寸与分辨率的方法.分享给大家供大家参考,具体如下: Android 屏幕自适应方向尺寸与分辨率,包括屏幕界面布局.多分辨率支持.获取屏幕尺寸.屏幕横 ...

  4. Android 屏幕尺寸、屏幕分辨率(px)、屏幕像素密度(dpi)、密度无关像素(dp/dip)、屏幕适配

    1. dp , dpi , px 关系 (假设已经熟悉了基本概念,也可以参考最后的链接)  2. 运行时dp 如何转换成 px  3.  使用dp 和 px 设计结果比较 参考: Android屏幕适 ...

  5. 【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...

  6. android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解

    PX(pixel): 即传统计算机语言中描述的像素,在Android则代表绝对像素. 之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一. 举例来 ...

  7. android 屏幕最小宽度_最小宽度360dp Android屏幕适配—被偷走的dp - 硬件设备 - 服务器之家...

    最小宽度360dp Android屏幕适配-被偷走的dp 发布时间:2017-05-11 来源:服务器之家 一.Android手机屏幕DPI DPI概念自行百度 Android手机按照不同DPI分为: ...

  8. Android屏幕适配 px,dp,dpi及density的关系与深入理解(转载)

    PX(pixel): 即传统计算机语言中描述的像素,在Android则代表绝对像素. 之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一. 举例来 ...

  9. Android屏幕适配 px,dp,dpi及density的关系与深入理解

    PX(pixel): 即传统计算机语言中描述的像素,在Android则代表绝对像素. 之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一. 举例来 ...

最新文章

  1. kotlin定义变量
  2. matlab nt什么意思,胎儿nt是什么意思
  3. Docker折腾手记-安装
  4. 餐饮店楼梯空间的设计方案
  5. 在 Java 虚拟机上班是一种怎样的体验?
  6. java 如何处理正则
  7. EasyRecovery——一款专业的数据恢复软件
  8. anaconda打开python文本编辑器_【python】anaconda中打开IDLE(python 自带编辑器)
  9. mathtype字体倾斜
  10. pythonqt需要安装哪些环境_Python3 搭建Qt5 环境的方法示例
  11. 浅谈关于Java中map这个类衍生的类
  12. 免费网课python_Python网课推荐——免费学习Python编程
  13. 取消wps右键菜单_wps自动生成论文目录出现错误怎么办
  14. java怎么修改支付宝步数_支付宝怎么修改运动步数?刷步数最新方法
  15. php就业薪资排名_山东第三季度就业难度指数报告:重工行业就业难
  16. Python replace()方法
  17. 基于php校园网站的毕业设计论文,基于php技术的校园网站的设计与实现_毕设论文.doc...
  18. Mac OS X:如何制作一个可启动HFS+,一个FAT32,和一个NTFS分区(外置硬盘)
  19. Linux——线程同步(条件变量、POSIX信号量)和线程池
  20. 【Scratch-声音模块】声音播放和停止

热门文章

  1. 常见16种HTTP状态返回码
  2. 微信小程序 view 内控件位置问题、以及定位问题(column(显示为多行) 和 row (显示为一行))
  3. 【新番尝鲜】超越宇宙的少女——不明生物参见
  4. 冰壶比赛 【C++】
  5. FPGA按键消抖(高级篇)
  6. WhatsAppBusiness官方说明导读及调研分析
  7. Windows系统时间 FILETIME和SYSTEMTIME
  8. 含类定义的完整python程序_《含》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  9. Java jdk1.8如何配置环境变量
  10. ORA-01034和ORA-27101的解决办法