2016-08-24 5 views
0

기준선을 완벽하게 정렬 할 수 있습니다. getLineBounds은 텍스트와 완벽하게 정렬 된 기준선을 제공합니다 (lineBottom - descent). rect.top을 화면 상단에 패딩이있는 줄을 제공하는 topline으로 사용하고 있습니다.텍스트를 완벽하게 정렬하는 선을 그리는 방법은 무엇입니까?

enter image description here

주요 문제는이 코드가 어떤 글꼴에 완벽하게 작동 다른 fonts.And을 가지고있다.

이 내가 시도 무엇 코드

int baseline = getLineBounds(i, rect); 
int topLine = rect.top; 

    canvas.drawLine(rect.left - padding, baseline, rect.right + padding, 
        baseline, paint); 

    canvas.drawLine(rect.left - padding, topLine, rect.right + padding, topLine, 
        paint); 

    canvas.drawLine(rect.left - padding, (baseline + topLine)/2, rect.right 
        + padding, (baseline + topLine)/2, paint1); 

입니다.

1) "StaticLayout"을 사용하여 맨 윗줄을 얻었지만 아무런 차이가 없었습니다. FontPadding으로 시도 글꼴의 높이를 얻고 기준

paint.setTextSize(getTextSize()); 
paint.setTypeface(getCurrentTypFace()); 
paint.getTextBounds(getText().toString(), 0, getText().length(), r); 
int height = r.height(); 
int topLine = baseline + height; 

3을 추가하는 페인트 사용

2)) android:includeFontPadding="false"

그래서 제 질문은 같은 탑 라인을 얻는 방법을 거짓 = 기준선. 이에 대한 도움을 주시면 대단히 감사하겠습니다.

답변

2

r.height 대신 다시 paint.getTextBounds(...)을 시도하지만, r.top (또는 실제로 -r.top)를 사용 :

paint.setTextSize(getTextSize()); 
paint.setTypeface(getCurrentTypFace()); 
paint.getTextBounds(getText().toString(), 0, getText().length(), r); 
int ascent = r.top; 
int topLine = baseline + ascent; 

r.height 매우 위로 가기에있는 문자의 맨 아래까지의 거리를 제공, r.top가 부정적인를 제공해야하는 반면 베이스 라인에서 맨 위까지의 거리 이 중 하나가 작동하지 않는 경우에는 상승 자신을 측정하는 검은 색을 찾을 때까지

, 당신은 단지 메모리에 임시 캔버스에 텍스트를 그릴 및 행으로 픽셀 행을 통해 실행해야 할 수도 있습니다.

두 경우 모두 대문자로 된 텍스트를 사용해야합니다. 소문자 만 사용하는 텍스트는 대신 오렌지색 점선의 좌표를 제공합니다.

두 방법 모두 스트로크 중앙이 아닌 글꼴의 맨 위쪽 가장자리에있는 픽셀의 좌표를 제공합니다. 또한 일부 글꼴의 일부 글자는 실제로 그리기 원하는 좌표를 초과 할 수 있습니다. 가장 안전한 방법은 파란색 줄의 경우 자본이 O이고 주황색 줄의 경우 소문자는 o입니다 (마우스 오른쪽 상단에 조금 삐걱 거리는 스크립트 글꼴이 아닌 경우). O의 위쪽에있는 ...) 다음 줄의 너비가 얼마나 두꺼운 지 알려주는 각 글꼴에 대한 작은 오프셋을 저장하여 줄이 글자의 맨 위를 통과하지 않도록합니다. 그 위에.

+0

시간과 설명에 대해 +1 해보도록하겠습니다. –

+0

그것은 남자에게 감사합니다. 당신이 바로 거기에 소문자와 관련된 문제가 있습니다.하지만 나는 그것을 알아낼 수 있다고 생각합니다. –

관련 문제