前言
字体设置是Android开发中比较常用的需求,因为不同的手机厂商定制的ROM的缘故,手机系统的默认字体在不同品牌上是不一致的,而产品人员提出固定app字体的样式,或者app考虑繁体地区如港澳台,东南亚华人区,需要提供简繁字体切换,对于以上需求,仅仅依靠系统提供的默认字体是满足不了的。
演示效果
GitHub链接
全局字体设置和自定义字体控件库-------ReplaceFonts
特性:
- app全局字体设置.
- 支持自定义字体替换的View和TextView,ToolBar子类.
导入
原理
1. 全局字体设置:利用反射的原理,在app启动时,替换掉app字体属性DEFAULT和MONOSPACE对应字体文件路径,然后再通过设置app主题style的item属性 android:typeface = monospace,从而达到全局替换字体的目的; 2. 自定义字体控件:单单通过方式1设置全局字体,只对系统自带的View类,如TextView及其子类有效,而通过canvas和paint绘制文本的方式,并不起作用,此时,需要通过自定义View的paint的setTypeface(Typeface.MONOSPACE)方法来达到目的。
下面来看看具体如何操作
1.全局字体设置
(1).将需要的字体ttf文件放置到assets目录下的,
图中 fzltxhf.TTF为繁体字体,fzltxhj.TTF为简体字体
(2).在Application使用的theme中添加标签
(3).在Application中初始化字体文件,这里需要使用到第三方的工具类FontUtil,在replaceSystemDefaultFontFromAsset(this,"fonts/fzltxhj.TTF")方法中传入context和字体文件相对路径,如按图1放置,路径为"fonts/fzltxhj.TTF".
(4).如果使用到了ToolBar,用FontSystemToolBar替换,同时要通过paddingLeft来控制标题的左偏移量.
(5).如果使用到了自定义View,请继承该库的FontSystemview或参照以下方式修改自定义View的字体.
(6).通过以上操作,便可完成整个app字体的统一替换.
2.自定义字体控件
(1).创建View的子类,通过paint.setTypeface(typeface)改变字体,也可以直接声明public static String fontAssetPath = Configs.FONTS_XHJ;
注意整个app同一种字体只需读取一次文件,因为字体文件读取比较耗费时间并且会占用一定量的内存.
(2).创建TextView的子类,通过TextView的setTypeface(typeface)方法来改变字体,也可以直接声明
public static String fontAssetPath = Configs.FONTS_XHJ;注意事项同上.
3.简繁体切换
其实就是字体切换,通过SP配置文件记录用户选择的字体样式,只要在Application的onCreate方法里,加载不同的字体文件即可.
注意事项
如果app项目需要简繁体切换功能,切记不要在TextView控件类的setText()方法或自定义字体控件的canvas.drawText()方法直接使用繁体字文本数据-即下图红框所示,否则无论是全局替换的方式还是自定义字体控件,都会导致系统的TextView控件类和开发者自定义的字体控件的简繁体不一致,通过加载同一种字体的简体文件或繁体文件,并且只使用简体文本数据,来实现简繁切换功能,。
喜欢我的文章的话,请多多关注。