Как использовать указанный интервал абзаца со StaticLayout в Android

У меня длинный текст, в котором есть несколько абзацев. Но я хочу использовать указанный (в конечном счете, больше, чем значение межстрочного интервала) интервал между двумя абзацами в тексте. Здесь я использую StaticLayout и рисую на холсте. Поскольку параметров для этого нет, я попытался сделать это маленькими хакерскими способами, как показано ниже.

Способ 1: Расширение StaticLayout и переопределить некоторые методы. Что было невозможно, так как закрытые и специфичные для пакета методы не могут быть переопределены. как ниже

/* package */ void generate(Builder b, boolean includepad, boolean trackpad){ ... }

private int out(CharSequence text, int start, int end,
                  int above, int below, int top, int bottom, int v,
                  float spacingmult, float spacingadd,
                  LineHeightSpan[] chooseHt, int[] chooseHtv,
                  Paint.FontMetricsInt fm, int flags,
                  boolean needMultiply, byte[] chdirs, int dir,
                  boolean easy, int bufEnd, boolean includePad,
                  boolean trackPad, char[] chs,
                  float[] widths, int widthStart, TextUtils.TruncateAt ellipsize,
                  float ellipsisWidth, float textWidth,
                  TextPaint paint, boolean moreChars) { 
...
 if (needMultiply && !lastLine) {
         double ex = (below - above) * (spacingmult - 1) + spacingadd;
         if (ex >= 0) {
             extra = (int)(ex + EXTRA_ROUNDING);
         } else {
             extra = -(int)(-ex + EXTRA_ROUNDING);
         }
     } else {
         extra = 0;
     }

     lines[off + START] = start;
     lines[off + TOP] = v;
     lines[off + DESCENT] = below + extra;
 ... 
}

В результате было невозможно ввести атрибут межстрочного абзаца в логику кода путем переопределения вышеуказанных методов.

Способ 2: скопировав код StaticLayout в мой CustomStaticLayout и непосредственно расширив класс Layout и введя атрибут межстрочного абзаца, в этом случае у меня нет доступа к большому количеству кода, который доступен только внутри пакета android.text или некоторого внутреннего пакета.

PS: этот подход плох, поскольку код реплицируется, и принцип Open/Close [Open to extension и близок к модификации / репликации] не поддерживается, но этот отчаянная попытка каким-то образом достичь цели.

public class CustomStaticLayout extends Layout { ... }

Здесь я не могу использовать константу и класс, такие как значение выравнивания "ALIGN_LEFT" и "ALIGN_RIGHT", поэтому не могу напрямую использовать код StaticLayout. И немногие как ниже.

 public enum Alignment {
    ALIGN_NORMAL,
    ALIGN_OPPOSITE,
    ALIGN_CENTER,
    /** @hide */
    ALIGN_LEFT,
    /** @hide */
    ALIGN_RIGHT,
}

Кроме того, в StaticLayout, как показано ниже, используется несколько собственных методов, к которым также невозможно получить доступ из моего CustomStaticLayout.

private static native long nNewBuilder();
private static native void nFreeBuilder(long nativePtr);
private static native void nFinishBuilder(long nativePtr);

PS: Скажите, пожалуйста, возможно ли использовать эти нативные методы из класса CustomStaticLayout?

Способ 3: Как использовать HTML.fromhtml для достижения той же цели, что и указанный интервал между абзацами, если это вообще возможно.

PS: у меня очень ограниченные знания html, поэтому я действительно не знаю, как использовать html для определения расстояния между абзацами. Это может быть немного поверхностный вопрос, извините меня, если он вас раздражает, но любезно ответьте, если это возможно.

Html.fromHtml("<h2>Title</h2><br><p>Description here</p>")

0 ответов

Другие вопросы по тегам