2017-02-16 1 views
1

은 내가 각 문자를 측정의 합을 때이 같은 전체 문자열을 측정 할 경우이Paint.measureText : 파트의 합계가 전체와 동일합니까?

String myString = "This is some text."; 

같은 문자열 내가 같은 길이를 얻을 것인가가 있다면?

먼저 생각에, 나는 예로 답을 가정하지만 나는 measureText는 각 측정 후 전에 AdvanceX 가치를 추가했다 this answer을 읽고 있었다. 그것이 사실이라면 합계 길이를 측정하는 데 미묘한 오류가 발생할 것입니다 (각 문자 사이에 이중 패딩이 있기 때문입니다).

주변 문자에 따라 글자가 얼마나 가까이 배치되는지를 변경하는 글꼴이있는 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 

의미

당신은 총을 문자열의 모든 문자를 측정하고 합산하는 것은 당신에게 문자열의 실제 길이를 줄 것이라고 가정 할 수 없다 :이 다른 문자열로 다시 테스트입니다. 따라서 텍스트 배치를 수행 할 때 전체 문자열 범위를 측정해야합니다.