2017-02-16 42 views
1

如果我有這樣的Paint.measureText:部分的總和是否等於整體?

String myString = "This is some text."; 

字符串我將獲得相同的長度,如果我測量整個字符串,當我需要測量每個字符的總和?

在第一個想到的,我認爲答案是肯定的,但後來我讀this answer,裏面說measureText增加了每次測量後之前AdvanceX值。如果這是真的,那麼它會在測量總計長度時添加一個細微的錯誤(因爲每個字符之間會有兩次填充)。

我也知道有kerning帶有一些字體,這些字體會根據周圍文本改變字母放在一起的方式。這使得我越來越多地認爲,這些部分的總和會不同於整體。

kerning

圖片來自於Wikipedia

這很重要,因爲我正在製作自己的自定義文本視圖,需要處理換行。如果一個單詞對於該行太長,那麼我測量每個字符直到我發現我需要打破的地方。但是,我認爲總結單個字符寬度的度量將與測量整個字符串相同。

我已經設置了這個問題,以便我在完成測試後可以回答下面的問題。

回答

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 

H無論如何,當有需要覈對的信件時,措施是不同的。這是一個不同的字符串再次測試:

String myString = "AV Wa"; 

theWhole  // 291.0 
sumOfTheParts // 297.0 

意義

你不能假設,衡量一個字符串的所有字符,然後相加總會給你字符串的實際長度。因此,在做文本換行時,您需要測量整個字符串範圍。