首页 > 解决方案 > 如何在 Android 中通过 StaticLayout 使用指定的段落间距

问题描述

我有一个长文本,其中有多个段落。但我想在文本中的两个段落之间使用指定的(最终超过行距值)段落间距。在这里,我使用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>")

标签: javaandroidlayoutstaticlayout

解决方案


推荐阅读