본문 바로가기

Programming/Android

TextView에서 터치된 영역의 Offset 가져오기

Ebook 관련 API들을 만들고 테스트하는 도중,
Select에서의 블록이나 하이라이트와 관련해서
터치된 영역이 문자열의 어느 부분인지 구하는 로직이 필요했습니다.

물론 Paint를 써서 대충 계산하면 어느정도 맞출 수는 있지만
문자 사이즈에 의해 정해져있는 세로와는 달리 가로는 폰트마다
가변적인 사이즈를 가지고 있기 때문에 폰트마다
일일히 계산해주지 않으면 안 되는 상황에 봉착했습니다.
(예전에는 폰트 매트릭스를 읽어와 일일히 계산해주었다는군요)

그러다가 웹서핑 도중 유용한 녀석을 발견해서 정리해놓습니다.
아직도 모르는 게 너무도 많아서 문제군요

public int getOffset(TextVIew text, MotionEvent event) {
  // 터치 좌표를 int형으로 바꿔준다.
  int positionX = (int) event.getX();
  int positionY = (int) event.getY();


  // TextView의 Padding값을 빼준다. (text 영역안에서 계산하기 위함)
    positionX -= text.getTotalPaddingLeft();
    positionY -= text.getTotalPaddingTop();


// TextView의 레이아웃을 가져온다.
    Layout layout = text.getLayout();


// Y좌표를 이용, 현재 몇번째 Line인지 계산한다.
    int line = layout.getLineForVertical(positionY);


 // 라인과 X좌료를 이용, 현재 터치한 영역의 Offset을 구한다.
    int off = layout.getOffsetForHorizontal(line, positionX);


    // 계산된 결과를 리턴
    return off;
}


출처 : http://chunic.blogspot.com/2011/07/textview-offset.html