版权声明:

本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。

每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章。

未经允许,不得转载。

一、前言

昨天发了一篇文章,讲解修改设置中『字体大小』,到底影响的是什么。有兴趣的可以先去看看:《》

而在设置中,除了设置『字体大小』之外,还有一个『显示大小』的设置,本片文章就来聊聊,当你修改『显示大小』之后,你到底在修改什么?

/dp-setting.png

二、使用 dp 的全屏布局

2.1 使用 dp 做一个全屏应该写多少

在 UI 适配的时候,我们一般推荐使用 dp 设置距离和大小,而使用 sp 来设定字体大小。

在使用 dp 为单位来做屏幕适配的时候,影响效果的主要有屏幕像素和 density,当你知道这两个参数之后,你就能很清晰的知道,假如你想写一个全屏的 UI 的时候,除了使用 match_parent 之外,你还可以直接指定一个绝对的 dp 值,进行全屏化。

首先说点题外的概念,你想通过 DisplayMetrics 获取到设备的 density 的时候,你会发现它实际上有两个值:density 和 densityDpi。

例如正常我们所说的 3 倍的手机,density 为 3.0 ,densityDpi 为 480。

它们之间的关系,就是以 160 为基准倍数,进行计算,公式如下:

density * 160 = densityDpi

不过这里对它们的理解,最好不要硬记名称,在很多场景下,说到 density 就是我们这里说的 densityDpi。我们只需要看它们的值就知道它们的关系,毕竟不会有一个 480倍(density)的手机。

拿到一个标准的屏幕尺寸,例如一个标准的 3 倍的手机,它的参数如下:

  • screen px:1080x1920
  • density:3.0
  • densityDpi :480

通过这些参数,我们就可以算出,该设备全屏支持的 dp 值就是 360dp*640dp。

2.2 dp 全屏的效果

了解到一个 3 倍的设备,设置全屏需要写 360dp * 640dp ,接下来我们就开始写个 Demo 来看看效果。

/dp-xml.png

这里只是做一个横向的铺满屏幕的设定,屏幕宽度铺满需要 360dp。我们这里使用一个 TextView 来设定十个字符,每个字符的尺寸为 36dp。同时下面做一个 View 铺满屏幕 360dp。

让我们看看在设备上运行的效果:
/dp-demo1.png

而当我们在设置页面中,修改了『显示尺寸』之后,显示的效果就不一样了。

前面设置页面中,『显示尺寸』的设定,可以设置三个值:小、默认、大。

先看看调小之后的效果:

/dp-demo2.png

可以看到,将『显示尺寸』调小之后,360dp 已经无法铺满横向的一屏了。

再来看看,当它调整到大的时候,显示的效果吧。

/dp-demo3.png

可以看到,调大之后,一行字,虽然同为 36dp 的文字已经写不下一行了,基本上已经超出了屏幕之外。

2.3 屏幕尺寸到底改变了什么

既然已经知道了现象,那么我们看看,当我们调整了『屏幕尺寸』之后,我们到底改变了什么。

前面提到,获取到屏幕相关的一些参数,可以使用 DisplayMetrics 这个对象来获取。

示例代码如下:

/dp-code.png

在『屏幕尺寸』为默认的时候,我们是已经知道它的输出了,接下来运行看看在屏幕尺寸为大的时候,输出的值。

/dp-largescreen.png

通过输出的 Log,看到其实屏幕的像素尺寸并没有改变,而它的 density 却发生了改变。

这也导致,横向的 dp 尺寸,由原本的 360 变成了 320(1080/3.375),所以才会导致原本适配的很好的 UI ,已经在一屏之中显示不下的原因。

相反,当『屏幕尺寸』设置为 小 的时候,实际上缩小了 density ,从而加大了铺满一屏的 dp 尺寸,导致文字没有刚好显示一屏。

2.4 快速验证这个结论

使用 DisplayMetrics 的方式,还需要写代码来验证。有一个更简单的方式来验证它,就是使用 wm 命令来验证,它可以支持获取到当前屏幕的 density。

adb shell wm density

从输出的结果也可以看到,它是有一个 Physical density 和 Override density 的,从字面意思,不难看出它们的含义。

wm 命令就是前面提到的一个很典型的 density 和 densityDpi 概念互通的例子,这里说的 density 就是 DisplayMetrics 中的 densityDpi,大家了解一下就可以了。

来看看,当『屏幕尺寸』设置为大的时候,wm 命令输出的结果吧。

/dp-wm.png

三、小结

到这里,就可以得出结论,当你修改设置页面的『屏幕尺寸』的时候,实际上你在修改你设备的 density 值,它也决定了你的 UI 是如何显示在屏幕上的。

公众号二维码.jpg

点赞或者分享吧~


plokmju88
1.5k 声望132 粉丝

大家好,我是承香墨影。