博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是dp,dip,sp和px及他们之间的的关系?《二》
阅读量:6069 次
发布时间:2019-06-20

本文共 2675 字,大约阅读时间需要 8 分钟。

前言

首先要说的是,Android的碎片化的问题非常严重。因为 Android厂商非常多,设备非常多,产生了各种各样的分辨率。 为了解决碎片化的问题,Android 开发文档中定义了 dp,sp 等新的单位

相关概念

  • dip: device independent pixels(设备独立像素) 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这 这个,不依赖像素。

    这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。

    dip的换算: dip(value)=(int) (px(value)/1.5 + 0.5)

  • dp: 很简单,和dip是一样的。

  • px:px是够长图片的最小单位。 pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。

  • sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。

更多了解: https://www.cnblogs.com/wangjiafang/p/4433912.html

常见手机屏幕像素及对应分别率级别:

分别率级别 密度
ldpi 320*240
mdpi 480*320
hdpi 800*480
xhdpi 1280*720
xxhdpi 1920*1080

dp 和 px 之间的简单换算关系:

分别率级别 换算关系
ldpi 的手机 1dp=0.75px
mdpi 的手机 1dp=1.0px
hdpi 的手机 1dp=1.5px
xhdpi 的手机 1dp=2.0px
xxhdpi 的手机 1dp=3.0px

Tip:根据上面的描述我们得出如下结论,对于 mdpi 的手机,我们的布局通过 dp 单位可以达到适 配效果

举个栗子:

假设有一个QVGA(320x480)分辨率的屏幕物理尺寸是2英寸*1.5英寸,则这部手机的dpi=160 Screen Size指的是手机实际的物理尺寸,如iPhone4S是3.5英寸,这里的3.5英寸指的是手机屏幕对角线的长度为3.5英寸。

注意: 我们在使用的时候,像素统一使用dip,字体统一使用sp。例如textSize="16sp"、layout_width="60dp";偶尔需要使用px单位,例如需要在屏幕上画一条细的分隔线时. 这样也是google的推荐建议。

转换

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);         } 复制代码

像素转换

我们写布局的时候,肯定还是要知道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 * 设备无关像素值 ,请注意这里有个值字。

为啥 标准dpi = 160

  (1)Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi

  实际开发当中,我们经常需要对这几个尺寸进行相互转换(比如先在某个分辨率下完成设计,然后缩放到其他尺寸微调后输出),一般按照 dpi 之间的比例即 2:1.5:1:0.75   来给界面中的元素来进行尺寸定义。

  也就是说如果以 160 dpi 作为基准的话,只要尺寸的 DP 是 4 的公倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数 pixel 。

  但假设以 240 dpi 作为标准,那需要 DP 是 3 的公倍数,XHDPI 下乘以 1.333,MDPI 下乘以 0.666 ,LDPI 下除以 2

  而以 LDPI 和 XHDPI 为基准就更复杂了,所以选择 160 dpi

(2)这个在Google的官方文档中有给出了解释,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。复制代码

为什么我们在布局的时候最好要用dip,不要用px?

  是因为这个世界上存在着很多不同屏幕密度的手机,屏幕密度是什么?就是dpi,就是单位长度里的像素数量。

  想象一下,如果这些手机的尺寸一样,屏幕密度相差很大,那么是不是说一个手机水平方向上像素很少,另一个手机水平方向上像素很多?那我们画同样pix数量的时候,它显

  示的长度不就会不一样了?

  比如下面图中的两个手机,同时设置2px长度的Button,在屏幕密度较高的手机里就会显示的比较小。

  而同时设置的2dip长度的Button,在两个手机上显示的大小是一样的。   

  

关于更多

相信自己,没有做不到的,只有想不到的

微信公众号:终端研发部

你可能感兴趣的文章
js颜色拾取器
查看>>
IDEA使用(1)intellIJ idea 配置 svn
查看>>
Thread Safety in Java(java中的线程安全)
查看>>
WPF 降低.net framework到4.0
查看>>
数据管理DMS 全量SQL诊断:你的SQL是健康的蓝色,还是危险的红色?
查看>>
搭建一个通用的脚手架
查看>>
开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
查看>>
开源磁盘加密软件VeraCrypt教程
查看>>
本地vs云:大数据厮杀的最终幸存者会是谁?
查看>>
阿里云公共镜像、自定义镜像、共享镜像和镜像市场的区别 ...
查看>>
shadowtunnel v1.7 发布:新增上级负载均衡支持独立密码
查看>>
Java线程:什么是线程
查看>>
mysql5.7 创建一个超级管理员
查看>>
【框架整合】Maven-SpringMVC3.X+Spring3.X+MyBatis3-日志、JSON解析、表关联查询等均已配置好...
查看>>
要想成为高级Java程序员需要具备哪些知识呢?
查看>>
带着问题去学习--Nginx配置解析(一)
查看>>
onix-文件系统
查看>>
java.io.Serializable浅析
查看>>
我的友情链接
查看>>
多线程之线程池任务管理通用模板
查看>>