안드로이드 API의 Display.getOrientation()의 반환값

Twitter icon류광, 2010-04-18 23:04
안드로이드 SDK의 Display.getOrientation()의 반환값 이야기 또는 안드로이드 문서화의 아쉬움.

Pro Android Games 번역하면서 알게 된 것 한 가지 이야기해 보겠습니다.

제6장 예제의 기능 하나가 Odroid에서 제대로 작동하지 않았습니다. 화면이 가로(landscape) 모드일 때에만 작동하는 기능인데요. 예제는 현재 화면이 가로 모드인지를 다음과 같이 판정합니다.

//0 == prt, 1 == land
int orien = getWindowManager().getDefaultDisplay().
    getOrientation();

if ( orien == 1)
{
    ...

문제의 원인은 Odroid의 경우 가로 모드에서 orien이 3이라는 점이었습니다. 에뮬레이터는 예제의 의도대로 1이고요.

getWindowManager().getDefaultDisplay()가 돌려주는 android.view.Display에 대한 레퍼런스 페이지를 보니, Display.getOrientation()에 대한 설명은 달랑

Returns

orientation of this display.

뿐이었습니다.

안드로이드 개발자 사이트의 공식 문서화에는 0, 1, 3 같은 구체적인 값들의 의미에 대한 이야기가 없었고, 메일링 리스트 등을 뒤져 보아도 속시원한 답을 찾지 못했습니다. "orientation"이 중력 감지기나 자기 감지기(나침반) 쪽에도 쓰이는 용어라서 혼란만 커졌죠.

결국 Odroid 제조사 하드커널로부터 다음과 같은 답을 얻었습니다.

  1. Odroid의 가로 모드는 다른 기기들과 180도 반대 방향이다.
  2. 방향에 따른 상수 값들은 PDK 안드로이드 소스 frameworks/base/core/java/android/view/Surface.java 에 있다.

실제로 platform/frameworks/base.git의 core/java/android/view/Surface.java를 보면 다음과 같은 부분이 있습니다.

    /* orientations for setOrientation() */
    public static final int ROTATION_0       = 0;
    public static final int ROTATION_90      = 1;
    public static final int ROTATION_180     = 2;
    public static final int ROTATION_270     = 3;

일반적으로 회전은 반시계 방향이고요. 일반적인 전화기 형태의 안드로이드 기기에서는 가로 모드에서 기기 하단의 버튼들이 오른손으로 가게 해야 하니 반시계 방향으로 90도 회전해야 합니다. 반면 Odroid는 전통적인 게임 패드 또는 휴대용 게임기를 본딴 것이라서 기기 하단에 배치된 방향키들이 왼손으로 가게 해야 합니다. 그래서 270도와 3이 된 것이지요.

(앞의 문단은 "회전은 반시계 방향이다"라는 가정 외에 "세로 모드(portrait)가 0도이다"라는 가정도 두고 있는데요. 둘 다 상식적인 가정이지만 근거로 삼을만한 문서는 찾지 못했습니다. 기기 제조사들이 오른손잡이를 기준으로 제품을 디자인한다는 점은 가정이라기보다는 기정사실이겠고요.)

궁금증은 해결이 되었지만, 최종 응용 개발자를 위한 공용(public) 메서드의 반환값에 대한 정보를 안드로이드 플랫폼의 소스 코드에서야 발견할 수 있었다는 점은 문서화의 관점에서 상당히 아쉬운 일입니다.

태그: 프로그래밍 안드로이드

comments powered by Disqus

예전 댓글(읽기 전용)