制作TypeFace助手类

时间:2013-06-24 19:10:53

标签: android class typeface

我的应用中大约有10-15 ActivityFragment个。我有大约5种不同的TypeFaces(大多数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种字体都可以声明一次,也许当应用程序启动时,然后我使用帮助程序类静态使用它们?

我不确定我是否必须这样做 - 如果可能的话 - 在扩展应用程序的类中,或者只是我可以静态调用的常规类?这会在哪里初始化?

2 个答案:

答案 0 :(得分: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扩展名。它会懒惰地创建类型面:它首先尝试从本地缓存中检索类型面,并且只有在缓存中不可用时才实例化一个新面。只需提供Context和要加载的类型面的名称。

答案 1 :(得分:0)

如果您是使用minApi 24的少数幸运者之一,则您无需执行任何操作,因为createFromAsset()已启动API Typeface缓存。如果不是,请参阅@ MH。的答案。