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

时间:2017-02-16 04:24:04

标签: android string paint measure

如果我有这样的字符串

String myString = "This is some text.";

如果我测量整个字符串,我会得到相同的长度,就像我测量每个字符的总和一样吗?

首先想到的是,我认为答案是肯定的,但后来我正在阅读this answer,其中measureText之前添加AdvanceX值每次测量后。如果这是真的,那么它会在测量总和长度时添加一个微妙的错误(因为每个字符之间会有双重填充)。

我也知道kerning有些字体会根据周围的文字改变字母的拼接方式。这让我越来越想到各部分的总和将不同于整体。

kerning

图片来自Wikipedia

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

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

1 个答案:

答案 0 :(得分:1)

整体总是等于各部分的总和。

这似乎是字距调整的结果,与您提到的任何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

<强>启示

你不能假设测量一个字符串的所有字符然后总计总和将给你字符串的实际长度。因此,在进行文本换行时,您需要测量整个字符串范围。