最近各大项目都要换字体,所以调研了一下
首先,是换字体的方法:
如果是TextView
的话,一个是style
中的fontFamily
,一个是Typeface
如果是EditText
的话,仅有style
中的fontFamily
如果是WebView
的话,上述两个都无效,仅有嵌入css替换字体的方案
然后,是具体的替换方式,还是以上述三个分布来看:
-
style
中设置fontFamliy
- 先来了解下Android原生使用的字体,思源黑体(san),思源宋体(serif),其实还有两个,一共四个,但是这两个足够满足绝大部分的需求了。不得不说下的华为,由于某些众所周知的原因,华为取消了默认字体,所以设置这两个是无效的,当前测试的情况是,华为仅数字字母生效,其他不生效,这个其实是Android自己的逻辑,字体没有的话,使用系统默认的字体。使用方法就是将
<item name="fontFamily">serif</item>
这行加在App使用的Theme里面。 - 然后是自定义字体,将字体文件放在res目录下的font里面,然后建立xml,按语法写好就好了。调用方式就是
<item name="fontFamily”>@font/your_font</item>
- 先来了解下Android原生使用的字体,思源黑体(san),思源宋体(serif),其实还有两个,一共四个,但是这两个足够满足绝大部分的需求了。不得不说下的华为,由于某些众所周知的原因,华为取消了默认字体,所以设置这两个是无效的,当前测试的情况是,华为仅数字字母生效,其他不生效,这个其实是Android自己的逻辑,字体没有的话,使用系统默认的字体。使用方法就是将
- Typeface
- 从font中取数据,设置给TextView.Typeface就好。下述方法能相应取到
Typeface ResourcesCompat.getFont(context!!, R.font.your_font)
- 从asset中取数据,设置给TextView.Typeface就好。下述方法能相应取到
Typeface Typeface.createFromAsset(context.getAssets(), your_path)
- 从font中取数据,设置给TextView.Typeface就好。下述方法能相应取到
- 嵌入CSS
- 熟悉HTML和CSS的同学应该很清楚怎么换,就是在HTML中嵌入CSS来加载自定义字体。基于Android本身的情况,字体和CSS文件均需要放在assets里面,然后在HTML代码中插入
<link />
链接给HTML代码即可 - 这个方法是有一定问题的,需要先把字体价值进内存,然后再渲染给网页,所以会闪白一下,暂无好的解决方法
- 熟悉HTML和CSS的同学应该很清楚怎么换,就是在HTML中嵌入CSS来加载自定义字体。基于Android本身的情况,字体和CSS文件均需要放在assets里面,然后在HTML代码中插入
最后,是1,2两个方法的限制,3的限制已经写了
fontFamily
和Typeface
是冲突的,即在Style
中设置了字体,一旦TextView
重新设置了Typeface
,就会以新设置的Typeface
为准。举例:fontFamily
设置了思源宋体,Typeface
设置了Typeface.BOLD
,这时,显示的样式是默认字体的加粗,而不是宋体加粗,如果需要使用宋体加粗,需要在设置Typeface
为另一自定义的加粗宋体的字体。
本文作者:刘小宇(Laffey)
本文为原创作品,未经允许不得转载。