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

류광, 2010/04/18 23:55
안드로이드 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) 메서드의 반환값에 대한 정보를 안드로이드 플랫폼의 소스 코드에서야 발견할 수 있었다는 점은 문서화의 관점에서 상당히 아쉬운 일입니다.

top
트랙백 0 : 의견 # + 6

Trackback Address :: http://occamsrazr.net/tt/trackback/228

comments powered by Disqus

(2013년 11월 10일자로 블로그에도 DISQUS 시스템을 도입했습니다. 기존 의견의 수정, 삭제, 댓글 추가는 여전히 가능합니다.)

  1. 아라크넹 2010/04/19 11:26 PERMALINKMODIFY/DELETE REPLY

    안드로이드가 enum 같은 걸 성능 문제로 잘 안 쓴다는 얘기를 들었는데, 그런 최적화의 예상치 못한 결과라고 생각할 수도 있지 않을까요? 인터페이스 선언 자체가 최소한의 문서화 역할을 한다면 enum이 더 바람직한 문서화를 제공한다고 할 수도 있겠죠.


  2. 류광 2010/04/19 23:35 PERMALINKMODIFY/DELETE REPLY

    예 그렇습니다.

    사실 그쪽으로 혹시 단서가 있나 살펴보다가 http://developer.android.com/reference/android/content/res/Configuration.html 를 발견했더랬습니다... enum은 아니지만 "이름 붙은" 방향 관련 상수들이 있는데, 안타깝게도 getOrientation()의 반환값하고는 무관해 보입니다. 문서화 이전에 뭔가 일관성이 부족한 부분을 발견한 것인지, 아니면 좀 더 심오한 어떤 관계가 있는 것인지...

  3. 초보 2010/05/01 14:53 PERMALINKMODIFY/DELETE REPLY

    저는 이런 방법을 썼습니다.
    1. values 디렉토리에 xml 파일을 만들고 아래 내용을 넣습니다.
    <string name="orientation">0</string>
    2. values-land 디렉토리를 만들고 xml 파일에 아래 내용을 넣습니다.
    <string name="orientation">1</string>
    3. 이 문자열 값을 읽으면 가로 모드인지 세로 모드인지 알 수 있습니다.

    이 방법은 가로 전환 방향이 어떻게 되던지 잘 동작합니다. 하지만 본문에 나온게 훨씬 편하네요. 좋은 정보 얻어갑니다.



  4. 류광 2010/05/04 17:03 PERMALINKMODIFY/DELETE REPLY

    그런 방법도 있었군요~ 고맙습니다.


  5. 초보 2010/05/23 17:25 PERMALINKMODIFY/DELETE REPLY

    안드로이드 2.2에서 이문제(?)관련하여 새로운 API 가 추가되었네요.
    Display.getRotation() 함수를 쓰면 화면 방향에 따라 미리 정의된 상수를 리턴합니다.
    getOrientation()은 deprecated가 되었구요.
    2.2 부터는 화면을 아무 방향으로나 돌릴 수 있게 되었다고 하는데, 관련 API도 발빠르게 수정하는군요.

  6. 류광 2010/05/24 16:59 PERMALINKMODIFY/DELETE REPLY

    소식 고맙습니다. 이제 나머지는 응용 프로그램의 로직에서 해결하면 되겠네요.

    NDK r4도 나왔던데 조만간(또는 언젠가는;;;) NDK r4로 예제들을 컴파일 방법을 정리해 보겠습니다.