在Android上使用或不使用自定义字体

在Android上使用或不使用自定义字体,android,fonts,Android,Fonts,我想知道,除了有一种不同的字体外,还有什么好处(除了使用一种定制字体的产品的商标外)和使用它 但更重要的是,真正的缺点是什么?我在回答中读到,至少OTF存在问题,根据PPI,其中一些问题在特定设备中表现得更为明显 那么,对于那些有使用权的人和那些认为不应该使用的人,你的观点和论点是什么 谢谢Android 2.1中有一个已知的bug,WebView不显示自定义字体(通过CSS@font-face指定) 此外,字体很大,APK的增长也很大。低带宽和按带宽付费的用户会讨厌你。你提供了一种定制字体,使

我想知道,除了有一种不同的字体外,还有什么好处(除了使用一种定制字体的产品的商标外)和使用它

但更重要的是,真正的缺点是什么?我在回答中读到,至少OTF存在问题,根据PPI,其中一些问题在特定设备中表现得更为明显

那么,对于那些有使用权的人和那些认为不应该使用的人,你的观点和论点是什么


谢谢

Android 2.1中有一个已知的bug,
WebView
不显示自定义字体(通过CSS@font-face指定)


此外,字体很大,APK的增长也很大。低带宽和按带宽付费的用户会讨厌你。

你提供了一种定制字体,使你的应用程序看起来漂亮、与众不同、符合某些品牌标识等。此外,打包你自己的字体可以让你获得终极控制权。制造商可以自由更改自己皮肤的标准主题(包括字体),例如HTC Sense、三星TouchWiz等

唯一的缺点是,您必须在apk中包含自定义字体(这会增加下载大小),并且在使用自定义字体的每个活动中都需要样板代码(即,您不能简单地通过xml将自定义字体分配给textview/edittext等)


旧版本的Android(即除了现有答案中提到的缺点外,还应考虑:

  • 您需要一种合法允许分发的字体
  • 您需要一种字体,该字体具有所有您想要支持的语言的所有正确标志符号(并非所有字体都具有)
  • 根据我的经验,Android无法处理每种字体,对于它不支持的字体,它会悄悄地退回到Droid SAN,因此您需要测试您的字体,以确保它实际工作

除了Commonware所说的(这是我第一次接受的答案),我还发现了一个主要的错误,在使用自定义字体时会造成内存泄漏:

正因为如此,我倾向于认为使用它们不是一个好主意……或者至少在使用它们时要小心

如果您确实需要使用它们,您可以使用它来避免大部分内存泄漏:

public class Typefaces {
    private static final String TAG = "Typefaces";

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

    public static Typeface get(Context c, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface t = Typeface.createFromAsset(c.getAssets(),
                            assetPath);
                    cache.put(assetPath, t);
                } catch (Exception e) {
                    Log.e(TAG, "Could not get typeface '" + assetPath
                            + "' because " + e.getMessage());
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }
}
公共类字体{
私有静态最终字符串TAG=“Typefaces”;
私有静态最终哈希表缓存=新哈希表();
公共静态字体get(上下文c,字符串assetPath){
已同步(缓存){
如果(!cache.containsKey(assetPath)){
试一试{
Typeface t=Typeface.createFromAsset(c.getAssets(),
资产路径);
cache.put(assetPath,t);
}捕获(例外e){
Log.e(标记“无法获取字体””+assetPath
+“'因为”+e.getMessage());
返回null;
}
}
返回cache.get(assetPath);
}
}
}