看完字体系列的文章,你还觉得我是在说字体?

移动开发 Android
最近一段时间,断断续续的一直在写一个关于修改 App 字体的系列文章,到现在已经写了九篇了,差不多算是将我觉得和字体有关的内容,都讲解清楚了,到现在,应该算是完结了。

[[208286]]

最近一段时间,断断续续的一直在写一个关于修改 App 字体的系列文章,到现在已经写了九篇了,差不多算是将我觉得和字体有关的内容,都讲解清楚了,到现在,应该算是完结了。

花这么大的精力和篇幅,用来讲解 Android 替换字体的所有细节,我相信之后的 Android 技术圈应该不会再有字体相关的文章能超过它了。

当然,我这里并不是说它有多好技术有多深,只是修改字体还改的知识点就这么多,而这个系列的文章已经涵盖了修改字体所涉及到的所有内容,再花精力和时间来重写一遍,也很难有本质上的提高,时间和精力的成本收益不均衡,意义并不大。当然,不排除有更颠覆的技术出现,就另当别论了。

不过今天要聊的,并不是本系列完结后的感言,我真正想说的是,你真的看懂本系列的文章了吗?

从开始写这个系列的文章开始,就一直有一些声音在群里或者评论里。有人说,Google 已经在 Support v26 中,发布了 Font in xml 的方案了;有人说,已经有成熟的开源项目了,你说这些都没有意义。最开始我会说,哦,这个之后会写到,之后慢慢的也不再理会了。

[[208287]]

但是,真的是没有意义的吗?

技术是一直在迭代更新的,每天都有新的技术在面世,作为技术人,如果只是一味的追逐这些新鲜的技术如何使用,何时是个头?

如果你想在这个行业一直走下去,你真正需要做的是建立自己的技术知识体系,将你学到的新技术,核心技术和概念抽象出来,形成自己的技术回路,固化在意识中,能将这些经验,横向辐射到其它的技术点上。当然,说这些有点玄奥。

而我们真正需要关心的是这些技术的核心点,它的精髓在哪里,为什么会这么设计,这样的实现到底有缺点在哪里。将技术抽象出来,透过表象看本质,你才能适用在其他技术上。当然,这样境界,通常没有五年以上的经验,很难做到。

知其然不难,还要知其所以然,知一件事所以然,可知百件事所以然。我写这些文章,你看过可以让你得到结论,但是获取、证明、推导、验证这些技术的思维路径,是我更想让你知道的事情。

Google 刚在 Google I/O 大会上宣布 Kotlin 之后为 Android 的主要开发语言,很多人花大力气学它。但是我见过有人,花了小半天看了 Kotlin 的文档和一些关键点,之后用了两周从零写了个完整的 App 出来,现在已经上架,广告收入还不错。这些才是掌握了核心技术的人,任由技术如何发展,只要他们还在这个行业内,他们是不会被淘汰的,因为他们有自己的技术体系,很多东西哪怕没接触过也能分析出大概的原理。而这些,才是真正想走技术路的技术人,真正需要培养的能力。

再来反观本字体系列的文章,透过他们你能看到什么?其实整体的系列,主要就是分四部分。

一、了解修改字体相关的基本知识。

1、Android 修改字体,细节概述。

2、修改字体所需要的 Typeface。

这两篇文章,主要讲解了修改字体你需要用到的一些属性,还有系统默认字体的细节,以及加载自定义字体需要用到的 Typeface 这个类的源码细节。

当你决定需要用一个方案去实现某个功能的时候,你提前需要了解到这个方案,所涉及到的所有的细节,这样避免给今后的自己埋坑。

不能说用到一个 Api,挺好用,调用 setXxx() 就可以实现。如果你到这里就完了,那永远只能是个初级。

最少你需要知道 setXxx() 方法内部到底干了什么?线程是否安全?使用的时候有没有什么需要注意的情况?这些细节,只能通过读源码来找到答案。

二、一些可以解决问题但不***的方案

3、粗暴的方式,替换全局字体。

4、通过反射,修改 Typeface,替换全局字体。

这两篇文章,讲了一些不优雅的方案,例如全局替换自定义控件,在 onCreate() 的时候遍历 ViewTree ,以及通过反射去修改 Typeface 的某个默认字体,然后配合主题的设置去修改全局字体。

这些,其实最终都不会被用在商业项目上,除了不优雅,局限性和效率问题,都是商业项目需要考虑的,但是并不阻碍我们了解这些方法。

修改字体这个功能,实际上是有更好的解决方案的,但是并不排除有其他的需求,暂时找不到别的更好的方案。那么,这个时候能解决问题的方案,就是好方案,需要解决的是让这些不好的方案,影响不要那么大。

 

[[208288]]

三、低成本快速的替换控件

5、利用 AppCompatDelegate ,全局替换字体。

6、修改 LayoutInflater,全局修改字体。

7、通过自定义属性,低成本添加多个字体。

其实到***,你就会发现,最终的问题在于,如何低成本、快速优雅的替换掉控件,或者统一的为控件附加字体信息。

而这些方案,你横向辐射一下,你会发现,它不仅仅适用于替换字体。全局替换控件,并不是要手动一个布局文件一个布局文件的去修改,用 AppCompatDelegate 或者 LayoutInflater 也能快速全局替换。自定义属性并不是只有在自定义控件的时候才可以用上。

而这些概念,所有需要替换控件的地方,都可以使用。例如:换肤、无埋点统计,这些都是可以用到的。如果你单纯的把它当成一个替换字体的解决方案,那它也只能替换字体。

四、其他新的或者成熟的方案

8、Android Oreo 可下载字体。

9、利用成熟开源库,替换全局字体。

Support v26 新增加的可下载字体,也是一个不错的解决方案。但是在商业项目上,对这些库的版本升级,都是谨慎的。而使用成熟的开源库,也是一个不错的方案。

开源库,用的时候非常的爽,引入进来,按文档改个关键点,就可以实现功能。但是只要是解决方案,都会有局限性,你在使用它的时候一定要了解清楚它的所有细节,知道它的核心原理是什么?技术盲点在哪里?

如果你最终选择了开源库来替换字体,如果你看了之前的文章,你会发现实际上这个开源库也只是前面几篇文章中,介绍的技术点的一个不同的使用方式,你用起来就可以比较放心,知道出了问题大概是哪里的问题,如何快速解决。

成熟的开源库很多,但是如果你还是只停留在使用上,你再次出去面试的时候,面试官问你为什么选择它?它的核心原理是什么?有没有别的替代方案?你怎么回答?难道说因为大家都用吗?

这些就是你核心竞争力的体现。

***,我想说,技术路漫漫,且行且珍惜。

不要只是流于表面,将技术原理抽象理解,固化在自己意识中,形成自己的技术回路。这样你才能在这个技术大爆炸的时代,你的经验才能保值,无惧变化。

结论固然重要,但是获取、证明、推导、验证这些技术的思维路径,是我更想让你知道的事情。

【本文为51CTO专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】

戳这里,看该作者更多好文

 

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2023-11-06 12:57:03

2020-06-24 14:06:04

IPv6IPv4互联网协议

2022-12-08 19:20:11

开源用户使用软件

2010-09-06 10:16:21

CSS字体

2023-06-14 15:06:30

笔迹AI

2009-08-17 07:43:42

Linux命令行安装字linux命令行安装彩色字体设置

2018-06-05 09:00:00

编程字体HackMonaco

2009-12-10 09:40:01

linux安装字体

2019-05-30 09:32:49

2022-02-21 15:49:44

可变字体谷歌字体家族

2019-01-30 13:44:34

JVM内存服务器

2018-05-22 16:21:54

数字体验管理DEMRiverbed

2010-08-25 13:25:22

CSSfont-family

2023-08-10 13:57:50

模型AI

2023-11-29 08:40:48

new关键字

2019-07-10 15:15:23

JVM虚拟机Java

2015-09-18 10:28:02

iOS 9 字体

2010-08-09 15:52:28

2023-04-12 16:56:00

Linux终端字体

2009-07-28 08:55:35

Windows 7本地化字体
点赞
收藏

51CTO技术栈公众号