盘点Android使用自定义字体遇到的坑

最近项目中涉及到一些其他平面的汉字或者别的文字的展示,具体的细节就不提了,那么怎么使用这些TTF字体文件呢,就需要借助于TypeFace这个类来实现。

使用字体文件

我们可以有两种方式使用字体文件:
①一般字体文件都放在项目Assets目录下,使用的时候:

Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/xxxx.ttf");
textView.setTypeface(typeface);

②如果我们全部把字体文件放在Assets目录下,就会使打包的APK文件比较大,那么就需要我们去服务端下载需要的字体文件到手机的SD卡中:

Typeface typeface = Typeface.createFromFile(Environment.getExternalStorageDirectory() + "/xxxx.ttf");
textView.setTypeface(typeface);

需要注意的问题:
在使用的时候可能会报错:java.lang.RuntimeException: native typeface cannot be made,一般有两种情况:
①字体路径错误:需要我们仔细检查路径,字体名字的拼写等;
②字体文件过大:这个对于Assets目录下的还好,在SD卡中如果字体文件过大,就会报这个异常。
如果想要了解Android底层是如果加载字体文件的,可以参考这篇文章:
Android 字体加载

还有就是如果有多处使用这个字体文件,如果在每次调用的时候都这样写,会造成每次执行的时候都会重新加载一次该字体,导致内存不断变大,造成内存泄漏。
解决方案:将加载的字体文件Typeface定义为一个常量,需要的时候拿来用就行了!

另外,这里也顺便提一下的就是,如果我们的项目已经开发完了,这时在下一个版本需要替换为另外的自定义的字体,这时该怎么做:下面这两篇文章可以提供一些参考:
Android -全自动将APP的字体替换系统包含的任意字体
Android 探究 LayoutInflater setFactory

加载不同的字体呈现一行字

上面说的都是使用一个字体文件,使得文字的字体都相同,那么回到文章开头说的,如果这一行字符串是不同平面,或者每一个字都需要不用的字体文件来呈现该如何解决呢?
这里先大致说下思路吧,后边再详细说如何实现!
首先得到每一个单字的字长,然后遍历整个字符串,将单字append到一个SpannableStringBuilder对象中,然后调用它的setSpan(Object what, int start, int end, int flags)方法,第一个参数需要我们需要借TypefaceSpan这个类来加载字体文件,第二,三个参数对应使用这个字体的开始索引和结束索引,这时就需要到最开始得到的单字字长了,最后调用TextView#setText()方法,传入该SpannableStringBuilder对象即可!

好了,先这样吧,后边再说具体的实现!

你可能感兴趣的:(Android学习笔记)