当你在设置里修改字体大小的时候,到底在修改什么

版权声明:

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

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

未经允许,不得转载。

一、设定字体,该用 sp 还是 dp

对于 Android 开发而言,在开始学习的阶段,就已经被告知,为了达到更好的 UI 适配,应该使用和像素(px)的无关的一些相对尺寸来进行布局。

  • View 的尺寸和距离,使用 dp 为单位。
  • 字体的大小,使用 sp 为单位。

虽然官方推荐使用 sp 为单位设定字体的尺寸,但是如果你依然坚定的使用 dp 来设置字体的尺寸,常规情况下,你会发现其实它们并没有什么区别。

写个 Demo 来验证一下,布局代码如下:

/sp-xml.png

这里分别用了两个 TextView,并分别使用 dp 和 sp 设定了它的尺寸,最后跟随一个 View,它的尺寸和 TextView 的字体同大,来做一个标记。

/sp-demorun.png

可以看到,它们的文字是等大的,并且一个中文的宽度,正好是蓝色的 View 的宽度。

看样子,sp 和 dp 在显示上完全是没有区别的。

而当我们在设置页面,设置了字体的大小之后,这一切就不一样了。

/sp-setting.png

这里,将字体调到最大,再来看看刚才 Demo 的显示效果。

/sp-demorun2.png

能明显看到,使用 sp 为单位设定的字体,已经被变大了,而使用 dp 为单位设定的字体,依然保持原样的尺寸。

由此,可以简单的得出结论:

使用 sp 为单位标记字体,会随着系统的字体大小而改变。而使用 dp 则不会。

而这种设定你也可以在官方文档中找到对应的描述。

/sp-doc.png

大概的意思,就是说 sp 除了受到 density(屏幕密度) 的影响之外,还受到用户设定的字体大小影响,所以一般推荐使用 sp 来设定字体,让字体的显示效果交给用户设定。

有兴趣可以看看文档:

https://developer.android.com/guide/topics/resources/more-resources.html#Dimension

既然已经有这样的结论了,那么就可以清晰认识到:

推荐使用 sp 来作为字体单位,但是如果有需要字体尺寸不跟随系统字体尺寸变动,则可以使用 dp 来作为字体单位。

二、sp 到底是怎么被改变的

到这里就已经了解清楚 sp 和 dp 的区别了,但是我们应该不满足于此,接下来再来研究一下,sp 是在何时被改变的吧。

一切的答案都在源码里。

先从设定文字大小的入口,看看 TextView.setTextSize() 方法。

/sp-settextsize.png

setTextSize() 是有两个重载方法的,如果不设定 TypedValue 的话,它会默认认为你设定的是一个 TypedValue.COMPLEX_UNIT_SP 值,表示以 sp 为单位。

这里最终会使用 TypedValue.applyDimension() 方法,计算出一个值,传递给 setRawTextSize() 方法,在本文中 applyDimension() 方法是如何计算尺寸的。

/sp-dims.png

当 unit 为 COMPLEX_UNIT_SP 的使用,是使用 DisplayMetrics.scaledDensity 为一个比例,参与计算的。

接下来,我们的重点就是找到是什么决定 scaleDensity 的值,看看 scaleDensity。

/sp-scaledensity.png

这里的注释也说明了,scaleDensity 不仅仅受设备的 density 影响,还受用户设定的字体尺寸影响。

DisplayMetrics.scaleDensity 在 DisplayMetrics 类中,并没有初始化的地方,可它是一个 public 的字段,也就是说可以被外部赋值初始化。

真正为 DisplayMetrics 中,各个字段赋值的地方,在 ResourcesImpl 中,有一个 updateConfiguration() 方法,在其中,就有对 scaleDensity 进行初始化的逻辑。

/sp-resource.png

可以看到,这里又引入了一个新的计算因子,fontScale。而从 Configuration 的源码又了解到,fontScale 默认值为 1 ,这也就是为什么通常情况下,density 和 scaleDensity 的值是相等的,它们分别影响了 dp 和 sp 最终渲染出来的像素尺寸。

在 Display.java 的源码中,可以找到修改 fontScale 的过程。

/sp-changescale.png

正常情况下,会有三种不同的比例,0.75f、1.25f、1.0f ,而这里的取值范围,完全是厂商决定的,就像在本文开头距离的设备截图中,可以看到有四个选项。

fontScale 被作为了一个系统的设置项,被存储起来,使用 Settings.System 来进行管理,它的 Key 是 Setting.System.FONT_SCALE

而 FONT_SCALE 最终是由 ActivityManagerService 来负责取出,并且赋值到 Configuration 中的。

/sp-as.png

三、获取用户字体的改变

到这里,本文的所有内容,就形成了闭环,了解清楚 sp 尺寸的来龙去脉。

而在开发过程中,如果想要知道当前环境下,用户是否改变过字体大小,可以直接从 Configuration 中获取即可。

/sp-getfontscale.png

只要不为 1 ,就是表示用户有改变。

公众号二维码.jpg

点赞或者分享吧~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容