LineSpace如何影响一行文本中的StaticLayout高度

时间:2017-01-18 12:50:31

标签: android staticlayout

考虑这个简单的例子:

我有一行文字:“你好”

我想使用StaticLayout测量此文本。所以我写了这样的话:

StaticLayout layout = new StaticLayout("Hello", myTextView.getPaint(), myTextView.getWidth(), Layout.Alignment.NORMAL, 1, lineSpace, false);

在上面的代码中,我在for循环中更改了lineSpace变量,每次都记录布局的高度:

for(int lineSpace=0; lineSpace<20;lineSpace++){
    StaticLayout layout = new StaticLayout("Hello", myTextView.getPaint(), myTextView.getWidth(), Layout.Alignment.NORMAL, 1, lineSpace, false);

    Log.d("TAG", "layout height: " + layout.getHeight());
}

当我在具有android M布局的设备上运行此代码时,不会使用多个lineSpace值更改高度。但在较低的Android版本中,布局的高度分别随行空间而变化。

虽然当您的文本不止一行时,StaticLayout会考虑两行之间的行间距。但似乎Android M不考虑最后一行的行间距,但Android版本较低。

我的问题是:在什么版本的android StaticLayout考虑最后一行的行间距?我可以写这样的东西:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    // in this version StaticLayout don't consider line space for last line
} else {
    // in this version StaticLayout consider line space for last line
}

1 个答案:

答案 0 :(得分:3)

我在源代码中做了一些快速挖掘,似乎是this part是罪魁祸首:

    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;
    }

旧版本缺少!lastLine条件,因此也会将间距添加到最后一行。

条件已添加到this commit中,如果我的github foo没有让我失败,则应该从Android 5开始加入。

显然,就像提交提及一样,这只影响单行文本,对于多行文本,高度似乎正确计算。因此,一个简单的修复方法可能是检查文本是否只有一行(使用getLineCount())以及Android版本是否小于5,如果是这样,则将行间距减去一次。