文档章节

Android应用字体替换

猴亮屏
 猴亮屏
发布于 2017/04/27 18:08
字数 966
阅读 65
收藏 0

很多应用程序都有替换字体的需求,主要是设计可能要显示一个独特的字体,比如有多少人,花费了多少钱,这种用不同的字体显示会有强提醒的作用,增强应用程序的体验。

替换字体又一般分为部分替换,比如只正对一行显示中的某一段或者某一个数字进行替换,

我们知道系统中我们可以对字体显示View设置Android:typeface属性,一般都有以下几种值可以选择:在手机上四中typeface替换,展示效果差距不大。

monospace 
sanf 
serif 
normal

那如何才能自己用自定义的字体库来进行替换呐?

局部替换

一般都采用以下方法:针对要显示的TextView设置不同的Typeface,我们可以将一个ttf字库构造成一个Typeface,将构造的Typeface设置到要显示的TextView。这种比较方便的是字体库比较小,如果明确知道要显示的字库是什么,我们就可以只针对该字库来进行ttf生成。可以在一些开源的平台进行ttf的生成。ttf生成链接 样例代码如下

private static Typeface typeface;

TextView tv = new TextView(this);
tv.setTypeface(getTypeface(context));

public static Typeface getTypeface(Context context){
   if (typeface == null) {
   typeface = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto_Light.ttf");
        }
    return typeface;
    }

只要对TextView设置setTypeface就可以了。

上面说到了局部的替换,如果全局需要替换又要怎么办。全局替换一般会采用以下几种方法,

全局替换

1: 遍历所有的view,在页面加载的时候进行全局设置Typeface,比如我们只针对TextView进行设置:

public void setTypeface(ViewGroup root, Typeface typeface){
    if(root==null || typeface==null){
        return;
    }
    int count = root.getChildCount();
    for(int i=0;i<count;++i){
        View view = root.getChildAt(i);
        if(View instanceof TextView){
            ((TextView)view).setTypeface(typeface);
        }else if(View instanceof ViewGroup){
            setTypeface((ViewGroup)view, typeface);
        }
    }
}

2:想当然认为只要替换掉系统默认的Typeface是否就可以生效那,我们采用反射替换掉系统默认的Typeface。替换时机为Application加载的时候,可以在Application的onCreate中进行替换。

public final class AppTypeface {

    private enum DefaultFont {
        DEFAULT("DEFAULT"),
        DEFAULT_BOLD("DEFAULT_BOLD"),
        MONOSPACE("MONOSPACE"),
        SERIF("SERIF"),
        SANS_SERIF("SANS_SERIF");

        private String value;

        DefaultFont(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }

    public static boolean replace = false;

    public static final String REPLACE_FONT = "fonts/Roboto_Light.ttf";

    /**
     * @param context
     */
    public static final void init(Context context) {
        if (replace) {
            final Typeface replace = Typeface.createFromAsset(context.getAssets(), REPLACE_FONT);
            for (DefaultFont defaultFont : DefaultFont.values()) {
                replaceFont(defaultFont.getValue(), replace);
            }
        }
    }

    public static final void replaceFont(String fontName, Typeface typeface) {
        try {
            final Field staticField = Typeface.class.getDeclaredField(fontName);
            staticField.setAccessible(true);
            staticField.set(null, typeface);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

}

但是最终验证效果为,只单单是代码层面的替换,是没有效果的,在网上搜寻方案是发现代码替换与theme主题结合是能够生效的。theme设置如下:

    <style name="LightBaseTheme" parent="Theme.AppCompat.Light">
        <item name="android:typeface">monospace</item>
    </style>

但是全局替换会面临如下的问题: 
1:字体库的生成,如果是英文应用,ASCII表就基本就包括了所有需要替换的字符,但是中文应用,大家都知道的是,中文字符一共有10万多个,就算最常用的也有好几千,我在阿里妈妈webfont上试着生成一个包含常用字体的ttf,发现该平台最多支持7500多个字,再多就不能生成,这样会导致应用恰好包含了未替换的字体,展示效果很差。 
2:如果不考虑ttf字体库的大小,搜索下来发现一般一个ttf就有10M,这样的大小对应用来说安装包增长太大,可以预见的是,包越大用户安装的意愿就越小。 
3:上面的方法虽然在我手头的机器都是有效果的,但是不保证所有的机器都有效果。可能会出现加载错误或者渲染错误。

本文转载自:http://blog.csdn.net/xueshanhaizi/article/details/50838066

共有 人打赏支持
猴亮屏

猴亮屏

粉丝 35
博文 517
码字总数 56802
作品 4
北京
Android工程师
替换整个APP字体--修改全局字体样式

原文地址 首先将项目需要的字体资源放置在app下: 注意,字体ttf文件只能用英文字母,中文会报找不到文件异常。 未设置之前的布局样式: 字体文件准备好后,我们就可以按需设置自己想要的字体...

王先森oO
09/14
0
0
1.Android系统源代码目录与系统目录

1.Android源代码的目录中包含了Android系统所有的源代码,从底层驱动到上层应用,Android系统对所有文件都进行了详细管理; 2.而在手机中,Android系统的目录与源代码的目录并不是一一对应的...

凌川江雪
07/28
0
0
apkplug主题皮肤切换之通用主题-04

该文章基于V1.6.9版本 apkplug主题切换有两个层次的切换,这篇文章只讲解通用主题切换层次 一 何为通用主题切换 apkplug通用主题切换可以简单的理解为一套可动态替换的系统主题(由主题包提供...

梁大帅
2014/05/26
0
0
SpannableString与SpannableStringBuilder

一、概述 1、SpannableString、SpannableStringBuilder与String的关系 首先SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但它们俩的特殊就在于有一个...

菜南瓜
2015/05/18
0
0
Android Studio简单设置

Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面。 Settings --> Appearance --> Theme ,选择 Darcula 主题即可。 字体设置 系统字体设置...

Erichkko
2015/11/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
1分钟前
0
0
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
7分钟前
2
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
36分钟前
1
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
42分钟前
1
0
大数据学习脑图以及入门教程!

近些年,大数据的火热可谓是技术人都知道啊,很多人呢,也想学习大数据相关,所以,这里分享几个大数据脑图,希望可以让你清楚明白从哪里入门大数据,知道该学习以及掌握哪些知识点; 大数据...

董黎明
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部