Paint.measureText: 部分之和是否等于整体?

Paint.measureText: Is the sum of the parts equal to the whole?

如果我有这样的字符串

String myString = "This is some text.";

测量整个字符串的长度是否与测量每个字符的总和相同?

起初以为,我假设答案是肯定的,但后来我在阅读this answer,其中说measureText之前添加了一个AdvanceX值并且 每次测量后。如果这是真的,那么它会在测量总长度时增加一个细微的错误(因为每个字符之间会有双填充)。

我也知道 kerning 有一些字体会根据周围的文本改变字母的排列方式。这让我越来越认为,部分之和与整体不同。

图片来自Wikipedia.

这很重要,因为我正在制作自己的需要处理换行的自定义文本视图。如果单个单词对于一行来说太长,那么我会测量每个字符,直到我发现需要中断的地方。但是,我假设对单个字符宽度的度量求和与对整个字符串的度量相同。

我已经设置了这个问题,以便我在完成测试后可以在下面回答。

整体并不总是等于部分之和。

这似乎是字距调整的结果,与您提到的任何 AdvanceX 双填充无关。

测试代码

这里是测试代码:

String myString = "This is some text.";

Paint myPaint = new Paint();
myPaint.setAntiAlias(true);
myPaint.setTextSize(100);

float theWhole = myPaint.measureText(myString);

float sumOfTheParts = 0;
for (int i = 0; i < myString.length(); i++) {
    sumOfTheParts += myPaint.measureText(myString, i, i + 1);
}

结果

在我的第一次测试中,措施是相同的:

String myString = "This is some text.";

theWhole        // 787.0
sumOfTheParts   // 787.0

但是,当有需要字距调整的字母时,措施是不同的。这是使用不同字符串再次进行的测试:

String myString = "AV Wa";

theWhole        // 291.0
sumOfTheParts   // 297.0

影响

您不能假设测量字符串的所有字符然后将总数相加就可以得出字符串的实际长度。因此,在进行文本换行时,您需要测量整个字符串范围。