2

TypefaceSpan + RelativeSizeSpan など、さまざまなタイプのスパンを組み合わせたカスタム スパンを作成するにはどうすればよいでしょうか。テキストのフォントとサイズを変更する「Footnote」や「​​Header2」などの論理スパンを作成したいと考えています。

4

1 に答える 1

4

同じ部分に 2 つの異なるスパンを適用できます。

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);

2番目のケースにFooterSpanを採用するのは簡単だと思います。

于 2013-12-27T21:10:10.773 に答える