检查Android中Typeface对象的家族

4

在Android API 8中,有没有可能检查一个Typeface对象所使用的字体族?

我正在通过以下方式在Paint对象上创建Typeface:

//Simplified code, the user actually selects the family and style from a list
Paint paint = new Paint();
paint.setTypeface(Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD));

我希望之后能够像这样检查家庭信息。
Typeface tf= paint.getTypeface();

if (tf.equals(Typeface.DEFAULT) || tf.equals(Typeface.DEFAULT_BOLD)) {
    //do something
} else if (...) {
    //do something else
} 

这不起作用,因为它们不是同一个对象,我也尝试过tf == value,但结果相同。Typeface对象似乎没有暴露任何有用的内容来帮助进行字体系列检测,是否有解决方法?我只需要检测基本的Android字体(SERIF,SANS-SERIF,DEFAULT,MONOSPACE等)。

3个回答

5
不容易。这个家族的关键是一个native_instance int,它是包私有的,并且没有直接公开,正如您在源代码中所看到的那样。
有各种可怕的方法来获取这些信息,这些方法可能在所有设备和Android的所有过去/现在/未来版本上都可以或不可以工作。
也许你可以创建自己的Typeface包装对象来跟踪这些信息。

1

如果您查看源代码,您会发现默认的样式是使用DEFAULT创建的(*), 因此:

Typeface paintTf = paint.getTypeface();
Typeface.SERIF.equals(Typeface.create(paintTf, Typeface.DEFAULT));

可能可以胜任这项工作(在这里我检查它的字体家族是否为有衬线字体)。

NB:(*) 不适用于 DEFAULT_BOLD。


0

我建议你使用资源中的字体,这样你就可以通过equals()方法轻松比较字体。

例如:

Typeface toCompare = ResourcesCompat.getFont(context, R.font.my_font);
assert tf.equals(toCompare)

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