我如何创建将不同类型的跨度组合在一起的自定义跨度,例如 TypefaceSpan + RelativeSizeSpan。我想创建像“脚注”或“Header2”这样会改变文本字体和大小的逻辑跨度。
问问题
2632 次
1 回答
4
您可以将两个不同的跨度应用于相同的部分。
SpannableStringBuilder builder = new SpannableStringBuilder("Hello there");
builder.setSpan(new TypefaceSpan("arial"), 1, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new RelativeSizeSpan(1.5f), 1, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
编辑: 您说您正在寻找一种方法来创建将这些跨度组合在一起的聚合跨度 - 以便可以将实际样式(例如 TypefaceSpan 或 RelativeSizeSpan)封装在逻辑跨度(例如 FooterSpan)中
由于 TypeFaceSpan 和 RelativeSizeSpan 都是 MetricEffectingSpan 的子级,因此以下可能是一个解决方案:
class FooterSpan extends MetricAffectingSpan {
MetricAffectingSpan[] spans;
public FooterSpan(MetricAffectingSpan... spans) {
this.spans = spans;
}
@Override
public void updateMeasureState(TextPaint p) {
for(MetricAffectingSpan span : spans) {
span.updateMeasureState(p);
}
}
@Override
public void updateDrawState(TextPaint tp) {
for(MetricAffectingSpan span : spans) {
span.updateDrawState(tp);
}
}
}
示例用法:
builder.setSpan(new FooterSpan(new TypefaceSpan("arial"), new RelativeSizeSpan(1.5f)), 1, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
您甚至可以以更专业的方式编写 FooterSpan,以便您可以像这样使用它:
builder.setSpan(new FooterSpan("arial", 1.5f), 1, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
我认为在第二种情况下采用 FooterSpan 是微不足道的。
于 2013-12-27T21:10:10.773 回答