Android中的尺寸为什么有这么多参数?
px、dp、dpi、density
px 就不解释了,下面解释下其他参数
dpi
dpi:就是每英寸包含的像素的多少。为什么是英寸,不是厘米?因为是外国人定义的。
density & dp
为什么会出现density这个参数?
第一代andrid设备的dpi是160
但是随着高分辨率的屏幕出现,每英寸中包含的像素远远不止160个,出现了240,320等屏幕。
为了兼容这些高分辨率的屏幕,于是定义了density 和dp 这两个参数。
用dpi=320举例
以第一代android设备的dpi为标准,density = 1
在dpi=320的设备上,density=2,即 density= 当前设备的dpi / 160(第一代android设备的dpi)
density有啥用?
单独的density 好像没啥用,就是一个当前设别和第一代android设备dpi的比值。
所以,还有一个参数dp
dp,dp是android中与屏幕密度无关的单位,使用dp可以不用关心当前设备的dpi到底是多少。
为什么dp有这种功能?看看dp的定义: dp = px * density
所以,在dpi=160的设备上,density=1,1dp = 1px;
在dpi=320的设备上,density=2,1dp = 2px;
这样,使用dp做为单位,就不用担心屏幕当前的dpi到底是多少了
关于屏幕适配
使用density+dp这种方式很好的解决的dpi不一致,无法统一使用px去绘制各种UI的问题。但是却没有解决 UI设计图和真实显示不一致的问题。
例如,现在市面上出现了各种奇奇怪怪的宽高比,16:9,4:3,22:19,23:19等等等等。
这些各种的宽高将会导致这样的问题:
公司的UI基于480dp x 360dp 这样的宽高的设计了交互图,是4:3 。
但是如果遇到了 640dp x 360dp 这种16:9的分辨率,就有问题了,很明显,原来设计图的高度为480dp,在4:3的手机上可以铺满,在16:9的机子上就铺不满了。所以需要屏幕适配。
如何适配
一般来说,屏幕适配只能适配一个方向,竖直方向或者水平方向。 适配的方法有很多,介绍一种我比较喜欢的方法:今日头条适配方法。juejin.im/post/5b7faf…
这种方案是通过动态修改density来实现的,简单介绍一下。
例子 :设计图 480dp x 360dp
适配方向:竖直适配,使得 480dp的显示效果为任意屏幕高度。
假设屏幕高度为 h ,存在一个density 使得 480dp * density = h , density = h / 480。我们只要把这个density设置到Resource的DisplayMetrics里面就可以完成竖直方向的适配了。