android更换字体
最近在研究android端字体替换需求,发现还是有很多方式来替换字体。
一,前言
Android 系统默认使用的是一款叫做 Robote 的字体。Robote 本身就是 Google 自己的字体格式,Android 和 Chrome 操作系统上,默认都会使用 Robote 字体,并且也是 Google 视觉语言推荐的字体,UI设计师的眼光觉得系统自带的字体效果并不满足我们的设计需要因此要更换我们自己app的风格字体。
二,基础
大家都知道影响字体的属性有以下几个:
android:textStyle="bold"
android:typeface="serif"
android:fontFamily="sans-serif"
1. android:textStyle
textStyle 主要用于设定一些字体的样式,它是对所有的字体都生效的。也就是说哪怕你替换了字体,依然可以使用 textStyle 来修饰它的样式。textStyle 本身支持的可选项有 normal|bold|italic,它们也非常的好理解,就是普通|粗体|斜体。
2. android:typeface
typeface 可以用于设置一些默认的字体,它可选的属性有 normal\sans\serif\monospace 等。normal 和 sans 的字体其实是一样的,serif 是一个带衬线的字体,而 nonospace 是等宽字体。
3. android:fontFamily
fontFamily 看着像是对 typeface 的一次加强,从它的可选项就能看出来,它更细致的区分了字体的样式。
需要注意的是,如果同时配置了 typeface 和 fontFamily ,将使用 fontFamily 配置的字体。
而除了 typeface 和 fontFamily 会有冲突之外,它们俩都是可以配合 typeStyle 属性一起使用的,也就是说,这里配置的字体,都是可以再加粗或者加斜体。
三,theme修改全局字体(使用的是系统自带的字体)
在 application 中,通过 android:theme 来配置一个 App 的主题。一般新创建的项目,都是 @style/AppTheme 。在其中追加关于字体的属性 android:fontFamily,它就可以完成对全局设置一个系统字体。当然你可以对一个单独的 TextView 配置一个特别的字体,都是可以接受的。
四,使用自定义字体
一般自定义字体都是ui设计师给的一份.ttf格式的文件,我们丢在assets文件夹里面,想要加载字体文件,需要使用到 Typeface 这个类,它其中提供了一些 Api ,用于帮助我们来加载一个我们自定义的字体文件,封装一个textview控件来写,要不然你需要对每个textview控件进行设置,非常麻烦。
这种方式适用于新的项目,成熟的项目你改起来很痛苦。
五,通过反射修改全局字体
1.修改 Theme
在 App 的主题中,修改 android:typeface 为 serif。
2.通过反射修改 Typeface 的字体
3.在application.onCreate()使用
整体使用很简单一到到位。
六,LayoutInflaterCompat.setFactory()修改字体
LayoutInflaterCompat.setFactory() 替换掉 LayoutInflaterFactory 或者 LayoutInflater.Factory2,来达到我们替换控件的目的,从而实现全局字体的替换。
查看setFactory的源码可以发现,setFactory() 接收一个 LayoutInflaterFactory 的对象,它实际上是一个接口,需要我们实现其中的 onCreateView() 方法。
我们这里主要的功能,就在于实现 onCreateView() 方法,将我们需要的控件在这个方法中替换掉。
首先,定义一个 Activity 为基类,其中在 super..onCreate() 方法之前,调用 LayoutInflaterCompat.setFactory() ,然后将它的替换为 我们自己定义的 CustomFontCompatDelegate类。
FontTextView是上文写的自定义txetview,项目中还有button,editext等,都可以这样处理。