Android系统是一个相对开放的系统,在我们平常开发的时候有时候会直接使用原生的控件更换下背景图片。如果想让我们的APP变得大漂亮,那么我们会对UI进行深度定制,变成我们所希望的那样。而一个APP的大漂亮除了UI的漂亮,很多时候字体也是影响大漂亮的因素之一。最近在开发中就有客户的需求是数字要显示为那种液晶仪表盘的那种方正一些的样子。
OMG,可难为死我了。试了下Android自带的字体库,支持三种字体:Sans、serif、monospace,然后试了下。格劳资滴,看不出太明显的变化嘛,更别说要满足客户的那个需求了。查阅资料后发现其实Android提供了支持使用自定义字体库的功能,哇哦,还不快快走起。先上图,有图有真相。
嗯,看下面的文字就可以了哈。为了有对比这里我写了6组不同的字体,前三组为系统自带分别为Sans、serif、monospace,后面的我也不知道叫啥,随便从网上下的。可以看到系统自带的差别都不是很大,而且中文都是统一样式。人家也说了,只支持英文和数字,为啥?你问我为啥?系统是人家做的,人家又不用中文,知道为啥了不。可以看到我上面的按钮是系统默认的,其实就是Sans。至于谁比谁更漂亮,这个还是看自己的喜好吧,毕竟人家还有喜欢那个年龄大点的呢,人家那叫韵味。
好了,看也看到效果了,那说下怎么用呗。介绍两种用法,1、在控件中针对设置Typeface 2、针对APP全局设置 但不管怎么用,都得先引入自己的字体库。
在assets下面建fonts,将字体库放进去,其实直接放在assets下面也没问题
第一种,局部使用。获取到View之后调用tv4.setTypeface(Typeface.createFromAsset(getAssets(),"fonts/digital-7.ttf"));
如果你是直接放在assets下记得把路径改正确就可以了,还有大小写别搞错了哈。
完了?是的,不信自己运行看效果撒。
第二中,全局配置使用。
首先在你的Application下,什么,你说这个是系统的类,你自己继承它撒。在你自己的Application类里面写如下代码:
Typeface typeface = Typeface.createFromAsset(getAssets(),"fonts/hk.ttf");
try {
Field field = Typeface.class.getDeclaredField("MONOSPACE");
field.setAccessible(true);
field.set(null,typeface);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
记得用自己的Application哈,就是在AndroidManifest的application节点添加android:name=".App"的啦。然后就是在这个节点下面有个android:theme="@style/AppTheme",找到对应的样式,添加monospace 就是要使用monospace这个字体库。为什么是这个,你上面的代码不是写的MONOSPACE这个的嘛,不就是个偷梁换柱迈,然后就可以跑起来看哈了。来张效果图:
看到没得,全部都变了,赖死赖死。
你以为就这么的简单?是的,其实就是这么简单。那为什么还有后面这段废话呢?其实这里想延申以下思维,比如我们的APP有在使用过程中更改字体的需求,也就是用户已经进我们的APP了,Application已经初始化了怎么能即时的更换字体?其实有两种相对简单些的方式,第一种用户进行更换后暴力的把APP重新启动一次,就是简单粗暴了些,不过我喜欢。第二种是要对每个页面的控件进行遍历,其实能放文字进去的无非就那么几种嘛,对他们使用上面使用字体库的第一种方案,对每个控件重新设定它的Typeface,这个相对要复杂点,而且还可能有自定义控件呢。不过至少可以作为一种方案来选择。
其实Android的字体一般情况是不太建议去换的,除非你能确定你拿到的字体库一定是可以支持你的业务的,不然要是缺一些字体的话,那就可能从你希望的大漂亮变成丑丑丑了。
总结一句话:有的东西你不一定会用到,但有机会一定要去了解下,万一哪天就用上了呢!