最近一段时间,断断续续的一直在写一个关于修改 App 字体的系列文章,到现在已经写了九篇了,差不多算是将我觉得和字体有关的内容,都讲解清楚了,到现在,应该算是完结了。
花这么大的精力和篇幅,用来讲解 Android 替换字体的所有细节,我相信之后的 Android 技术圈应该不会再有字体相关的文章能超过它了。
当然,我这里并不是说它有多好技术有多深,只是修改字体还改的知识点就这么多,而这个系列的文章已经涵盖了修改字体所涉及到的所有内容,再花精力和时间来重写一遍,也很难有本质上的提高,时间和精力的成本收益不均衡,意义并不大。当然,不排除有更颠覆的技术出现,就另当别论了。
不过今天要聊的,并不是本系列完结后的感言,我真正想说的是,你真的看懂本系列的文章了吗?
从开始写这个系列的文章开始,就一直有一些声音在群里或者评论里。有人说,Google 已经在 Support v26 中,发布了 Font in xml 的方案了;有人说,已经有成熟的开源项目了,你说这些都没有意义。最开始我会说,哦,这个之后会写到,之后慢慢的也不再理会了。
但是,真的是没有意义的吗?
技术是一直在迭代更新的,每天都有新的技术在面世,作为技术人,如果只是一味的追逐这些新鲜的技术如何使用,何时是个头?
如果你想在这个行业一直走下去,你真正需要做的是建立自己的技术知识体系,将你学到的新技术,核心技术和概念抽象出来,形成自己的技术回路,固化在意识中,能将这些经验,横向辐射到其它的技术点上。当然,说这些有点玄奥。
而我们真正需要关心的是这些技术的核心点,它的精髓在哪里,为什么会这么设计,这样的实现到底有缺点在哪里。将技术抽象出来,透过表象看本质,你才能适用在其他技术上。当然,这样境界,通常没有五年以上的经验,很难做到。
知其然不难,还要知其所以然,知一件事所以然,可知百件事所以然。我写这些文章,你看过可以让你得到结论,但是获取、证明、推导、验证这些技术的思维路径,是我更想让你知道的事情。
Google 刚在 Google I/O 大会上宣布 Kotlin 之后为 Android 的主要开发语言,很多人花大力气学它。但是我见过有人,花了小半天看了 Kotlin 的文档和一些关键点,之后用了两周从零写了个完整的 App 出来,现在已经上架,广告收入还不错。这些才是掌握了核心技术的人,任由技术如何发展,只要他们还在这个行业内,他们是不会被淘汰的,因为他们有自己的技术体系,很多东西哪怕没接触过也能分析出大概的原理。而这些,才是真正想走技术路的技术人,真正需要培养的能力。
再来反观本字体系列的文章,透过他们你能看到什么?其实整体的系列,主要就是分四部分。
一、了解修改字体相关的基本知识。
这两篇文章,主要讲解了修改字体你需要用到的一些属性,还有系统默认字体的细节,以及加载自定义字体需要用到的 Typeface 这个类的源码细节。
当你决定需要用一个方案去实现某个功能的时候,你提前需要了解到这个方案,所涉及到的所有的细节,这样避免给今后的自己埋坑。
不能说用到一个 Api,挺好用,调用 setXxx() 就可以实现。如果你到这里就完了,那永远只能是个初级。
最少你需要知道 setXxx() 方法内部到底干了什么?线程是否安全?使用的时候有没有什么需要注意的情况?这些细节,只能通过读源码来找到答案。
二、一些可以解决问题但不***的方案
3、粗暴的方式,替换全局字体。
4、通过反射,修改 Typeface,替换全局字体。
这两篇文章,讲了一些不优雅的方案,例如全局替换自定义控件,在 onCreate() 的时候遍历 ViewTree ,以及通过反射去修改 Typeface 的某个默认字体,然后配合主题的设置去修改全局字体。
这些,其实最终都不会被用在商业项目上,除了不优雅,局限性和效率问题,都是商业项目需要考虑的,但是并不阻碍我们了解这些方法。
修改字体这个功能,实际上是有更好的解决方案的,但是并不排除有其他的需求,暂时找不到别的更好的方案。那么,这个时候能解决问题的方案,就是好方案,需要解决的是让这些不好的方案,影响不要那么大。
三、低成本快速的替换控件
5、利用 AppCompatDelegate ,全局替换字体。
6、修改 LayoutInflater,全局修改字体。
7、通过自定义属性,低成本添加多个字体。
其实到***,你就会发现,最终的问题在于,如何低成本、快速优雅的替换掉控件,或者统一的为控件附加字体信息。
而这些方案,你横向辐射一下,你会发现,它不仅仅适用于替换字体。全局替换控件,并不是要手动一个布局文件一个布局文件的去修改,用 AppCompatDelegate 或者 LayoutInflater 也能快速全局替换。自定义属性并不是只有在自定义控件的时候才可以用上。
而这些概念,所有需要替换控件的地方,都可以使用。例如:换肤、无埋点统计,这些都是可以用到的。如果你单纯的把它当成一个替换字体的解决方案,那它也只能替换字体。
四、其他新的或者成熟的方案
8、Android Oreo 可下载字体。
9、利用成熟开源库,替换全局字体。
Support v26 新增加的可下载字体,也是一个不错的解决方案。但是在商业项目上,对这些库的版本升级,都是谨慎的。而使用成熟的开源库,也是一个不错的方案。
开源库,用的时候非常的爽,引入进来,按文档改个关键点,就可以实现功能。但是只要是解决方案,都会有局限性,你在使用它的时候一定要了解清楚它的所有细节,知道它的核心原理是什么?技术盲点在哪里?
如果你最终选择了开源库来替换字体,如果你看了之前的文章,你会发现实际上这个开源库也只是前面几篇文章中,介绍的技术点的一个不同的使用方式,你用起来就可以比较放心,知道出了问题大概是哪里的问题,如何快速解决。
成熟的开源库很多,但是如果你还是只停留在使用上,你再次出去面试的时候,面试官问你为什么选择它?它的核心原理是什么?有没有别的替代方案?你怎么回答?难道说因为大家都用吗?
这些就是你核心竞争力的体现。
***,我想说,技术路漫漫,且行且珍惜。
不要只是流于表面,将技术原理抽象理解,固化在自己意识中,形成自己的技术回路。这样你才能在这个技术大爆炸的时代,你的经验才能保值,无惧变化。
结论固然重要,但是获取、证明、推导、验证这些技术的思维路径,是我更想让你知道的事情。
【本文为51CTO专栏作者“张旸”的原创稿件,转载请通过微信公众号联系作者获取授权】