我从这篇文章中引用了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);
}发布于 2013-12-31 16:35:26
将其添加到画图中,每次更新时都会应用一个新的油漆,它应该指定textSize。想象一下字体更像是一种字体/字符集。Android文档指出:
字体类指定字体的字体和内部样式。这是在油漆中使用的,还有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
}发布于 2013-12-31 17:30:13
如果您不想自己进行文本呈现,并且只想集中精力使用该实用工具,那么文本呈现器就可以识别三种跨类型的文本。
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,您只需在跨度的其余部分更改它。所以你可以做一些事情,比如斜体,粗体,加文本阴影等等。这很酷。结合活动中的一些方法,您可以根据您的设计有多复杂来为应用程序定义一些标记扩展。但是,很多时候,您可以只使用它进行内联更改,例如:
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,因为它几乎是蛮力的,而且对于定义自定义模板或非常奇怪的一次性事件来说也是如此。
https://stackoverflow.com/questions/20859695
复制相似问题