版权声明:shell
本帐号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影全部。ide
每周会统一更新到这里,若是喜欢,可关注公众号获取最新文章。布局
未经容许,不得转载。字体
昨天发了一篇文章,讲解修改设置中『字体大小』,到底影响的是什么。有兴趣的能够先去看看:《》3d
而在设置中,除了设置『字体大小』以外,还有一个『显示大小』的设置,本片文章就来聊聊,当你修改『显示大小』以后,你到底在修改什么?code
在 UI 适配的时候,咱们通常推荐使用 dp 设置距离和大小,而使用 sp 来设定字体大小。cdn
在使用 dp 为单位来作屏幕适配的时候,影响效果的主要有屏幕像素和 density,当你知道这两个参数以后,你就能很清晰的知道,假如你想写一个全屏的 UI 的时候,除了使用 match_parent 以外,你还能够直接指定一个绝对的 dp 值,进行全屏化。xml
首先说点题外的概念,你想经过 DisplayMetrics 获取到设备的 density 的时候,你会发现它实际上有两个值:density 和 densityDpi。对象
例如正常咱们所说的 3 倍的手机,density 为 3.0 ,densityDpi 为 480。blog
它们之间的关系,就是以 160 为基准倍数,进行计算,公式以下:
density * 160 = densityDpi
不过这里对它们的理解,最好不要硬记名称,在不少场景下,说到 density 就是咱们这里说的 densityDpi。咱们只须要看它们的值就知道它们的关系,毕竟不会有一个 480倍(density)的手机。
拿到一个标准的屏幕尺寸,例如一个标准的 3 倍的手机,它的参数以下:
经过这些参数,咱们就能够算出,该设备全屏支持的 dp 值就是 360dp*640dp。
了解到一个 3 倍的设备,设置全屏须要写 360dp * 640dp ,接下来咱们就开始写个 Demo 来看看效果。
这里只是作一个横向的铺满屏幕的设定,屏幕宽度铺满须要 360dp。咱们这里使用一个 TextView 来设定十个字符,每一个字符的尺寸为 36dp。同时下面作一个 View 铺满屏幕 360dp。
让咱们看看在设备上运行的效果:
而当咱们在设置页面中,修改了『显示尺寸』以后,显示的效果就不同了。
前面设置页面中,『显示尺寸』的设定,能够设置三个值:小、默认、大。
先看看调小以后的效果:
能够看到,将『显示尺寸』调小以后,360dp 已经没法铺满横向的一屏了。
再来看看,当它调整到大的时候,显示的效果吧。
能够看到,调大以后,一行字,虽然同为 36dp 的文字已经写不下一行了,基本上已经超出了屏幕以外。
既然已经知道了现象,那么咱们看看,当咱们调整了『屏幕尺寸』以后,咱们到底改变了什么。
前面提到,获取到屏幕相关的一些参数,可使用 DisplayMetrics 这个对象来获取。
示例代码以下:
在『屏幕尺寸』为默认的时候,咱们是已经知道它的输出了,接下来运行看看在屏幕尺寸为大的时候,输出的值。
经过输出的 Log,看到其实屏幕的像素尺寸并无改变,而它的 density 却发生了改变。
这也致使,横向的 dp 尺寸,由本来的 360 变成了 320(1080/3.375),因此才会致使本来适配的很好的 UI ,已经在一屏之中显示不下的缘由。
相反,当『屏幕尺寸』设置为 小 的时候,实际上缩小了 density ,从而加大了铺满一屏的 dp 尺寸,致使文字没有恰好显示一屏。
使用 DisplayMetrics 的方式,还须要写代码来验证。有一个更简单的方式来验证它,就是使用 wm 命令来验证,它能够支持获取到当前屏幕的 density。
adb shell wm density
从输出的结果也能够看到,它是有一个 Physical density 和 Override density 的,从字面意思,不难看出它们的含义。
wm 命令就是前面提到的一个很典型的 density 和 densityDpi 概念互通的例子,这里说的 density 就是 DisplayMetrics 中的 densityDpi,你们了解一下就能够了。
来看看,当『屏幕尺寸』设置为大的时候,wm
命令输出的结果吧。
到这里,就能够得出结论,当你修改设置页面的『屏幕尺寸』的时候,实际上你在修改你设备的 density 值,它也决定了你的 UI 是如何显示在屏幕上的。
点赞或者分享吧~