当你在设置里修改字体大小的时候,到底在修改什么
2017-09-11 22:39
274 查看
版权声明:
本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。
每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章。
未经允许,不得转载。
View 的尺寸和距离,使用 dp 为单位。
字体的大小,使用 sp 为单位。
虽然官方推荐使用 sp 为单位设定字体的尺寸,但是如果你依然坚定的使用 dp 来设置字体的尺寸,常规情况下,你会发现其实它们并没有什么区别。
写个 Demo 来验证一下,布局代码如下:
这里分别用了两个 TextView,并分别使用 dp 和 sp 设定了它的尺寸,最后跟随一个 View,它的尺寸和 TextView 的字体同大,来做一个标记。
可以看到,它们的文字是等大的,并且一个中文的宽度,正好是蓝色的 View 的宽度。
看样子,sp 和 dp 在显示上完全是没有区别的。
而当我们在设置页面,设置了字体的大小之后,这一切就不一样了。
这里,将字体调到最大,再来看看刚才 Demo 的显示效果。
能明显看到,使用 sp 为单位设定的字体,已经被变大了,而使用 dp 为单位设定的字体,依然保持原样的尺寸。
由此,可以简单的得出结论:
使用 sp 为单位标记字体,会随着系统的字体大小而改变。而使用 dp 则不会。
而这种设定你也可以在官方文档中找到对应的描述。
大概的意思,就是说 sp 除了受到 density(屏幕密度) 的影响之外,还受到用户设定的字体大小影响,所以一般推荐使用 sp 来设定字体,让字体的显示效果交给用户设定。
有兴趣可以看看文档:
https://developer.android.com/guide/topics/resources/more-resources.html#Dimension
既然已经有这样的结论了,那么就可以清晰认识到:
推荐使用 sp 来作为字体单位,但是如果有需要字体尺寸不跟随系统字体尺寸变动,则可以使用 dp 来作为字体单位。
一切的答案都在源码里。
先从设定文字大小的入口,看看
这里最终会使用
当 unit 为 COMPLEX_UNIT_SP 的使用,是使用
接下来,我们的重点就是找到是什么决定 scaleDensity 的值,看看 scaleDensity。
这里的注释也说明了,scaleDensity 不仅仅受设备的 density 影响,还受用户设定的字体尺寸影响。
DisplayMetrics.scaleDensity 在 DisplayMetrics 类中,并没有初始化的地方,可它是一个 public 的字段,也就是说可以被外部赋值初始化。
真正为 DisplayMetrics 中,各个字段赋值的地方,在 ResourcesImpl 中,有一个
可以看到,这里又引入了一个新的计算因子,fontScale。而从 Configuration 的源码又了解到,fontScale 默认值为 1 ,这也就是为什么通常情况下,density 和 scaleDensity 的值是相等的,它们分别影响了 dp 和 sp 最终渲染出来的像素尺寸。
在 Display.java 的源码中,可以找到修改 fontScale 的过程。
正常情况下,会有三种不同的比例,0.75f、1.25f、1.0f ,而这里的取值范围,完全是厂商决定的,就像在本文开头距离的设备截图中,可以看到有四个选项。
fontScale 被作为了一个系统的设置项,被存储起来,使用
而 FONT_SCALE 最终是由 ActivityManagerService 来负责取出,并且赋值到 Configuration 中的。
而在开发过程中,如果想要知道当前环境下,用户是否改变过字体大小,可以直接从 Configuration 中获取即可。
只要不为 1 ,就是表示用户有改变。
点赞或者分享吧~
本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。
每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章。
未经允许,不得转载。
一、设定字体,该用 sp 还是 dp
对于 Android 开发而言,在开始学习的阶段,就已经被告知,为了达到更好的 UI 适配,应该使用和像素(px)的无关的一些相对尺寸来进行布局。View 的尺寸和距离,使用 dp 为单位。
字体的大小,使用 sp 为单位。
虽然官方推荐使用 sp 为单位设定字体的尺寸,但是如果你依然坚定的使用 dp 来设置字体的尺寸,常规情况下,你会发现其实它们并没有什么区别。
写个 Demo 来验证一下,布局代码如下:
这里分别用了两个 TextView,并分别使用 dp 和 sp 设定了它的尺寸,最后跟随一个 View,它的尺寸和 TextView 的字体同大,来做一个标记。
可以看到,它们的文字是等大的,并且一个中文的宽度,正好是蓝色的 View 的宽度。
看样子,sp 和 dp 在显示上完全是没有区别的。
而当我们在设置页面,设置了字体的大小之后,这一切就不一样了。
这里,将字体调到最大,再来看看刚才 Demo 的显示效果。
能明显看到,使用 sp 为单位设定的字体,已经被变大了,而使用 dp 为单位设定的字体,依然保持原样的尺寸。
由此,可以简单的得出结论:
使用 sp 为单位标记字体,会随着系统的字体大小而改变。而使用 dp 则不会。
而这种设定你也可以在官方文档中找到对应的描述。
大概的意思,就是说 sp 除了受到 density(屏幕密度) 的影响之外,还受到用户设定的字体大小影响,所以一般推荐使用 sp 来设定字体,让字体的显示效果交给用户设定。
有兴趣可以看看文档:
https://developer.android.com/guide/topics/resources/more-resources.html#Dimension
既然已经有这样的结论了,那么就可以清晰认识到:
推荐使用 sp 来作为字体单位,但是如果有需要字体尺寸不跟随系统字体尺寸变动,则可以使用 dp 来作为字体单位。
二、sp 到底是怎么被改变的
到这里就已经了解清楚 sp 和 dp 的区别了,但是我们应该不满足于此,接下来再来研究一下,sp 是在何时被改变的吧。一切的答案都在源码里。
先从设定文字大小的入口,看看
TextView.setTextSize()方法。
setTextSize()是有两个重载方法的,如果不设定 TypedValue 的话,它会默认认为你设定的是一个
TypedValue.COMPLEX_UNIT_SP值,表示以 sp 为单位。
这里最终会使用
TypedValue.applyDimension()方法,计算出一个值,传递给
setRawTextSize()方法,在本文中
applyDimension()方法是如何计算尺寸的。
当 unit 为 COMPLEX_UNIT_SP 的使用,是使用
DisplayMetrics.scaledDensity为一个比例,参与计算的。
接下来,我们的重点就是找到是什么决定 scaleDensity 的值,看看 scaleDensity。
这里的注释也说明了,scaleDensity 不仅仅受设备的 density 影响,还受用户设定的字体尺寸影响。
DisplayMetrics.scaleDensity 在 DisplayMetrics 类中,并没有初始化的地方,可它是一个 public 的字段,也就是说可以被外部赋值初始化。
真正为 DisplayMetrics 中,各个字段赋值的地方,在 ResourcesImpl 中,有一个
updateConfiguration()方法,在其中,就有对 scaleDensity 进行初始化的逻辑。
可以看到,这里又引入了一个新的计算因子,fontScale。而从 Configuration 的源码又了解到,fontScale 默认值为 1 ,这也就是为什么通常情况下,density 和 scaleDensity 的值是相等的,它们分别影响了 dp 和 sp 最终渲染出来的像素尺寸。
在 Display.java 的源码中,可以找到修改 fontScale 的过程。
正常情况下,会有三种不同的比例,0.75f、1.25f、1.0f ,而这里的取值范围,完全是厂商决定的,就像在本文开头距离的设备截图中,可以看到有四个选项。
fontScale 被作为了一个系统的设置项,被存储起来,使用
Settings.System来进行管理,它的 Key 是
Setting.System.FONT_SCALE。
而 FONT_SCALE 最终是由 ActivityManagerService 来负责取出,并且赋值到 Configuration 中的。
三、获取用户字体的改变
到这里,本文的所有内容,就形成了闭环,了解清楚 sp 尺寸的来龙去脉。而在开发过程中,如果想要知道当前环境下,用户是否改变过字体大小,可以直接从 Configuration 中获取即可。
只要不为 1 ,就是表示用户有改变。
点赞或者分享吧~
相关文章推荐
- 当你在设置里修改字体大小的时候,到底在修改什么
- 当你在设置里修改字体大小的时候,到底在修改什么
- iOS 修改webView字体大小,设置宽度及缩放效果
- android studio默认修改主题,字体,文字颜色,大小等属性的设置
- Java Web基础知识之文件下载:当你下载文件的时候到底发生了什么?
- UGUI在同一个Text里修改字体不同的颜色、大小等设置
- MFC只修改字体的大小,无需重新设置字体类型
- MFC CFont 设置字体大小 等信息的修改
- 系统字体设置(DPI)为120大小的时候,界面错乱问题
- 教你如何修改Android默认字体大小和设置字体大小比例(转)
- android 中对 gps 默认关闭+语言默认中文的设置+时区设置+修改系统名字+修改系统默认时间+修改屏幕休眠时间+修改usb debug默认关闭+mtk修改默认字体大小
- Eclipse最新修改JSP字体大小设置
- TextView在设置高度比较小的时候,字体太大会导致文字看起来不居中,要么改高度要么改字体大小
- 两种解决修改android手机设置中字体大小后系统布局混乱的方法
- ToolBar修改系统后退键图标, 设置menu字体颜色大小
- ScrollView与WebView结合使用时,设置webview字体大小的时候出现下方留白的终极解决方案
- Android 协调者布局title 字体大小颜色修改,设置布局为最上层
- Eclipse设置问题:字体大小、修改注释内容、修改快捷键
- iOS 修改webView字体大小,设置宽度及缩放效果
- ios设置字体-黑体,加粗等 修改textField的placeholder的字体颜色、大小