Android屏幕适配 px,dp,dpi及density的关系与深入理解
PX(pixel):
即传统计算机语言中描述的像素,在Android则代表绝对像素。
之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一。
举例来说,我们现在将某个Button的width设为160px,则会出现如下情况:
在分辨率为“320宽”的设备里,该按钮显示占屏幕宽度一半;
在分辨率为“640宽”的设备里,该按钮显示占屏幕宽度的四分之一;
DPI(Dots Per Inch):
为了避免上面说到的使用px在屏幕适配中带来的问题,Android引入了一个新的单位:dp/dip。
而在理解“dp”之前,我们更有必要先了解一下另一个概念。正是:dpi。
也有人讲dpi称为“屏幕密度”。其含义则是:每英寸所打印的点数,既每一英寸的屏幕所包含的像素数。
举例来说,假设现在有一台“宽2英寸,长3英寸”的设备,则:
- 当该设备分辨率为“320*480”,则dpi值为160。
- 当该设备分辨率为“640*960”,则dpi值为320。
而“dpi”值越高的设备,其屏幕显示画面的效果也就越精细。
使用场景:
正是因为dpi值其代表的特性,所以android项目的资源文件下存在以下目录:
- drawable-ldpi ( 当dpi为120时,使用此目录下的资源)
- drawable-mdpi ( 当dpi为160时,使用此目录下的资源)
- drawable-hdpi ( 当dpi为240时,使用此目录下的资源)
- drawable-xhdpi ( 当dpi为320时,使用此目录下的资源)
- drawable-xxhdpi ( 当dpi为480时,使用此目录下的资源)
Android正是根据设备DPI值得不同,选择清晰度不同的资源使用,完成屏幕的适配。
DP/DIP(device independent pixels):
与我们之前谈到的绝对密度“px”对应,Android中引入的“dp”代表的则是“设备独立像素”。
该单位是为支持WVGA、HVGA和QVGA而使用的,其不再依赖像素本身,而是和屏幕密度相关。
在Android当中规定:在屏幕密度为“160dpi”的情况下,则刚好“1dp = 1px”。
注:当屏幕密度为“320dpi”时,则“1dp = 2px”,以此类推.......
也正是因此,让我们得以保证了:控件在不同密度的屏幕上显示一致,既完成屏幕适配。
使用场景:
让我们回到上面说到的使用px造成的控件显示问题,此时我们将使用新的单位“dp”。于是:
- 在分辨率320*480(既dpi为160)的设备下,则160dp等价于160px,按钮占屏幕宽的一半。
- 在分辨率640*960(既dpi为320)的设备下,则160dp等价于320px,按钮依然占屏幕宽的一半。
看到这样一个解析,聪明的人大概已经能预见什么了。我们似乎发现了某种关联:
在Android里:“dpi = 160,则1dp = 1px”、“dpi = 320,则1dp = 2px”。以此类推。
到此你已经发现,dp,px与160之间存在着某种规律:“1dp = (dpi / 160)px”
到了这里我们明白了,其实Android提供的该值,也就是为了让我们在dp与px之间做转换。
归根结底,其目的还是为了帮助我们做屏幕适配。
虽然使用dp在xml文件中定义控件尺寸,能够很好的帮助我们完成适配。
但很多时候,我们也会需要在Java代码中动态的去设定控件的尺寸。
但由于在代码中的尺寸设定,基本都被默认为了px单位。
所以这个时候就可以借助“density”来帮我们完成dp与px的转换,从而完成适配。
这也是为什么,我们可以在网上查到类似的工具类代码:
public static int dip2px(Context context, float dipValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(dipValue * scale + 0.5f); } public static int px2dip(Context context, float pxValue){ final float scale = context.getResources().getDisplayMetrics().density; return (int)(pxValue / scale + 0.5f); }
注:不要奇怪,熟悉的Java的特性的你应该明白,“+0.5f”是为了避免在类型强制转换中可能造成的精度丢失.
DisplayMetrics metrices = getResources().getDisplayMetrics();
int dpi = metrices.densityDpi;
float density = metrices.density;
float width = metrices.widthPixels;
float height = metrices.heightPixels;Log.i("dpi==>", dpi+"");
Log.i("density==>", density+"");
Log.i("width==>", width+"");
Log.i("height==>", height+"");
查看打印结果:
Android屏幕适配 px,dp,dpi及density的关系与深入理解相关推荐
- android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解
PX(pixel): 即传统计算机语言中描述的像素,在Android则代表绝对像素. 之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一. 举例来 ...
- Android屏幕适配 px,dp,dpi及density的关系与深入理解(转载)
PX(pixel): 即传统计算机语言中描述的像素,在Android则代表绝对像素. 之所以Android中不推荐使用这种单位,正是因为不同生产厂商,不同品牌,不同屏幕的设备,其分辨率亦不一. 举例来 ...
- Android 屏幕适配(修改系统字体大小、显示大小、修改分辨率相关适配)
Android实际开发中会遇到各种各样的机型,所以就需要对多种机型进行适配.常见的适配在这类就不详细介绍了,大家可以参考这里的系列文章Android通用屏幕适配讲解的已经很详细了.下面说的是:当修改系 ...
- 2021年最全Android屏幕适配的度量单位px dp(dip) ppi dpi sp pt的区别(最详细,屏幕尺寸,屏幕分辨率,屏幕兼容,屏幕适配)
0 前言 快乐李同学最新在学习Android屏幕适配相关的知识点,其中涉及到了很多Android屏幕适配相关概念和度量单位,但是快乐李同学掌握的相关知识不牢固,于是决定写出这两篇文章对这方面的知识点做 ...
- android dpi 修改,Android屏幕适配之修改density
标准:1920px * 1080 5英寸 480 3 三星s10-22801080 6.1英寸 414 2.58 MI mix2-19201080 5.99 368 2.29 android中的dp在 ...
- Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸
Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸 在安卓中,将屏幕密度分为了五类 屏幕密度 对应的标签 对应的像素 120dip ldpi 1dp= 0.75px 160dip mdp ...
- android修改屏幕长宽比例,Android屏幕适配之修改density
标准:1920px * 1080 5英寸 480 3 三星s10-22801080 6.1英寸 414 2.58 MI mix2-19201080 5.99 368 2.29 android中的dp在 ...
- android 屏幕最小宽度_最小宽度360dp Android屏幕适配—被偷走的dp - 硬件设备 - 服务器之家...
最小宽度360dp Android屏幕适配-被偷走的dp 发布时间:2017-05-11 来源:服务器之家 一.Android手机屏幕DPI DPI概念自行百度 Android手机按照不同DPI分为: ...
- Android 屏幕适配攻略(三)单位dp与sp
Android 屏幕适配攻略(三)单位dp与sp 1 一般手机默认使用情况下 在安卓中,一般情况下,也就是正常使用情况下 屏幕密度 对应的标签 对应的像素 sp 120dip ldpi 1dp= 0. ...
最新文章
- UVA 712 S-Trees
- 平衡二叉树AVL插入
- 二叉树最大深度:给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
- IT技术中的言情小说
- C++--第26课 - 异常处理 - 下
- python版本历史_python历史介绍
- linux wps 数学符号,2016版WPS数学符号如何输入
- 六层电梯的PLC控制程序
- 大学计算机专业大二学业总结,大学生大二学年总结
- ASP的技术特点与使用方法
- 怎么用计算机画外观设计图片,以实例教你如何绘制外观设计专利3D线条图
- html头像生成器,Personas – 免费的卡通风格头像生成器
- Caffe windows下安装攻略
- 听说昨天朋友圈炸开了锅???
- scp 的拷贝限速功能
- WinDbg非常简单的调试dmp文件
- 采用to_excel保存文件不覆盖原有的sheet
- ae 创建图像等高线 蒙版_「PS软件」工具使用,图层蒙版与橡皮擦的应用分析
- JavaScript中splice的用法
- Linux学习笔记1(鸟哥的私房菜)
热门文章
- Buck电路原理---TI电源器件在电赛中应用
- proteus中仿真arduino驱动模拟器件(蜂鸣器继电器电机)
- 2021软考真题答案(系统集成项目管理工程师.上午)
- android下雨动画效果,Android 自定义View(二) 下雨效果
- 12款吸引眼球的免费英文涂鸦艺术字体下载
- 复制文件或文件夹时出错(无法复制***:没有足够的可用磁盘空间。) .
- 商业银行接口自动化测试结果分析方法与装置
- 2021-08-27 网安实验-Windows系统渗透测试之.NET框架0Day漏洞(CVE-2017-8759)
- oracle 汉化包配置,Oracle Application Express安装与中文语言包配置
- Linux学习之路(1):初学Linux