티스토리 뷰

OS/Android

[Android] 입력기 제작 고찰

유승구 2010. 12. 8. 10:38

현재 제가 진행중인 업무는 문자를 입력 받아 스타일을 입히는 것을 맡고 있습니다. 그동안 올린 포스팅도 이러한 일환 중 하나로 테스트를 진행했던 내용들이 더러 있을 겁니다. 물론 어느정도 성과가 있으면 다음 일을 또 맡아서 하게 되겠죠. 

진행하면서 기록해둬야 할 필요성이 있어 여기에 기록을 남겨 둡니다.

1. 한글 폰트 굵게 표시
안드로이드 기본 서체에서는 BOLD 를 지원하지 않습니다. (Ginger에서는 아직 확인을 안 해봤습니다. 리액션 폰의 경우에는 BOLD가 적용되는데 그 이유는 살펴보니 자체 폰트를 사용하고 있었습니다. 타 폰트는 어떤가 싶어서 환경설정에서 폰트를 바꾸려 했지만 서체 메뉴 항목을 삭제 해놨더군요. 대부분이 루팅해서 폰트를 바꿔 쓰시더군요. 

[Update] 기본 서체의 경우에만 Bold가 사용되며, 검색해보면 아시겠지만 paint를 이용해 서체에 Bold효과를 주는 방법이 있습니다. 나중에 정리 하도록 하겠습니다.

2. <span> 처리
어떤 식으로든 태그 형태로 문자에 스타일을 입히게 됩니다. 지금 제가 사용하는 방식은 span을 이용하는 방식인데 span에 대해 많이 해보지 않으면 처리가 애매 해 질 수 있습니다.

[span 적용의 형태]
1) 완전한 형태 : <span>완전한 스팬처리</span>
양쪽 태그 마크가 열리고 닫히는게 완벽한 상태, Spannable의 상수 속성중에 SPAN_EXCLUSIVE_EXCLUSIVE가 이에 해당됨.

2) 불완전한 형태 : 불완전한스팬처리1</span>,<span>불완전한 스팬처리2  
태그 마크가 한쪽만 열리거나 닫힌 상태, Spannable의 상수 속성중에 SPAN_INCLUSIVE_EXCLUSIVESPAN_EXCLUSIVE_INCLUSIVE가 이에 해당됨.

[Update] 자칫 보면 오해의 소지가 있는 글이기에 덧 붙입니다. 불완전한 형태가 태그 한쪽만 열리거나 닫혀있다고 해서 페어로 이루어지지 않는 건 아닙니다. 저도 이제야 생각이 바뀐 거지만 span을 검색해 보면 span은 정상적으로 존재하고 있으니까요.

INCLUSIVE 속성을 이용하면 확장이 가능해 집니다. 즉 EXC 속성으로 글을 쓴다면 당장은 보이겠지만 TAG를 찍어보면 <span>가</span><span>나</span> 이런식으로 작성된다는 것이죠.

보통 한글은 오른쪽으로 작성되고 있으니 EXC_INC 속성을 주면 글을 작성할 때 위와 같은 일은 발생하지 않습니다. 하지만 INC에 대한 문제는 분명 남아있습니다. 제가 아직 이 부분에 대한 연구가 좀더 필요할 것 같습니다. 예전에 어떠한 상황에 부딪힌 적이 있었거든요. 이부분은 추후에 다시 포스팅 하겠습니다.

3. Touch로 인한 Cursor 위치 이동
EditText 메소드 중에 getSelectionStart(), getSelectionEnd()가 존재한다. 선택 영역이 일반 커서를 옮기는 정도였다면 Start와 End의 위치는 동일하지만 전체 선택이나 부분 블록 지정을 했다면 그 시작과 종료의 위치를 가지고 온다.

이러한 메소드를 통해 TextWatcher로 실시간 감시를 하면서 우리는 보다 정확한 span값을 처리 해 줄수 있다. 보통 스타일의 시작은 SPAN_EXCLUSIVE_INCLUSIVE 속성값을 주어 태그를 열어 준다. 태그를 열어 주면 그 뒤에 입력되는 문자들은 자연스레 태그 스타일이 입혀지게 된다.

하지만 뒤에 태그를 닫아주지 않고 커서를 옮겨 버렸다면 다른 문제가 생길 수 있다. 제대로 닫히지 않은 태그로 인해 스타일이 엉키는 경우가 부지기수이므로 이 태그 관리에 신경을 써야 한다.

그 외에도 다양한 조건이 존재하고 있다. 지금은 그러한 상황을 정리하는 것은 아니다.

4. span의 중복 처리를 막기 위한 removeSpan
<span style=2><span style=1>먼저 여기에 작성을 했다.</span>
이러한 상황은 위에 터치를 하면 생기는 문제를 해결하기 위한 방책으로 적용한 잘못된 방법이다. 터치시에 그동안 작업했던 내용을 SPAN_EXCLUSIVE_EXCLUSIVE 로 감싸 주면 새로 덮어 씌워질 거라 예상하고 작성된 것이다. 하

알아 보기 쉽게 하려고 색을 집어 넣어 봤다. 보다 시피 style1의 태그를 먼저 SPAN_EXCLUSIVE_INCLUSIVE 속성으로 넣어주고 다시 이 부분을 SPAN_EXCLUSIVE_EXCLUSIVE 속성으로 감싸 주었다. 하지만 이렇게 되면 우리는 style1은 닫아 주었지만 style2는 닫아주지 않은 경우가 되므로 style2는 계속적으로 span이 먹히게 된다. 

그러므로 적절하게 removeSpan을 사용하여 이전에 가지고 있는 내용을 잡아주고 감싸 주어야 한다.
SPAN_EXCLUSIVE_INCLUSIVE 로 작성된 경우 getSpanStart(), getSapnEnd() 메소드를 사용하면 마크를 닫아주지 않아도 스팬이 적용된 부분까지를 가져오게 되므로 이를 활용하면 터치시에 안닫히는 문제를 해결 할 수 있다.

5. getSpanStart, getSpanEnd
getSpan을 이용해 우리는 span의 정보를 가져 올 수 있다. 인자로 넘어가는 Object What 을 통해 우리가 꺼내오고 싶은 클래스를 입력해 자유로이 사용할 수 있다. 인자 중에 int Start, int End 가 있어 우리는 원하는 영역을 선택 할 수 있다.

시작과 끝 인자에 다음과 같은 조건을 넣어주는 것으로 각각 색다른 내용을 얻어 올 수 있다.
UnderlineSpan[] ulspans = bodyText.getSpan(0, bodyText.length(), UnderlineSpan.class); // 1
UnderlineSpan ulspan = bodyText.getSpan(start, start, UnderlineSpan.class); // 2

두 라인의 해석은 숙제로 남겨두며. 이만 마치겠다.
댓글
댓글쓰기 폼