Android常用需求一:全局字体设置及自定义字体控件

前言

       字体设置是Android开发中比较常用的需求,因为不同的手机厂商定制的ROM的缘故,手机系统的默认字体在不同品牌上是不一致的,而产品人员提出固定app字体的样式,或者app考虑繁体地区如港澳台,东南亚华人区,需要提供简繁字体切换,对于以上需求,仅仅依靠系统提供的默认字体是满足不了的。


演示效果


GitHub链接

      全局字体设置和自定义字体控件库-------ReplaceFonts

特性:

- app全局字体设置.

- 支持自定义字体替换的View和TextView,ToolBar子类.

导入

Android常用需求一:全局字体设置及自定义字体控件_第1张图片
compile


原理

1. 全局字体设置:利用反射的原理,在app启动时,替换掉app字体属性DEFAULTMONOSPACE对应字体文件路径,然后再通过设置app主题style的item属性 android:typeface = monospace,从而达到全局替换字体的目的;                                                                                                                                    2. 自定义字体控件:单单通过方式1设置全局字体,只对系统自带的View类,如TextView及其子类有效,而通过canvas和paint绘制文本的方式,并不起作用,此时,需要通过自定义View的paint的setTypeface(Typeface.MONOSPACE)方法来达到目的。



下面来看看具体如何操作

1.全局字体设置

(1).将需要的字体ttf文件放置到assets目录下的,

Android常用需求一:全局字体设置及自定义字体控件_第2张图片
1_assets目录

图中 fzltxhf.TTF为繁体字体,fzltxhj.TTF为简体字体

(2).在Application使用的theme中添加标签mononspace

Android常用需求一:全局字体设置及自定义字体控件_第3张图片
2_theme中添加标签


Android常用需求一:全局字体设置及自定义字体控件_第4张图片
2_theme中添加标签

(3).在Application中初始化字体文件,这里需要使用到第三方的工具类FontUtil,在replaceSystemDefaultFontFromAsset(this,"fonts/fzltxhj.TTF")方法中传入context和字体文件相对路径,如按图1放置,路径为"fonts/fzltxhj.TTF".

Android常用需求一:全局字体设置及自定义字体控件_第5张图片
3_初始化字体

(4).如果使用到了ToolBar,用FontSystemToolBar替换,同时要通过paddingLeft来控制标题的左偏移量.

Android常用需求一:全局字体设置及自定义字体控件_第6张图片
4_ToolBar


Android常用需求一:全局字体设置及自定义字体控件_第7张图片
4_ToolBar

(5).如果使用到了自定义View,请继承该库的FontSystemview或参照以下方式修改自定义View的字体.

Android常用需求一:全局字体设置及自定义字体控件_第8张图片
5_自定义View

(6).通过以上操作,便可完成整个app字体的统一替换.

2.自定义字体控件

(1).创建View的子类,通过paint.setTypeface(typeface)改变字体,也可以直接声明public static String fontAssetPath = Configs.FONTS_XHJ;

注意整个app同一种字体只需读取一次文件,因为字体文件读取比较耗费时间并且会占用一定量的内存.

Android常用需求一:全局字体设置及自定义字体控件_第9张图片
6_创建View的子类

(2).创建TextView的子类,通过TextView的setTypeface(typeface)方法来改变字体,也可以直接声明

public static String fontAssetPath = Configs.FONTS_XHJ;注意事项同上.

Android常用需求一:全局字体设置及自定义字体控件_第10张图片
7_创建TextView的子类

3.简繁体切换

       其实就是字体切换,通过SP配置文件记录用户选择的字体样式,只要在Application的onCreate方法里,加载不同的字体文件即可.


注意事项

如果app项目需要简繁体切换功能,切记不要在TextView控件类的setText()方法或自定义字体控件的canvas.drawText()方法直接使用繁体字文本数据-即下图红框所示,否则无论是全局替换的方式还是自定义字体控件,都会导致系统的TextView控件类和开发者自定义的字体控件的简繁体不一致,通过加载同一种字体的简体文件或繁体文件,并且只使用简体文本数据,来实现简繁切换功能,。


Android常用需求一:全局字体设置及自定义字体控件_第11张图片
7_简繁体切换

       喜欢我的文章的话,请多多关注。





   


你可能感兴趣的:(Android常用需求一:全局字体设置及自定义字体控件)