Android 编程下字库的使用

在安卓操作系统下对于 TextView 字体的支持很有限,默认情况下 TextView 的 typeface 属性支持 "Sans","serif","monospace" 这三种字体,假设在没有指定字体的情况下。系统缺省会使用 "Sans" 作为文本显示的字体。但这三种字体仅仅支持英文,也就是说仅仅要你显示的文字是中文,不管你选择这三种字体中的哪一种,显示效果都是一样的。为此,谷歌又提供了第二种字体的支持方式:字库。在 Android 2.2 版本号中,安卓对字库的支持是比較有限的,从 Android 2.3.3 版本号開始,安卓系统已经可以支持大部分的字库。这意味着你在 SDK 版本号为 Android 2.2 的平台下写的使用字库的代码仅仅有在 Android 2.3.3 系统及其更的高版本号中才干生效;假设你将代码执行在 Android 2.2 的系统上,你将不会看到自己所期望的效果,取而代之的是一片空白。

以下来看一下代码实现过程。在代码实现实现之前。我们先来看下不同字库的显示效果,下图中第一张图:SIMKAI.TTF 简体字-楷体-常规、第二张图:MSYH.TTF 简体字-微软雅黑-常规。

复制代码
 1 package cn.sunzn.fonts;
 2 
 3 import android.app.Activity;
 4 import android.graphics.Typeface;
 5 import android.os.Bundle;
 6 import android.view.Menu;
 7 import android.widget.TextView;
 8 
 9 public class MainActivity extends Activity {
10 
11     private TextView tv_title;
12     private TextView tv_author;
13     private TextView tv_line1;
14     private TextView tv_line2;
15     private TextView tv_line3;
16     private TextView tv_line4;
17 
18     public void onCreate(Bundle savedInstanceState) {
19         super.onCreate(savedInstanceState);
20         setContentView(R.layout.activity_main);
21         /**
22          * 在 assets 文件夹下创建 fonts 文件夹并放入要使用的字体文件(**.ttf)并提供相对路径给
23          * createFromAsset(AssetManager mgr, String path) 来创建 Typeface 对象。再通
24          * 过TextView.setTypeface(Typeface tf) 指定文本显示的字体。
25          */
26         Typeface face = Typeface.createFromAsset(getAssets(),"fonts/SIMFANG.TTF");
27 
28         tv_title = (TextView) findViewById(R.id.tv_title);
29         tv_title.setTypeface(face);
30 
31         tv_author = (TextView) findViewById(R.id.tv_author);
32         tv_author.setTypeface(face);
33 
34         tv_line1 = (TextView) findViewById(R.id.tv_line1);
35         tv_line1.setTypeface(face);
36 
37         tv_line2 = (TextView) findViewById(R.id.tv_line2);
38         tv_line2.setTypeface(face);
39         tv_line3 = (TextView) findViewById(R.id.tv_line3);
40         tv_line3.setTypeface(face);
41 
42         tv_line4 = (TextView) findViewById(R.id.tv_line4);
43         tv_line4.setTypeface(face);
44     }
45 
46     public boolean onCreateOptionsMenu(Menu menu) {
47         getMenuInflater().inflate(R.menu.activity_main, menu);
48         return true;
49     }
50 
51 }
复制代码

最后,还须要补充说明一下:尽管採用这样的方式能够实现自己想要的显示效果。可是在採用这样的方法之前开发者还是须要考虑下性能消耗和执行环境以及自己 APP 的风格,然后再做出相应的选择。原因有下面几点:

  • 字库文件的大小:由于字库的尺寸少则几兆,多则几十兆。文件打包的时候对 *.ttf 格式的文件压缩率非常低,所以会无形中增大 APP 的体积。
  • 执行环境的考虑:假设你的应用面向的是高版本号的执行环境,能够考虑使用这样的方法,假设用户的执行环境是 Android 2.2 须要放弃该方法。
  • 应用风格的考虑:假设你的应用既面向高版本号执行环境。而且你的应用中统一使用指定的字体,能够考虑使用该方法;若是单单为了应用中的某几个字的显示效果就使用字库,则会得不偿失。
原文地址:https://www.cnblogs.com/liguangsunls/p/6732963.html