首先,说下概念(网上很多帖子几个地方都搞混了,理一下):

 

dip : device independent pixels ,设备无关像素。 我看很多帖子写的五花八门的,关于d的,什么display啊各种都有,既然是设备无关,我还是觉得device靠谱。

dp就是dip

px : 像素不多说

dpi :dots per inch , 直接来说就是一英寸多少个点。常见取值 120,160,240。我一般称作像素密度,简称密度

density : 直接翻译的话貌似叫 密度。常见取值 1.5 , 1.0 。

分辨率: 横纵2个方向的像素点的数量,常见取值 480X800 ,320X480

屏幕尺寸: 屏幕对角线的长度。电脑电视同理。

这里还涉及另外一个问题,就是屏幕比例的问题。因为只确定了对角线长,2边长度还不一定。所以有了4:3、16:9这种,这样就可以算出屏幕边长了。

重点来了,网上很多帖子直接把 density 叫做“密度”,然后就说他是像素密度,然后就说他是dpi。

在android里面,获取一个窗口的metrics,里面有这么几个值

  1. metrics.density;
  2. metrics.densityDpi;

densityDpi就是我们常说的dpi。density其实是  DPI / (160像素/英寸)  后得到的值。是不是有点奇怪,因为我带了单位。。。这个涉及到后面一个比较重要的东西,后面再说。

从上面就看得出了,DPI本身的单位也是 像素/英寸,所以density其实是没单位的,他就是一个比例值。

而dpi的单位是 像素/英寸,比较符合物理上面的密度定义,密度不都是单位度量的值么,所以我更喜欢把dpi叫像素密度,简称密度,density还是就叫density。

然后,来算算dpi。

比如一个机器,屏幕4存,分辨率480X800,他的dpi能算么。

因为不知道边长,肯定不能分开算,4是对角线长度,那直接用勾股定理算对角线像素,除以4,算出来大概是 dpi = 233 像素/英寸。

那么density就是  (233 px/inch)/(160 px/inch)=1.46 左右

顺带说下,android默认的只有3个dpi,low、medium和high,对应 120、160、240,如果没有特别设置,所有的dpi都会被算成这3个,具体可以参考下这个帖子

http://android.tgbus.com/Android/tutorial/201103/347176.shtml

其中的default就是160。

然后就该算了,我们写布局的时候,肯定还是要知道1个dp到底有多少px的。

换算公式如下:    dp = (DPI/(160像素/英寸))px  =  density px

注意,这里都是带单位的。px是单位,dp是单位,density没单位。

 

为了方便,假设dpi是240 像素/英寸 , 那么density就是1.5

那么就是   dp=1.5px ,注意这是带了单位的,也就是 设备无关像素 = density 像素

 

那么转换为数值计算的话,应该是下面这个式子

PX = density * DP

也就是

像素值 = density * 设备无关像素值  ,请注意这里有个值字。

所以,90px 就应该是 60 dp 。不要问我为什么和公式不符了,全是单位的问题,物理老师死得早啊 

最新文章

  1. mac 下安装 lua5.3 + cjson
  2. HTML常用的特殊字符格式
  3. 黑马程序员-C#学习笔记(二)
  4. JavaWeb中登陆功能
  5. FBReaderJ 编译Jni
  6. Maven Profile标签
  7. FileZilla 安装配置参考
  8. vscode 前端插件推荐
  9. Java 将键盘中的输入保存到数组
  10. yield from
  11. mvc中AntiForgeryToken的实现方式--看Mvc源码
  12. Centos安装ffmpeg
  13. ReactiveX 学习笔记(21)使用 Rx.NET + ReactiveUI 进行 GUI 编程
  14. git clone项目
  15. 合并两个git仓库
  16. Jenkins 执行python脚本
  17. A. Candy Bags
  18. hive常用参数配置设置
  19. Postgresql数据库实用命令
  20. SQL语句(十六)实现集合运算、对数据修改、数据表复制

热门文章

  1. Calico在Kubernetes中的搭建
  2. 【leetcode】Palindrome Partitioning
  3. Java数据类型中String、Integer、int相互间的转换
  4. CodeForces - 426A(排序)
  5. Andoird自定义ViewGroup实现竖向引导界面
  6. .net学习笔记---HttpResponse类
  7. C#学习笔记---如何提高代码逼格
  8. MVC中session创建并获取问题
  9. 烟大 Contest1024 - 《挑战编程》第一章:入门 Problem E: Graphical Editor(模拟控制台命令形式修改图形)
  10. hdu 4268 multiset+贪心