2017-02-16 2 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 

ЧАС Однако, когда есть письма, которые нуждаются в кернинге, меры различны. Это тест снова с другой строкой:

String myString = "AV Wa"; 

theWhole  // 291.0 
sumOfTheParts // 297.0 

Последствие

Вы не можете предположить, что измерения всех символов строки, а затем суммирование всего даст вам фактическую длину строки. Таким образом, при выполнении переноса текста вам нужно будет измерить целые диапазоны строк.

Смежные вопросы