我正在使用twaddington的建议:
How to Set a Custom Font in the ActionBar Title?
它正常工作,但我需要更改字体大小。我该怎么做呢?我尝试从
修改参数int maxSizeprivate static LruCache<String, Typeface> sTypefaceCache =
new LruCache<String, Typeface>(12);
是从TypefaceSpan类还是在onCreate方法中完成的?
TypefaceSpan
public class TypefaceSpan extends MetricAffectingSpan {
/** An <code>LruCache</code> for previously loaded typefaces. */
private static LruCache<String, Typeface> sTypefaceCache =
new LruCache<String, Typeface>(12);
private Typeface mTypeface;
/**
* Load the {@link Typeface} and apply to a {@link Spannable}.
*/
public TypefaceSpan(Context context, String typefaceName) {
mTypeface = sTypefaceCache.get(typefaceName);
if (mTypeface == null) {
mTypeface = Typeface.createFromAsset(context.getApplicationContext()
.getAssets(), String.format("fonts/%s", typefaceName));
// Cache the loaded Typeface
sTypefaceCache.put(typefaceName, mTypeface);
}
}
@Override
public void updateMeasureState(TextPaint p) {
p.setTypeface(mTypeface);
// Note: This flag is required for proper typeface rendering
p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
}
@Override
public void updateDrawState(TextPaint tp) {
tp.setTypeface(mTypeface);
// Note: This flag is required for proper typeface rendering
tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
}
}
MainActivity onCreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SpannableString s = new SpannableString("TEST TITLE");
s.setSpan(new TypefaceSpan(this, "MotorwerkOblique.ttf"), 0, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ActionBar actionBar = getActionBar();
actionBar.setTitle(s);
}
答案 0 :(得分:3)
您可以在paint中添加它,每次更新时都应用一个新的Paint,它应该指定textSize。想象一下字体更多的字体/字符集。 Android文档声明:
Typeface类指定a的字体和内在样式 字体。这在油漆中使用,以及可选的油漆设置 像textSize,textSkewX,textScaleX一样指定文本出现的方式 绘制(和测量)。
读完这篇文章后,我建议你做以下几点。 (不确定这是否符合你的要求。但请告诉我)
@Override
public void updateMeasureState(TextPaint p) {
p.setTypeface(mTypeface);
// Note: This flag is required for proper typeface rendering
p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
p.setTextSize(25);//or what ever size you want
}
@Override
public void updateDrawState(TextPaint tp) {
tp.setTypeface(mTypeface);
// Note: This flag is required for proper typeface rendering
tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
tp.setTextSize(25);//or what ever size you want
}
答案 1 :(得分:1)
如果您不想自己进行文本渲染,只想专注于使用该实用程序,则文本渲染器可识别三种Span类型,以实现此目的。
RelativeSizeSpan
此跨度将采用绝对值乘以文本范围的当前大小。这主要用于强调。因此,正值会增加因子的大小,负值会使大小减小一个因子。
TextAppearanceSpan
此范围允许您取消引用已命名的样式,以便您可以执行类似于此文本范围的使用R.style.TextAppearance.ExtraAwesomseText
。这种风格的地方有:
<style name="TextAppearance.ExtraAwesomeText">
<item name="android:textSize">18sp</item>
</style>
或强>
<style name="TextAppearance.ExtraAwesomeText">
<item name="android:textSize">18sp</item>
<item name="android:textColor">#005500</item>
<item name="android:textStyle">bold</item>
</style>
取决于你想要的具体程度。但是这个Span允许您更新文本范围,而不必知道当前文本范围的所有细节,因为它设置了绝对值。它也有点干净,因为您不必为了想要在整个应用程序中更新一种文本而烦恼。这种跨度将在样式更改后自动应用。
这个就像你想要更新外观范围一样。它只是为您提供了用于文本范围的TextPaint,您可以在其余的跨度中更改它。所以你可以做一些像斜体,粗体,添加文字阴影等的东西。这很酷。这与Activity中的一些方法相结合,实际上可以让您根据设计的复杂程度为应用定义一些标记扩展。但很多时候你可以将它用于内联更改,例如:
charSequence.setSpan(new RasterizerSpan() {
public void updateDrawState(TextPaint textPaint) {
// add a text shadow to the given range
textPaint.setShadowLayer(5, 5, 5 0x005500);
}
}, 0, charSequence.length() - 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
我通常坚持使用RasterizerSpan
,因为它非常蛮力,比如定义自定义模板或者只是奇怪的一次性。