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

2023-05-16

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~120dpi0.75
mdpi~160dpi1.0
hdpi~240dpi1.5
xhdpi~320dpi2.0
xxhdpi~480dpi3.0
xxxhdpi~640dpi4.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 屏幕适配方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Android Studio使用OpenCV进行图像基本处理

    Android Studio使用OpenCV进行图像基本处理 1 环境配置 进入OpenCV官网下载SDK包 进入官网 xff08 https opencv org releases xff09 选择 34 Android 34 版本下载
  • QT中基于QWebEngineView的C++和JS互相调用

    QT版本5 14 2 xff0c ubuntu18 04 4 1 PRO包含库 QT 43 61 webenginewidgets 2 main中启用OpenGL QCoreApplication setAttribute Qt AA Us
  • cin相关函数

    cin cin的相关函数 get getline gt gt ignore cin cout 都关联一个行缓冲区 按下enter键 xff0c 生成一个 n 在缓冲区中 xff0c 同时也就可以操作这一行了 cin get 从缓冲区取一个字
  • 浅谈人工智能(AI)

    人工智能 AI 一 人工智能简介 1 1 人工智能定义和发展历史 人工智能 xff08 Artificial Intelligence xff09 xff0c 英文缩写为AI 它是研究 开发用于模拟 延伸和扩展人的智能的理论 方法 技术及应
  • ubuntu18.04忘记密码的解决办法

    大半年没动的U盘系统忘了用户登录密码 xff0c root密码也忘记 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 简单记录一下 xff0c
  • iocp 非阻塞Socket异步接收限速

    网上找遍了也没找到关于异步非阻塞Socket的限速资料 于是 自己写了一份 限速100M S 误差15M S 限速50M S 误差5M S 限速10M S 误差0 3M S 限速5M S 误差0 02M S 限速越小 精度越准 functi
  • qt发布的程序时如何将依赖的dll分开放在不同目录下

    qt发布的程序时如何将依赖的dll分开放在不同目录下 QT发布的程序 xff0c exe可执行程序与dll文件都在同一个目录下 xff0c 我现在想把那些dll文件 xff0c 放到一个文件夹下 xff0c 这个文件夹和exe在同一个目录下
  • Android性能优化:Bitmap详解&你的Bitmap占多大内存?

    在开发app时 xff0c 显示一张本地图片 xff0c 这张图片在加载时会占用大多内存呢 xff1f 猜测占用内存大小和以下几个因素有关 xff1a 设计师切图 xff0c 图片本身的分辨率 xff1b 图片所放文件夹代表的 密度 dpi
  • HashMap初始容量为什么是2的n次幂及扩容为什么是2倍的形式

    HashMap的初始容量都是2的n次幂的形式存在的 xff0c 而扩容也是2倍的原来的容量进行扩容 xff0c 也就是扩容后的容量也是2的n次幂的形式存在的 xff0c 下面就来说明一下为什么是2的n次幂的形式 xff01 先来看一下源码
  • ARM裸机第五部分-SDRAM和重定位relocate

    第一部分 章节目录 1 5 1 汇编写启动代码之关看门狗 1 5 2 汇编写启动代码之设置栈和调用C语言1 1 5 3 汇编写启动代码之设置栈和调用C语言2 1 5 4 汇编写启动代码之开iCache 1 5 5 重定位引入和链接脚本1 1
  • Java线程死锁的原因和条件

    一 死锁概念 所谓死锁 xff0c 是指多个进程在运行过程中因争夺资源而照成的一种僵局 当进程处于这种僵持状态时 xff0c 若无外力作用 xff0c 它们都将无法再向前推进 二 产生死锁的原因 xff08 1 xff09 竞争资源 当系统
  • Ubuntu 14.04无法连接ssh服务解决方法

    解决方法如下 xff1a 1 先试着开启SSH服务 在使用SSH之前 xff0c 可以先检查SSH服务有没有开启 使用命令 xff1a sudo ps e grep ssh 来查看 xff0c 如果返回的结果是 xxxx 00 00 00
  • 1.14.ARM裸机第十四部分-LCD显示器

    第一部分 章节目录 1 14 1 LCD简介 1 14 2 LCD的接口技术 1 14 3 LCD如何显示图像1 1 14 4 LCD如何显示图像2 1 14 5 LCD的六个主要时序参数1 1 14 6 LCD的六个主要时序参数2 1 1
  • LCD常用接口原理

    LCD常用接口原理 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 xubin 平台信息 内核 xff1a linux2 6 linux3 0 系统 xff1a android
  • 1.15.ARM裸机第十五部分-触摸屏TouchScreen

    第一部分 章节目录 1 15 1 输入类设备简介 1 15 2 电阻式触摸屏的原理 1 15 3 S5PV210的电阻触摸屏控制器 1 15 4 电容触摸屏的原理 1 15 5 ft5x06电容触摸IC简介 第二部分 章节介绍 1 15 1
  • MAC【Android studio】Gradle download:kotlin-compiler-embeddable-1.3.70.jar下载太慢

    采用策略去Maven仓库下载资源 更新到本地进行加载 1 进入仓库网址链接 https mvnrepository com 点击下载如图 2 配置下载jar文件到 gradle文件中 文件路径 Users 34 用户名 34 gradle
  • 线程安全是如何实现的?

    实现线程安全与代码编写有很大的关系 xff0c 但虚拟机提供的同步和锁机制也起到了至关重要的作用 互斥同步 互斥同步 xff08 Mutual Exclusion amp Synchronized xff09 是一种最常见也是最主要的并发正
  • 2022,音乐号自媒体起号涨粉保姆级攻略,这是个收获的季节。

    前言 最近遇到好多朋友说想做短视频自媒体 xff0c 但找了很多资料 xff0c 甚至报了学习班也没什么起色 xff0c 这不前天一个姐姐说他家姑娘想做抖音 xff0c 俩月了没啥粉丝也没啥播放量 xff0c 看到我的音乐号了 xff0c
  • 短视频消重去重九种方法,组合使用原创度更高,各平台轻松过原创

    想做好视频去重 xff0c 首先要了解视频查重的机制 网上流传的检查MD5其实已经过时了 xff0c 现在MD5已经是过去式 查重要对视频的方方面面进行检查 xff0c 包括但不限于 xff1a 视频的标题 xff0c 封面 xff0c 描
  • 不直播不露脸也能做短视频变现,想挣点生活费试试这些玩法

    大家好 xff0c 我是 64 我赢助手短视频运营 xff0c 最近一直有小伙伴问我 xff0c 做了好久的短视频一直不赚钱 xff0c 今天总结了一下 xff0c 做了90天短视频还没赚了试试这5种易变现的玩法 新手不直播不露脸也能做短视

随机推荐