안드로이드 개발 질문/답변
(글 수 45,052)
제목 그대로, Textview에 event listener를 달아 화면에 터치된 위치에 있는 텍스트, 혹은 텍스트의 index 값을 알고 싶습니다.
터치 좌표와 text 간의 padding, margin 값등으로 유추하는 방법 밖에 없는지, 또 다른 방법이 있는지 궁금 합니다.
2010.09.28 18:20:01
ㄴ 답변 감사드립니다. 전 아래와 같이 Layout Class를 사용해 구현 했습니다.
/** * 터치가 실행된 위치의 character offset index 리턴 * * @param view * @param event * @return */ public int getIndex(TextView view, MotionEvent event) { int positionX = (int) event.getX(); int positionY = (int) event.getY(); positionX -= view.getTotalPaddingLeft(); positionY -= view.getTotalPaddingTop(); positionX += view.getScrollX(); positionY += view.getScrollY(); positionY -= getcontentViewTop(); int lines = positionY / view.getLineHeight(); if (positionY % view.getLineHeight() != 0) { lines += 1; } if (lines > view.getLineCount()) { lines = -1; } Layout layout = view.getLayout(); int line = layout.getLineForVertical(positionY); int off = layout.getOffsetForHorizontal(line, positionX); return off; } /** * 컨텐츠가 시작되는 실제 X 포지션 리턴 * @return */ public int getcontentViewTop() { Rect rect= new Rect(); Window window= this.getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rect); int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); return contentViewTop; }
textsize와 text를 가져오고, 터치된 좌표값을 가져오면 masureText인가 masureString인가 하는 메서드로 텍스트 총 길이 알아내고(아마 Paint에 있는 메서드 ;;) 섭스트링으로 뒤에서 한자씩 짤라내면서 터치한 위치까지 잘라냈을때 마지막에 짤린 Char을 저장 해놨다가 가져오면 될거 같습니다. 저도 해본건 아니고 비슷한걸 한적이 있어서 문득 생각이 난겁니다 ;;
설명이 너무 대충인가여? ㅠ
대충 코드 만들어 보면
x = 터치 x좌표
text = textView의 문자열.
size = text사이즈
Paint p = new Paint();
p.textSize = size;
len = p.masureString(text); //문자열 길이
for(int i = text.length; i >0 ; i--){
if(len <= x){
break;
}
len = p.masureString(text);
last = text.charAt(text.length-1);
text = text.subString(0,text.length-1);
}
이렇게 하면 last에 저장 될꺼 같습니다.
정확한 코드는 아니니 참조해서 한번 해보세요.