지난 두 달 동안 안드로이드 작업을 한 후 제가 자꾸 잊어버렸었던 그리고 알아내기가 매우 어려웠던 애로사항들을 정리한 리스트를
만들어 보았습니다. 자바는 상당히 AS3(액션스크립트3)와 흡사하기 때문에 플래시 개발자들에게 있어서 안드로이드 개발은 수월하다고
말할 수는 있지만 두 언어 사이에는 조심해야 할 미묘한 차이들이 적지 않게 있기 때문입니다.
5위: 모든 것에는 너비와 높이가 필요하다
Flex에서는 뷰가 생성되면 크기를 상속 받기 때문에 명시적으로 컴포넌트의 크기값을 지정할 필요가 없었습니다. 이런 일을 안드로이드에서 하시면 앱이 뻗을겁니다. 안드로이드 상에서는 XML 상에 위젯(컴포넌트)의 크기가 어떻다 하는걸 적어주어야만 합니다. 다음은 기억해둬야 할 몇가지 타입값들입니다:
안드로이드의 글꼴은 막무가내입니다. 안드로이드 2.1(네, 플래시에서 하셨던 것처럼 공통 분모를 만드셔야 합니다)은 오직 트루타입 글꼴(ttf) 만을 지원합니다. 네, 이 정도로도 나름 쓸만하지만 전 맥을 쓰기 때문에 ttf가 아닌 글꼴도 갖고 있답니다. 그래서 전 FontXChange라 는 정말 좋은 애플리케이션으로 ttf가 아닌 글꼴을 몇개 변환해야만 했습니다. 돌아가지 않는 글꼴은 자기가 안 돌아간다고 따로 알려주지를 않더군요. 전 디자이너/아티스트 이력을 갖고 있기는 하지만 타이포그라피에 약해서 비슷하지만 글꼴을 구별하질 못합니다. 그렇기 때문에 포함시킨 글꼴이 제대로 표시되는지 다른 사람들 앞에서도 정말 많이 테스트 해봐야 합니다.
안드로이드에서 가장 최악인 부분 중 하나가 텍스트를 커닝할 수 있는 방법이 전혀 없다는 것입니다. 커닝은 글자 간의 간격을 조정하는 기능입니다. 내가 함께 일했던 모든 디자이너가 폰트가 커닝을 지원하지 않는데도 디자인에 기본적으로 커닝을 적용시켜 버렸습니다. 정말 악몽이었죠! 그들이 이런 단순한 일을 하지 못했다면 얼마나 더 창조적이 되었을지 당신도 알거라 믿습니다. 난 아직 해결책을 찾지 못했습니다.
3위: 뷰에 직접 투명도를 설정할 방법이 없다
네, 제대로 읽으셨습니다. 뷰의 알파값(투명도)를 변경할 방법이 없습니다. 물론 onAlphaChange라는 메서드가 분명하게 있지만 진짜로 투명도를 변경할 방법이 없습니다. 제가 어렵게 알아낸 유일한 방법은 다음과 같은 식으로 지속시간이 0인 알파 애니메이션을 사용하는 것이었습니다:
2위: 두 정수 나누기
저는 그래픽 리소스를 전체 크기에서 일부 크기로 스케일을 바꾸고 싶은 상황에 놓였습니다. 최대 너비는 X일 때 10% 때의 너비, 50% 때의 너비 등의 값을 구하는 식으로, 당신도 잘 아실 로딩 진행 상태바나 막대 그래프를 그릴 때 이런 일을 많이 하게 됩니다. 여기 간단한 공식이 있습니다:
1위: 리니어 레이아웃의 방향
난 액티비티에 새로운 레이아웃을 만들어 넣을 때마다 거의 이 문제를 겪곤 합니다. 디폴트로는 LinearLayout의 방향이 수평으로 설정되어 있습니다. 왜 안드로이드 개발자들은 이렇게 전화기의 기본 방향은 세로 방향인데 이렇게 이해가 되지 않는 설정을 해 뒀는지 모르겠군요. 이런 기본 설정 때문에 내가 작성한 액티비티를 테스트할 때, 레이아웃 상의 첫 항목만 표시되고 나머지는 나타나지 않게 됩니다. 이 문제를 해결하려면 xml 파일로 가서 수동으로 방향 값을 다음과 같은 식으로 수정해주어야 합니다:
<출처 : http://www.hanb.co.kr/network/view.html?bi_id=1708>
5위: 모든 것에는 너비와 높이가 필요하다
Flex에서는 뷰가 생성되면 크기를 상속 받기 때문에 명시적으로 컴포넌트의 크기값을 지정할 필요가 없었습니다. 이런 일을 안드로이드에서 하시면 앱이 뻗을겁니다. 안드로이드 상에서는 XML 상에 위젯(컴포넌트)의 크기가 어떻다 하는걸 적어주어야만 합니다. 다음은 기억해둬야 할 몇가지 타입값들입니다:
- Fill_parent - 부모 컴포넌트의 크기 만큼 꽉 채우겠다는 의미입니다
- Wrap_content - 별도의 크기를 지정하지 않을거라면 이 타입을 지정해야 합니다
- Value - 명시적인 px(픽셀) 또는 dip나 sp(화면 DPI 기반 가상 픽셀값)로 컴포넌트의 크기를 지정합니다.
안드로이드의 글꼴은 막무가내입니다. 안드로이드 2.1(네, 플래시에서 하셨던 것처럼 공통 분모를 만드셔야 합니다)은 오직 트루타입 글꼴(ttf) 만을 지원합니다. 네, 이 정도로도 나름 쓸만하지만 전 맥을 쓰기 때문에 ttf가 아닌 글꼴도 갖고 있답니다. 그래서 전 FontXChange라 는 정말 좋은 애플리케이션으로 ttf가 아닌 글꼴을 몇개 변환해야만 했습니다. 돌아가지 않는 글꼴은 자기가 안 돌아간다고 따로 알려주지를 않더군요. 전 디자이너/아티스트 이력을 갖고 있기는 하지만 타이포그라피에 약해서 비슷하지만 글꼴을 구별하질 못합니다. 그렇기 때문에 포함시킨 글꼴이 제대로 표시되는지 다른 사람들 앞에서도 정말 많이 테스트 해봐야 합니다.
안드로이드에서 가장 최악인 부분 중 하나가 텍스트를 커닝할 수 있는 방법이 전혀 없다는 것입니다. 커닝은 글자 간의 간격을 조정하는 기능입니다. 내가 함께 일했던 모든 디자이너가 폰트가 커닝을 지원하지 않는데도 디자인에 기본적으로 커닝을 적용시켜 버렸습니다. 정말 악몽이었죠! 그들이 이런 단순한 일을 하지 못했다면 얼마나 더 창조적이 되었을지 당신도 알거라 믿습니다. 난 아직 해결책을 찾지 못했습니다.
3위: 뷰에 직접 투명도를 설정할 방법이 없다
네, 제대로 읽으셨습니다. 뷰의 알파값(투명도)를 변경할 방법이 없습니다. 물론 onAlphaChange라는 메서드가 분명하게 있지만 진짜로 투명도를 변경할 방법이 없습니다. 제가 어렵게 알아낸 유일한 방법은 다음과 같은 식으로 지속시간이 0인 알파 애니메이션을 사용하는 것이었습니다:
Float newAlpha = value ? 1.0f : 0.3f;더 좋은 방법이 있을지도 모르겠습니다만 어쨌거나 돌아가므로 전 이 방법에 정착하기로 했습니다.
Animation animation = new AlphaAnimation(1.0f, newAlpha);
animation.setDuration(0);
animation.setFillAfter(true);
mainView.startAnimation(animation);
2위: 두 정수 나누기
저는 그래픽 리소스를 전체 크기에서 일부 크기로 스케일을 바꾸고 싶은 상황에 놓였습니다. 최대 너비는 X일 때 10% 때의 너비, 50% 때의 너비 등의 값을 구하는 식으로, 당신도 잘 아실 로딩 진행 상태바나 막대 그래프를 그릴 때 이런 일을 많이 하게 됩니다. 여기 간단한 공식이 있습니다:
value = maxValue * (currentValue/maxValue)자바에서는 두 정수를 나누면 반올림이 되기 때문에 이 코드의 결과값은 언제나 0이나 1이 됩니다. 제가 이 변수타입들을 실수형(double)이라고 착각하고 있었기 때문에 빚어진 상황이지요. 저로서는 해결책을 찾기 위해 3시간이나 걸렸던 문젠데요, "자바 나눗셈"이라고 검색하셔도 딱히 바로 해결책이 나오지는 않습니다. 여기 해결책이 있습니다:
int value = maxValue * ( (double) currentValue / (double) maxValue );이제는 해결책이 무엇인지 분명해졌지만 처음 겪었을 때 전 정말 미쳐버리는 줄 알았답니다.
1위: 리니어 레이아웃의 방향
난 액티비티에 새로운 레이아웃을 만들어 넣을 때마다 거의 이 문제를 겪곤 합니다. 디폴트로는 LinearLayout의 방향이 수평으로 설정되어 있습니다. 왜 안드로이드 개발자들은 이렇게 전화기의 기본 방향은 세로 방향인데 이렇게 이해가 되지 않는 설정을 해 뒀는지 모르겠군요. 이런 기본 설정 때문에 내가 작성한 액티비티를 테스트할 때, 레이아웃 상의 첫 항목만 표시되고 나머지는 나타나지 않게 됩니다. 이 문제를 해결하려면 xml 파일로 가서 수동으로 방향 값을 다음과 같은 식으로 수정해주어야 합니다:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"이렇게 제 나름의 자바와 안드로이드의 베스트 코딩 함정들을 열거해보았습니다. 액션스크립트는 Java로 옮겨가기 전에 알거나 배워두면 아주 좋은 언어이긴 하지만 불행히도 옮겨갈 때에 조심해야 할 여러가지 사항들이 당연히 존재합니다.
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<출처 : http://www.hanb.co.kr/network/view.html?bi_id=1708>