Как использовать указанный интервал абзаца со 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>")