举个例子:屏幕分辨率为:1920*1080,屏幕尺寸为5吋的话,那么dpi为440
dpi计算公式: 像素密度范围
image.png
用于区分不同的像素密度。
名称 | 像素密度范围 | 图片大小 |
---|---|---|
mdpi | 120dp~160dp | 48×48px |
hdpi | 160dp~240dp | 72×72px |
xhdpi | 240dp~320dp | 96×96px |
xxhdpi | 320dp~480dp | 144×144px |
xxxhdpi | 480dp~640dp | 192×192px |
ndroid项目后应该可以看到很多drawable文件夹,分别对应不同的dpi
drawable-ldpi (dpi=120, density=0.75)
drawable-mdpi (dpi=160, density=1)
drawable-hdpi (dpi=240, density=1.5)
drawable-xhdpi (dpi=320, density=2)
drawable-xxhdpi (dpi=480, density=3)
对于五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 2:3:4:6:8 的比例进行缩放。
如上面例子,屏幕密度计算出来为440dpi 查询上面表的归属320dp~480dp 之间
则屏幕密度为xxhdpi density为440/160
因此我们也可以计算出需要做适配的values-swXXXX,屏幕的宽度为 1080/3=360
则需要新建文件values-sw360dp
只要density理解到了,dpi的理解就没有问题了,它就只跟density有关系。
关系为:dpi = density✖160
这里的160也是一个dpi值,只是160dpi被置为标准dpi。
如果我们确定一个基准值后便可以开始做适配
比喻用values-sw800dp为基准
<dimen name="dp1">1.0dp</dimen>
<dimen name="dp2">2.0dp</dimen>
values-sw480dp-land里面的dimens.xml分别乘以0.6来获得(因为480/800等于0.6)
<dimen name="dp1">0.6dp</dimen>
<dimen name="dp2">1.2dp</dimen>
以此类推。。。。
ldpi QVGA (240×320)
mdpi HVGA (320×480)
hdpi WVGA (480×800),FWVGA (480×854)
xhdpi 720P(1280720)
xxhdpi 1080p(19201080 )
xxxhdpi 4K(3840×2160)
mdpi、hdpi、xdpi、xxdpi、xxxdpi
在Google官方开发文档中,说明了 ** mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 ** 的尺寸比例进行缩放。例如,一个图标的大小为48×48dp,表示在mdpi上,实际大小为48×48px,在hdpi像素密度上,实际尺寸为mdpi上的1.5倍,即72×72px,以此类推。
dimens 适配的原理
令控件占据屏幕的一半,必定是控件根据不同的屏幕来变化尺寸(dp值),这里的思路是在 xml 文件中填写一个占位符,系统运行的时候会根据不同的屏幕尺寸把占位符替换成不同的dp值。
为了实现上面的逻辑需要: 1 定义一个基准屏幕,例如 分辨率是760*1280 密度是 xhdpi 的屏幕,这样屏幕的宽度就是 760/2 = 380dp 。 2 创建不同的 dimes 文件,以便适应不同的屏幕。
例如在 stuido 开发中 利用Nexus4 来开发 xml。也可以创建一个自定义屏幕完全和基准屏幕相同。 在xml 只需要设置 android:layout_width="@dimen/dp190" 即可。这样在基准屏幕上 dp190 会转换为 190dp 正好是 380dp 的一半。至于在其他屏幕上的转换就需要进行下一步 dimes 文件的配置了。
参考
https://www.cnblogs.com/soaringEveryday/p/4835839.html
https://blog.csdn.net/hepann44/article/details/80456233
https://blog.csdn.net/qq_37165429/article/details/78998442
自动生成dimens文件
网友评论