如何使用自定义TypefaceSpan类更改fontsize

时间:2013-12-31 15:46:50

标签: java android xml eclipse

我正在使用twaddington的建议:

How to Set a Custom Font in the ActionBar Title?

它正常工作,但我需要更改字体大小。我该怎么做呢?我尝试从

修改参数int maxSize
private 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);
}

2 个答案:

答案 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允许您更新文本范围,而不必知道当前文本范围的所有细节,因为它设置了绝对值。它也有点干净,因为您不必为了想要在整个应用程序中更新一种文本而烦恼。这种跨度将在样式更改后自动应用。

RasterizerSpan

这个就像你想要更新外观范围一样。它只是为您提供了用于文本范围的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,因为它非常蛮力,比如定义自定义模板或者只是奇怪的一次性。