4

我的应用程序中有大约 10-15ActivityFragment's。我正在使用大约 5 种不同的字体(主要是Roboto变体)。

在几乎每一堂课中,我都必须这样做:

roboto_light = Typeface.createFromAsset(getActivity().getAssets(),
        "fonts/roboto_light.ttf");
roboto_thin = Typeface.createFromAsset(getActivity().getAssets(),
        "fonts/roboto_thin.ttf");
roboto_regular = Typeface.createFromAsset(getActivity().getAssets(),
        "fonts/roboto_regular.ttf"); 

并非所有班级都使用全部五个。有些使用 1,有些使用 4,有些使用 3,而其他人可能使用 3 的不同组合。

在每个类中声明此代码似乎是多余的。这 5 种字体可以全部声明一次吗,也许是在应用程序启动时,然后我使用 Helper 类来静态使用它们?

我不确定我是否必须在扩展应用程序的类中执行此操作(如果可能的话),或者只是我可以静态调用的常规类?这将在哪里初始化?

4

2 回答 2

8

我不确定我是否必须在扩展应用程序的类中执行此操作(如果可能的话),或者只是我可以静态调用的常规类?

无论哪种方式都可以。那里有几个示例实现,它们都“缓存”了最后几个创建的字体。如果我没记错的话,在最近的 Android 平台中,缓存也发生在幕后。无论如何,一个基本的实现应该是这样的:

public class Typefaces{

    private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String name){
        synchronized(cache){
            if(!cache.containsKey(name)){
                Typeface t = Typeface.createFromAsset(c.getAssets(), String.format("fonts/%s.ttf", name));
                cache.put(name, t);
            }
            return cache.get(name);
        }
    }    
}

来源:https ://code.google.com/p/android/issues/detail?id=9904#c3

这是使用辅助类,但您也可以将其作为您自己的Application扩展的一部分。它懒惰地创建字体:它首先尝试从本地缓存中检索字体,如果缓存中不可用,则仅实例化一个新字体。只需提供 aContext和要加载的类型面的名称。

于 2013-06-24T19:37:49.537 回答
0

如果您是使用 minApi 24 的少数幸运者之一,那么您根本不需要做任何事情,因为createFromAsset()已经Typeface实现了从 API 24 开始的缓存。如果没有,请参阅@MH.'s answer。

于 2017-08-16T10:35:56.247 回答