当前位置: 首页 > news >正文

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

top

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

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

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

<img data-id="89453" data-role="guide-img" style="max-width: 100%; width: 60px; display: inline;" title="读书分割线" src="https://user-gold-cdn.xitu.io...;>

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

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

sikao

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

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

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

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

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

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

<img data-id="89453" data-role="guide-img" style="max-width: 100%; width: 60px; display: inline;" title="读书分割线" src="https://user-gold-cdn.xitu.io...;>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

naozi

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

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

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

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

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

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

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

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

8、Android Oreo 可下载字体。

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

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

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

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

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

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

<img data-id="89453" data-role="guide-img" style="max-width: 100%; width: 60px; display: inline;" title="读书分割线" src="https://user-gold-cdn.xitu.io...;>

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

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

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

今天在承香墨影公众号的后台,回复『成长』。我会送你一些我整理的学习资料,包含:Android反编译、算法、数据结构、Web项目源码。

iOS 长按打赏

推荐阅读:

  • Glide 这样用,更省内存!!!
  • 跳槽前,不思考这些等于白跳!!!
  • 哪些年熬过的夜,终将会"回报"你的
  • 当你只有一个设备的时候,如何做好屏幕适配
  • Android 源码,在线阅读更方便!!!

点赞或者分享吧~

相关文章:

  • BZOJ-3732: Network (kruskal+LCA)
  • 网络基础(持续更新)
  • Linux运维之道之admin1.1(命令行基础,目录和文件管理)
  • 《团队-科学计算器-模块开发过程》
  • 数据结构之栈
  • 课后作业:字串加密
  • 还没升级 iOS11?这个高危漏洞威胁近9成 iPhone 用户!
  • e租宝雇佣黑客攻击网贷之家 帮凶被判二年六个月
  • java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader)
  • 云计算大数据(Hadoop)开发工程师项目实战视频教程(九部分)
  • MySQL设置UTF8字符
  • Web大前端环境搭建
  • Java并发学习之ReentrantLock的工作原理及使用姿势
  • Jedis cluster集群初始化源码剖析
  • Locust no-web 模式与参数详解
  • .pyc 想到的一些问题
  • 【个人向】《HTTP图解》阅后小结
  • 07.Android之多媒体问题
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  •  D - 粉碎叛乱F - 其他起义
  • Debian下无root权限使用Python访问Oracle
  • JavaScript创建对象的四种方式
  • Java超时控制的实现
  • Kibana配置logstash,报表一体化
  • Making An Indicator With Pure CSS
  • Nodejs和JavaWeb协助开发
  • Python十分钟制作属于你自己的个性logo
  • React-Native - 收藏集 - 掘金
  • WePY 在小程序性能调优上做出的探究
  • XML已死 ?
  • 初识 webpack
  • 多线程事务回滚
  • 三栏布局总结
  • 深入浏览器事件循环的本质
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 我这样减少了26.5M Java内存!
  • 协程
  • ​Python 3 新特性:类型注解
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #FPGA(基础知识)
  • #宝哥教你#查看jquery绑定的事件函数
  • (C++20) consteval立即函数
  • (LeetCode 49)Anagrams
  • (二)fiber的基本认识
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)用.Net的File控件上传文件的解决方案
  • *1 计算机基础和操作系统基础及几大协议
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .Net MVC + EF搭建学生管理系统
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET面试题(二)
  • /bin/rm: 参数列表过长"的解决办法
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解