【问题标题】:Android custom combined spans for spannable strings用于可跨字符串的 Android 自定义组合跨度
【发布时间】:2014-01-15 10:58:50
【问题描述】:

如何创建将不同类型的跨度组合在一起的自定义跨度,例如字体跨度 + 相对大小跨度。我想创建像“脚注”或“Header2”这样会改变文本字体和大小的逻辑跨度。

【问题讨论】:

    标签: android spannablestring spannable


    【解决方案1】:

    您可以将两个不同的跨度应用于相同的部分。

    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 是微不足道的。

    【讨论】:

    • 我知道这是可能的。但我正在寻找一种方法来创建将这些跨度组合在一起的聚合跨度 - 以便可以将实际样式(例如 TypefaceSpan 或 RelativeSizeSpan)封装在逻辑跨度(例如 FooterSpan)中。
    • 在答案中提供了解决方案。
    • 谢谢蒂姆。我不知道通用基类MetricAffectingSpan。这正是我想要的。谢谢!
    • 我无法将 ReplacementSpanTypefaceSpan 聚合在一起。它们都共享MetricAffectingSpan,但ReplacementSpan 覆盖了上面的方法并将它们留空,因此仅应用字体。
    猜你喜欢
    • 2014-09-19
    • 2018-06-25
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多