制作一个字体助手类

4

我的应用中有大约10-15个ActivityFragment。我使用了大约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"); 

并非所有的类都使用五种字体。有些类使用一种,有些使用四种,有些使用三种,而其他一些可能使用不同的三种组合。

在每个类中声明这段代码似乎是多余的。是否可以将这五种字体全部声明一次,例如在应用程序启动时声明,并使用一个帮助类静态地使用它们?

我不确定是否必须在扩展Application的类中执行此操作,或者只需在可以静态调用的常规类中执行即可?这将在哪里初始化?


常规类。只需为每个字体公开一个静态getter或一个单独的静态getter和公共静态常量,以便您可以说TypefaceHelper.getTypeface(TypefaceHelper.ROBOTO_THIN)。 - Rich
2个回答

8

我不确定是否需要在扩展Application的类中完成这个任务,或者只是一个普通的类,我可以静态调用吗?

两种方式都可以。有一些示例实现可以使用,它们都“缓存”最近创建的几个字体。如果我没记错的话,在更近的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和要加载的字体名称即可。


快速提问,当在每个上下文中检查资产时,应用程序在传递其他上下文(活动)时必须重新创建字体。访问ApplicationContext以便在整个应用程序中共享所有字体是否更好? - Chris
1
@Chris:你为什么认为字体必须在不同的上下文中重新创建?就我个人而言,我一直使用“应用程序”(上下文)方法,但据我所知,资产不会因上下文而异。也就是说,每个上下文实例返回相同的AssetManager。 - MH.
@MH,你知道安卓从什么时候开始缓存自己的字体吗?我记得在源代码中看到过这个,但是不记得具体在哪里了。 - natario
@mvai: 此次提交Typeface 类中引入了一个基本的缓存机制,并在 Android 4.1.1 中发布,尽管它似乎只用于 create(...) 方法,而不包括 createFromAsset(...)createFromFile(...)(虽然我可能忽略了它)。 - MH.

0

如果你是幸运的少数人之一,使用minApi 24,那么你什么都不用做,因为createFromAsset()已经在API 24中实现了Typeface缓存。如果不是,请参考@MH的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接