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,按钮依然占屏幕宽的一半。
Density:
就这个单词本身直接翻译的意思而言,其也代表“密度”。 但需要注意的是,在Android中,其实并非如此。
注意我们这里指的是,通过代码“context.getResources().getDisplayMetrics().density”获取的“density”值。
而通过该方法获取到的该值,实际上是等价于“dpi / 160”的一个结果值。也就是说:
“getResources().getDisplayMetrics().density” = “getResources().getDisplayMetrics().densityDpi / 160”

看到这样一个解析,聪明的人大概已经能预见什么了。我们似乎发现了某种关联:
在Android里:“dpi = 160,则1dp = 1px”、“dpi = 320,则1dp = 2px”。以此类推。
到此你已经发现,dp,px与160之间存在着某种规律:“1dp = (dpi / 160)px”
换算一下,最终得到公式: dp = density * 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的关系与深入理解相关推荐

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

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

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

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

  3. Android 屏幕适配(修改系统字体大小、显示大小、修改分辨率相关适配)

    Android实际开发中会遇到各种各样的机型,所以就需要对多种机型进行适配.常见的适配在这类就不详细介绍了,大家可以参考这里的系列文章Android通用屏幕适配讲解的已经很详细了.下面说的是:当修改系 ...

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

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

  5. 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在 ...

  6. Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸

    Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸 在安卓中,将屏幕密度分为了五类 屏幕密度 对应的标签 对应的像素 120dip ldpi 1dp= 0.75px 160dip mdp ...

  7. 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在 ...

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

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

  9. Android 屏幕适配攻略(三)单位dp与sp

    Android 屏幕适配攻略(三)单位dp与sp 1 一般手机默认使用情况下 在安卓中,一般情况下,也就是正常使用情况下 屏幕密度 对应的标签 对应的像素 sp 120dip ldpi 1dp= 0. ...

最新文章

  1. UVA 712 S-Trees
  2. 平衡二叉树AVL插入
  3. 二叉树最大深度:给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
  4. IT技术中的言情小说
  5. C++--第26课 - 异常处理 - 下
  6. python版本历史_python历史介绍
  7. linux wps 数学符号,2016版WPS数学符号如何输入
  8. 六层电梯的PLC控制程序
  9. 大学计算机专业大二学业总结,大学生大二学年总结
  10. ASP的技术特点与使用方法
  11. 怎么用计算机画外观设计图片,以实例教你如何绘制外观设计专利3D线条图
  12. html头像生成器,Personas – 免费的卡通风格头像生成器
  13. Caffe windows下安装攻略
  14. 听说昨天朋友圈炸开了锅???
  15. scp 的拷贝限速功能
  16. WinDbg非常简单的调试dmp文件
  17. 采用to_excel保存文件不覆盖原有的sheet
  18. ae 创建图像等高线 蒙版_「PS软件」工具使用,图层蒙版与橡皮擦的应用分析
  19. JavaScript中splice的用法
  20. Linux学习笔记1(鸟哥的私房菜)

热门文章

  1. Buck电路原理---TI电源器件在电赛中应用
  2. proteus中仿真arduino驱动模拟器件(蜂鸣器继电器电机)
  3. 2021软考真题答案(系统集成项目管理工程师.上午)
  4. android下雨动画效果,Android 自定义View(二) 下雨效果
  5. 12款吸引眼球的免费英文涂鸦艺术字体下载
  6. 复制文件或文件夹时出错(无法复制***:没有足够的可用磁盘空间。) .
  7. 商业银行接口自动化测试结果分析方法与装置
  8. 2021-08-27 网安实验-Windows系统渗透测试之.NET框架0Day漏洞(CVE-2017-8759)
  9. oracle 汉化包配置,Oracle Application Express安装与中文语言包配置
  10. Linux学习之路(1):初学Linux