关于android的dp和px的关系是我刚开始学习android的第一个知识点,不知不觉学安卓也有一年了,但是偶然间我发现我理解的dp和px的关系一直是错的,真的是有一点搞笑,今天特意写一篇博客纪念一下这个我理解错一年的知识点。
dp和px之间又有一个dpi作为桥梁,我们分别看看这三个属性:

  • px:像素点,比如1080*1920的屏幕,就是宽1080个像素点和高1920个像素点。
  • ppi: 像素密度,这个概念挺好理解的就是屏幕每英寸的像素数量,关于他的计算方法(以1080 * 1920的5英寸屏幕为例):屏幕的对角线像素数/屏幕的尺寸 √(1080 * 1080+1920 * 1920)/5=441ppi。这也就意味着即使是相同分辨率的手机尺寸不同ppi也会改变。
  • dpi:dpi和ppi很容易搞混,其实他们是完全不同的两个东西,ppi有专门的公式计算,但是dpi没有,它往往是写在系统出厂配置文件的一个固定值,Android在规范中规定了不同的分辨率对应的dpi值,一般有120、160、240、320、480几个。比如,几部相同分辨率不同尺寸的手机的ppi可能分别是是430,440,450,那么在Android系统中,可能dpi会全部指定为480,该分辨率下1dp=3px。
  • dp(也叫dip)设备无关像素。关于dp的官方叙述为当屏幕每英寸有160个像素时(也就是160dpi),dp与px等价的,1dp=1px。那么当屏幕为240dpi时,1dp=(240/160)px=1.5px。也就是说dp和px的换算在于dpi这个值,计算的公式为:1dp=(屏幕的dpi/160)px,如果以我们的1080*1920的5英寸屏幕为例那就是1dp=(441/160)px=2.8px。

关于dp和px的概念就这么多,还是很简单的(我这是在打脸吗),下面讲一下衍生出的几个问题:
1.系统根据dp计算像素值的过程
px = dp(dpi/160),这个不难理解,如果一个20dp的Button,在dpi为480的设备占的像素值就是20(480/160)=60px,这个有一点要注意,px的计算完全依照dpi这个参数,而不同尺寸和分辨率的机型的dpi可能相同,这就会造成显示差异。
2.手机屏幕dp最大值是多少?
这个是根据手机的像素数和dpi计算得到,公式:dp=px/(dpi/160)
例如一个1080*1920的手机,他的宽度有1080个像素点,dpi为480,根据公式可得:1080/(480/160)=360dp
同理长度:1920/(440/160)=640dp

3.dp和px的互相转换?
这里会用到我们在代码中可以获取到的一个值:手机密度Density,其实他就是手机的像素密度与基准的比值。 即像素密度为160时Density为1,可以通过下面的方法获取这个值:

float scale = context.getResources().getDisplayMetrics().density;

dp值转换为px值得方法为:
假设手机密度 :density = x,dp的值为y
由1dp = density px
可知ydp = yx px
所以结果为yx

px值转换为dp值得方法为:
假设手机密度 :density = x,px的值为y
由1px = 1/density dp
可知 ypx = y/x dp
所以结果为y/x

public class DensityUtil {  /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */  public static int dip2px(Context context, float dpValue) {  final float scale = context.getResources().getDisplayMetrics().density;  return (int) (dpValue * scale + 0.5f);  }  /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */  public static int px2dip(Context context, float pxValue) {  final float scale = context.getResources().getDisplayMetrics().density;  return (int) (pxValue / scale + 0.5f);  }
}

至于为什么要加0.5f?
因为在java中,强制转换符把float转换为int时,是直接丢掉小数部分的,加0.5f起到了四舍五入的作用,可以减小误差。

android中dp和px的关系相关推荐

  1. Android中dp与px互转的方法

    在Android中dp和px互转的工具类,直接调用即可 public class ScaleUtils { //dp转pxpublic static int dip2px(Context contex ...

  2. Android中dp、sp、px、pt之间的换算关系

    Android中dp.sp.px.pt之间的换算关系 换算公式 1 dp = (dpi/160) px; 1 in = 72 pt = dpi dp; 1 pt = dpi/72 dp: 当dpi为1 ...

  3. 【转】Android中dp,px,sp概念梳理以及如何做到屏幕适配

    2019独角兽企业重金招聘Python工程师标准>>> 首先来看一下他们的基本概念: px   :是屏幕的像素点 dp   :一个基于density的抽象单位,如果一个160dpi的 ...

  4. [转]Android中dp,px,sp概念梳理以及如何做到屏幕适配

    http://blog.csdn.net/jiangwei0910410003/article/details/40509571 今天又开始我的App开发,因为之前一直做的是SDK,所以涉及到界面UI ...

  5. Android 多屏幕适配 dp和px的关系

    一直以来别人经常问我,android的多屏幕适配到底是怎么弄,我也不知道如何讲解清楚,或许自己也是挺迷糊. 以下得出的结论主要是结合官方文档进行分析的https://developer.android ...

  6. dp和px的区别,dp与px换算关系

    一.首先要认识下:屏幕密度ppi ppi  pixles percent inch  每英寸的像素数 ppi = 水平方向的像素数 / 屏幕宽度 例如:3.7in   480 x 800        ...

  7. android中ADT和SDK的关系(转)

    ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升 ...

  8. Android编程中dp、px和sp的区别

    px (pixels)(像素):屏幕上的点 ,与密度相关.密度大了,单位面积上的px会比较多. 2.dip或dp(与密度无关的像素).这个和设备硬件有关,为了支持WVGA.HVGA和QVGA 5进制空 ...

  9. 摩客怎么设置安卓的dp_Android中dp和px之间进行转换

    在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip).一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致.但是在代码中,如何处理呢?很多控件的方法中都只提供了 ...

最新文章

  1. oracle 11g ORA-12514
  2. 在Visual Studio 2010中创建多项目(解决方案)模板【三】
  3. 精华【分布式、微服务、云架构dubbo+zookeeper+springmvc+mybatis+shiro+redis】分布式大型互联网企业架构!...
  4. 一款net平台软件之汉化
  5. k 最近邻_k最近邻与维数的诅咒
  6. 地理知识归纳:影响降水的九大因素
  7. Nodejs第一讲记录
  8. mysql导入数据提前修改字段_复习MySQL③导入数据、检查及修改
  9. ss流量查询 php,Linux_Linux怎么使用ss命令查看系统的socket状态,  Linux系统中,ss命令可用于 - phpStudy...
  10. webpack中,css中打包背景图,路径报错
  11. JAVA中的线程安全与非线程安全,java面试题,java高级笔试题
  12. 【maven】No plugin found for prefix ‘install‘ in the current project
  13. 【CSP201312-2】ISBN号码,字符串,简单模拟
  14. c#调用c++dll找不到入口点,一秒搞定
  15. 车牌识别系统原理及代码【YOLO+MLP】
  16. 拆解洪恩教育2020年财报:Q4亏损扩大7倍,负债增至4亿元
  17. 注册一个域名需要多少钱_购买一个域名要多少钱?
  18. VBA 对 range() 或 cells() 的内容格式的修改, 如 range.address(0,0) cells().formulaR1C1
  19. 央国企的企业并购重组信息能在塔米狗上找到吗?
  20. Activity、Service、子线程之间的消息传递轻松实现

热门文章

  1. linux中mp3转wav格式
  2. ubuntu20 deb包安装安装中心显示无法支持
  3. 拍拍贷第四季度净利润7.746亿元 开盘大涨逾9%
  4. 上交所又披露受理9家企业科创板上市申请,总计28家...
  5. 《Erlang in anger》
  6. VBA 游标类型声明位置rs.CursorLocation
  7. linux停止java定时任务,linux定时任务生产java服务无法执行问题案例
  8. 企业数字化转型蓝图规划、生态体系建设、数字化管理平台建设方案
  9. java 封装ElasticsearchClient 8.X 基本操作方法
  10. Excel教程:数值为0不显示的三种解决方法介绍,你都知道哪些?