我有一个长文本,其中有多个段落。但是我想在文本中的两个段落之间使用指定的(最终大于行间距值)段落间距。在这里,我使用 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:这种方法很糟糕,因为代码被复制并且未维护“打开/关闭”主体[打开扩展并接近修改/复制],但是这种拼命地尝试以某种方式实现目标。
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>")