1

にカスタムの箇条書き項目を描画するようBulletSpanに拡張して、カスタムを作成します。のドキュメントには、ネストできると書かれています(つまり、マルチレベルの箇条書き):LeadingMarginSpanTextViewLeadingMarginSpan

1 つの段落に複数の先頭マージン スパンが存在する場合があります。それらは順番にレンダリングされ、それぞれがその前のものにマージンを追加します。

LeadingMarginSpanクラスには次のメソッドがあります。

public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,
                              int top, int baseline, int bottom,
                              CharSequence text, int start, int end,
                              boolean first, Layout l);

メソッドの実装でインデント自体を計算する必要があるのか​​、それともインデントされているのかわかりません。デバイスによって動作が異なります。たとえば、API レベル 21xでは、常に 0 で呼び出され、 API レベル 23では、レベルごとに異なる値で呼び出されxます。

では、このメソッドを実装する正しい方法は何ですか?

現在の実装はオリジナルとよく似ていBulletSpanます:

    @Override
    public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,
                                  int top, int baseline, int bottom,
                                  CharSequence text, int start, int end,
                                  boolean first, Layout l) {
        if (((Spanned) text).getSpanStart(this) == start) {
            ...
            if (c.isHardwareAccelerated()) {
                ...
                c.translate(x + dir * mBulletRadius,
                        (top + bottom) / 2.0f);
                ...
            } else {
                c.drawCircle(x + dir * mBulletRadius,
                        (top + bottom) / 2.0f, mBulletRadius, p);
            }
            ...
        }
        ...
    }

API レベル 21での動作:

o  Level 1
o     Level 2
o        Level 3
o        Level 3
o     Level 2

API レベル 23での動作:

o  Level 1
   o  Level 2
      o  Level 3
      o  Level 3
   o  Level 2

前もって感謝します

4

0 に答える 0