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 需要放弃该方法。
  • 应用风格的考虑:如果你的应用既面向高版本运行环境,并且你的应用中统一使用指定的字体,可以考虑使用该方法;若是单单为了应用中的某几个字的显示效果就使用字库,则会得不偿失。
时间: 2024-10-17 09:28:19

Android 编程下字库的使用的相关文章

Android 编程下 App Install Location

从 API 8 开始(参考官方文档:App Install Location | Android Developers),你可以将你的应用安装在外部储存中(例如,安装到设备的 SD 卡上).这是一个可选的特征,你可以在你的应用的 AndroidManifest.xml 中声明 android:installLocation 属性.如果你没有声明这个属性,你的应用程序将会被安装在内部储存,并且不能被移到外置储存中. 修改 AndroidManifest.xml 文件中 <manifest> 元素

Android 编程下 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 报错

使用了极光推送的 jar 包项目在从 SVN 中检出后,假设不又一次对 jar 包和 Bulid Path 进行配置就会抛出 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 的错误,进行例如以下操作就可以消除这样的错误: 删除 libs 目录下的 jpush-sdk-release1.3.8.jar(极光推送的 jar 包),又一次在 libs 目录中增加  jpush-sdk-release1.3.8.ja

Android 编程下如何调整 SwipeRefreshLayout 的下拉刷新距离

SwipeRefreshLayout 的下拉刷新距离比较短,并且也没有提供设置下拉距离的 API,但是看 SwipeRefreshLayout 的源码,会发现有一个内部变量 mDistanceToTriggerSync,这个变量决定了触发刷新的下拉距离.下面的代码展示了源码中是如何给这个变量赋值的: final DisplayMetrics metrics = getResources().getDisplayMetrics(); mDistanceToTriggerSync = (int) M

Android 编程下 Using ViewPager for Screen Slides

(参考官方文档:Using ViewPager for Screen Slides | Android Developers) Android 编程下 Using ViewPager for Screen Slides,布布扣,bubuko.com

Android 编程下去除 ListView 上下边界蓝色或黄色阴影

默认的情况下,在 ListView 滑动到顶部或者是底部的时候,会有黄色或者蓝色的阴影出现.在不同的版本上解决的方法是不同的,在 2.3 版本之前可以在 ListView 的属性中通过设置 android:fadingEdge="none" 来解决问题,但是在 2.3 及以上版本这中方法是无效的,这里,可以通过重写 ListView 用代码来设置模式,禁止其阴影的出现,以免影响美观.代码如下: package com.sunzn.cview; import android.conten

Android 编程下 Touch 事件的分发和消费机制

Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev).onTouchEvent(MotionEvent ev):能够响应这些方法的控件包括:ViewGroup 及其子类.Activity.方法与控件的对应关系如下表所示: Touch 事件相关方法   方法功能     ViewGroup         Activity        public b

Android 编程下的代码混淆

什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码.为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆. 混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功

详谈Android 编程下的代码混淆,点开就看....

源码混淆什么 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码.为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆. 混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也

Android 编程下实现 Activity 的透明效果

实现方式一(使用系统透明样式) 通过配置 Activity 的样式来实现,在 AndroidManifest.xml 找到要实现透明效果的 Activity,在 Activity 的配置中添加如下的代码设置该 Activity 为透明样式,但这种实现方式只能实现纯透明的样式,无法调整透明度,所以这种实现方式有一定的局限性,但这种方式实现简单. android:theme="@android:style/Theme.Translucent" <activity android:na