你也可以看看我其他类似的文章,也会给你带来一些好处!
扩展你的知识:
4k是什么意思?
1080p 和 720p 是什么意思?
如果不明白百度百科解析最后一段可以参考这里
在开始解释dp之前,我们先来了解一些概念。
常用尺寸单位
px(像素):屏幕上的点,一般HVGA表示像素。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1pt=1/72英寸,用于印刷行业,非常简单易用;
解决
“分辨率”表示为每个方向上的像素数等。在某些情况下,还可以表示为“每英寸像素数”(ppi)以及图形的长度和宽度。 例如,72ppi 和 8X6 英寸。
用于描述分辨率的单位有:dpi(每英寸点数)、lpi(每英寸线数)和 ppi(每英寸像素)。
Ppi 和 dpi 通常可以互换使用。 它们用于描述屏幕的属性或性能。 从技术角度来说,“像素”(P)只存在于计算机显示领域,“点”(d)只出现在印刷或打印领域。
使用ppi来描述手机屏幕属性。 在开发过程中,每个文件都对应着dpi。这两个单位的计算方法是一样的,只是描述不同,只是因为使用场景不同。
QVGA:分辨率为240*480(VGA为四分之一)
HVGA:分辨率为320*480(半尺寸VGA是一半)
VGA:分辨率为640*480(全称Video Array)
WVGA:分辨率为800*480(Wide VGA很多网页的宽度为800,所以WVGA手机屏幕会更适合浏览网页)
FWVGA:分辨率为854*480手机c8813
英寸是物理单位。 我们通常说的手机屏幕是4.3英寸。 4.5英寸指的是屏幕对角线长度,如下图所示:
分辨率 480 x 800、屏幕尺寸 4.3 英寸和分辨率 540 x 960、屏幕尺寸 4.5 英寸的 DPI 为:
与分辨率无关的测量单位
支持下面列出的所有单位
下面几个问题让大家更深入的了解dp的定义和含义
1. 为什么指定规格的显示器上1dp = 1px?
答:这个在公司官方文档中有解释,因为第一台设备(HTC的T-G1)就属于它。
尺寸 和 是尺寸和 mdpi() 。 这是基于第一款 T-G1,它具有 HVGA(直到 1.6,这是唯一的)。
为什么说它属于?
T-G1的DPI,其实它准确的PPI并不等于160。G1的配置信息如下:
屏幕尺寸:3.2英寸(8.1厘米)
分辨率:320×480(HVGA)
如果按照上面的计算方法,T-G1应该属于。 用计算器计算,结果是180。
为什么不直接使用 180 作为基准 (mdpi) 而不是 160?
180不太好适应dpi是什么意思,但是160无论是乘以0.5/2/1.5都很容易适应。 这就是为什么它属于而不是等于。
为什么选择一个作为标准呢?
其实为了不针对每个设备厂商做适配(其实资源文件的分包也算适配:-hdpi、-ldpi),不同屏幕尺寸、不同dpi的设备大致分为四类,如图以下:
可以看到,T-G1的参数属于mdpi区域,以上就是以它们为基准的原因。
编程过程中获得的dpi与手动计算的dpi不同。 由于这里的分类,不同 dpi 设备上的缩放比例略有不同。 详细请看下面第三点。
2. DP
如果有兴趣,可以看一下这个类的源代码(网站):.util。 (.java)。 这个类有非常详细的dpi相关的成员函数和变量。 下面的代码是开发时获取dpi的代码。
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
iDensity = (int)( metrics.density * 160 );
2.1. 为什么要引入dp?
答:dp其实就是dip(像素),独立密度像素,也就是说与密度(dpi)无关。
我使用dp作为单位设置控件。 无论您的屏幕尺寸或dpi如何,显示效果始终保持一致。
例子:
不要使用dp,使用px效果
如果我们不引入dp,仍然使用原来的px,那么现在我们需要在手机屏幕上画一条直线。 在(每英寸160像素)、宽度为1英寸的手机上,我们将这条线的长度设置为160px(占用160像素),即直线的长度正好是手机的宽度。 但是(每英寸240像素),如果这个应用安装在宽度为1英寸的手机上,长度仅为屏幕宽度的2/3。
类似下面的效果:
使用dp的效果
为了使用户界面能够在当前和未来的显示类型上正确显示,建议您始终使用 sp 表示文本大小单位,使用 dup 表示其他元素。当然,您也可以考虑使用矢量图形而不是位图
2.3. px和dp的换算公式
px和dp之间的换算公式:px = dp * (dpi / 160)
dp:dp 是一个像素,表示 160 dpi 下的像素大小(每英寸点数:每英寸点数)。
dp是dip:(与设备无关的像素)
dp 是与密度无关的像素单位。 在每英寸 160 点的屏幕上,1dp = 1px
不同的设备有不同的显示效果。 这与设备硬件有关。 一般来说,为了支持WVGA、HVGA和QVGAdpi是什么意思,我们推荐使用这个,它不依赖像素。
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clickme"
android:layout_marginTop="20dp" />
sp:sp 是相同的基本单位,但由用户的文本大小(它是缩放像素)决定,因此在文本大小时使用此单位(但从不用于大小)。
(缩放像素)。 主要用于定义字体大小,不再使用
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
px:(像素)。 不同设备显示效果相同。 一般来说,HVGA代表像素,用得比较多。
3、为什么手动计算的dp对应的px大小与实际显示的px不一样
1、不同手机上的控件大小和屏幕比例其实是差不多的。 由于屏幕尺寸、像素密度等紧密归为一类dpi,因此实际显示的px与手动计算的px尺寸存在一定差异。
由于 的划分,使用了 dp 作为长度单位,导致计算出的 px 与实际显示的 px 不一致。
设备 1:索尼 Z2 屏幕尺寸:5.2 英寸 屏幕分辨率:1080*1920 DPI:424
设备2:华为Mate 7 屏幕尺寸:6.0英寸 屏幕分辨率:1080*1920 DPI:367
应用公式 px = dp * (dpi / 160),开发人员编写了一个高度为 48dp 的控件。
索尼Z2上的渲染像素为:48*424/160=127.2px
华为Mate 7上的渲染像素为:48*367/160=110.1px
这显然是荒谬的。
1、出现小数点像素数,像素最小单位为1,设备上无法显示。
2、根据实际截图测试,索尼Z2实际渲染像素为144px(@3x),华为Mate 7实际渲染像素为144px(@3x)。
也就是说,实际渲染的像素并不是按照这个公式计算的。 它是根据渲染倍率(即@2x、@3x)计算的。
实际渲染的像素如下:
在索尼Z2上实际渲染的像素为:48@3x=144px
华为Mate 7上实际渲染像素为:48@3x=144px
原因:
作为基准,对应的是1.0(mdpi),对应的是1.5(hdpi),对应的是2.0(xhdpi)...
最关键的一点是,真实手机屏幕的ppi将是最接近上述标准的标准ppi! 然后根据最接近的ppi来决定。
限定符指定比例
LDPI
低密度 (ldpi) 屏幕 (0dpi~) 的资源。
1dp=3/4像素
平均密度指数
中密度 (mdpi) 屏幕的资源 (~)。 (这是基线密度。)
1dp = 1 像素
高清晰度
高密度 (hdpi) 屏幕的资源 (~)。
1dp = 1.5 像素
高清像素
超高密度 (xhdpi) 屏幕的资源 (~)。
1dp = 2 像素
超高密度()屏幕的资源(~)。
1dp = 3 像素
超超高密度()屏幕的资源(~)。
1dp = 4 像素
2.这是一个假设,使用手动计算的dpi(通过公式dpi = 屏幕对角线像素数(px)/屏幕对角线长度(in)),相同的dp在不同的移动设备上显示相同的物理尺寸手机,而不是相同的屏占比。
px和dp之间的换算公式:px = dp * (dpi / 160)
px = dp * (dpi / 160) = dp * (px (屏幕对角线像素) / in (屏幕尺寸) / 160)
因此,当dp不变且in不变时,屏幕对角像素数越多,控件的px就越大。
这是一个例子:
手机类型 屏幕对角线像素数 屏幕尺寸 显示像素数 160dp 显示英寸数 160dp 占屏幕对角线比例
手机A
480像素
3英寸
160
1英寸
1/3
手机B
640像素
2英寸
320
1英寸
1/2
手机C
960像素
3英寸
320
1英寸
1/3
即使使用dp,也不能保证理论上所有手机都能完美适配。
本质上是规定160dp等于1in,但是内部已经为手机做了很好的dpi划分,所以使用dp就成为了解决手机适配的方法。 您可以使用多部手机进行验证。
那么为什么用dp作为长度单位可行呢?
有可能在手机的发展过程中,手机A不会从手机B变成手机B。即使有估计,也不会有这么大的反差(屏幕会缩小1/3)并且分辨率将增加1/2)。
另外,我估计手机厂商已经在内部设置好了dpi值。 谷歌在对屏幕进行分类时也处理了这些问题。 关于手机对应的dpi如何分类,请参考这里。
本质上是规定160dp等于1in,但是内部已经为手机做了很好的dpi划分,所以使用dp就成为了解决手机适配问题的方法。
总结:dp也是dip。 这和sp基本类似。 如果设置长度和高度等属性,可以使用dp或sp。 但如果设置字体,就需要使用sp。 dp与密度无关,sp不仅与密度无关,而且与尺度无关。
如果屏幕密度是160,那么dp、sp和px是相同的。 1dp=1sp=1px,但是如果以px为单位的话,如果屏幕尺寸不变(假设还是3.2英寸),那么屏幕密度就变成了320。那么原来的宽度设置为100px,在上面看起来就矮了一半密度为320的3.2英寸屏幕与密度为160的3.2英寸屏幕相比。
但如果设置为100dp或100sp。 系统会自动将width属性值设置为200px。 即100 * 320 / 160。其中320/160可以称为密度缩放因子。 也就是说,如果你使用dp和sp,系统会根据屏幕密度的变化自动进行转换。
px和dp相互转换代码
package com.hujl.util;
import android.content.Context;
public class DensityUtil {
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
//因为有的dpi为160的1.5倍,所以计算完后,为了没有小数,加0.5
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);
}
}
参考:
该博客混淆了 dpi 和 ppi: