当你修改设备显示大小的时候,你到底在修改什么?

版权声明:shell

本帐号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影全部。ide

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

未经容许,不得转载。字体

1、前言

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

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

/dp-setting.png
/dp-setting.png

2、使用 dp 的全屏布局

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

在 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 倍的手机,它的参数以下:

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

经过这些参数,咱们就能够算出,该设备全屏支持的 dp 值就是 360dp*640dp。

2.2 dp 全屏的效果

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

/dp-xml.png
/dp-xml.png

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

让咱们看看在设备上运行的效果:

/dp-demo1.png
/dp-demo1.png

而当咱们在设置页面中,修改了『显示尺寸』以后,显示的效果就不同了。

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

先看看调小以后的效果:

/dp-demo2.png
/dp-demo2.png

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

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

/dp-demo3.png
/dp-demo3.png

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

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

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

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

示例代码以下:

/dp-code.png
/dp-code.png

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

/dp-largescreen.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
/dp-wm.png

3、小结

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

公众号二维码.jpg
公众号二维码.jpg

点赞或者分享吧~

相关文章
相关标签/搜索