当前位置: 首页 > 科技观察

Android中粗略替换全局字体

时间:2023-03-14 23:37:58 科技观察

序列。在Android下使用自定义字体是比较普遍的需求,最近做了比较深入的研究。然后按照惯例,我再发一篇Android字体修改的文章,但是写下来发现内容挺多的,所以决定拆分成几篇文章详细讲解(也许五篇文章)。主要会是一些常用的字体替换方案,最后会介绍一些全局替换方案,当然也会包括最新的“FontsinXML”方案。期待您的持续关注。本文是本系列的第二篇。有兴趣的可以看看之前发过的文章。Android字体修改概述|开始修改字体,你需要知道Typeface的所有细节1.前言我们已经分析了字体修改的所有细节和字体修改相关的Typeface类。接下来,我们将讨论如何修改全局字体。本文将首先介绍两种修改全局字体的粗略方法。2.自定义控件在开始一个新项目的时候,一般最好定义一个BaseActivity和BaseFragment作为页面的基类,这样我们后面可以给所有的页面添加一些统一的逻辑。但是,任何人都不应该想到提前为所有控件定义一个自定义控件实现。但是如果在开发初期已经考虑到需要修改字体,可以重写一些与字体显示相关的控件。实现全局替换字体的作用。在Android中,最常用的显示字体的控件是TextView。这里重写了一个TextView,实现了替换字体的效果。在TextView中,可以通过setTypeface()方法为TextView设置字体。setTypeface()方法有两个重载方法。无非就是额外传入一个需要设置的textStyle来标记粗体和斜体。其实最后调用的是带参数的setTypeface(,这是设置的关键。可以看到,设置字体其实就是操作的mTextPaint。mTextPaint是TextPaint类的一个对象,直接继承出自Paint,是一个绘制文字的工具.Brush.那么我们可以直接自定义一个TextView,通过构造函数中的setTypeface()方法修改TextView的字体。主要代码如下:注意这里还要考虑到我们在布局中设置的FontTextView的textStyle属性设置,可能是粗体也可能是斜体。通常,为了考虑app的UI统一协调,设计者通常会选择一种字体,所以将需要更换的字体封装在FontTextView中是没有太大问题的。那我们来验证一下,看看达到的效果。这里特意选择了一种特殊的字体。在布局xml文件中,添加三个FontTextView。来看看运行效果吧。此处还考虑了布局中设置的textStyle,使用斜体标记后,已经倾斜的字体变得更加倾斜。这种方法,如果在开发初期可以接受,无非就是在写布局的时候,需要注意自定义控件的使用。除了TextView,还需要重写一系列需要显示文字的控件,比如Button、EditText。还是有点麻烦。而且这个方案如果用在成熟的项目上,修改起来还是很费力的。基本上就是文字替换,修改会比较大。3、遍历ViewTree在Android中,用于显示文本的控件都是直接或间接集成自TextView的,所以我们只需要找一个合适的时机遍历ViewTree的布局,得到TextView的所有子类,然后在修改它们的字体即可batches,这样也可以达到全局替换的效果。在这个replaceCustomFont()方法中,回头判断是否继承自TextView,如果是则替换字体。如果不是,则判断是否是一个ViewGroup,如果是,则从中取出所有子View,递归调用replaceCustomFont()方法。通常,为了在合适的时候修改字体,我们可以在Activity.onCreate()方法或者Fragment.onCreateView()方法之后添加这个方法。需要修改的地方比较少,但是我们还要考虑ListView和RecycverView。动态生成View的逻辑也需要注意不要遗漏。比如写一个布局,在Activity.onCreate()方法中,调用replaceCustomFont()方法。***显示的效果如下。使用这种方式,好处是不需要修改XML布局,也不需要重写多个控件。只需在InflaterView之后调用replaceCustomFont()方法即可。缺点也很明显。每个页面都需要修改,动态加载View的地方可能会遗漏。与之前的解决方案相比,变化略少。而且违反了组件的设计原则,实现方式也略显粗暴。同时每次都会递归遍历ViewTree,对性能会有一定的影响。4.总结本文介绍的几种方法在实际开发中不一定会用到。但不影响我们对此类方法的理解。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文