2010년 12월 30일 목요일

[Android강좌][Korean][테마] - screenOrientation / Rotation





Android 'Rotation / screenOrientation' 에 관련된 내용을 하나씩 살펴보자.

1. screenOrientation
(1) 'Xml' 설정
: “AndroidManifest.xml” 에서 Activity Tag 에 "android:screenOrientation"을 설정하면 된다.
- portrait : '세로'만 보기
- landscape : '가로'만 보기
- norsensor : '가로/세로' 모두 전환 X
- sensor : '가로/세로' 모두 전환 O
=> 단점 : 폰의 '설정-시스템-디스플레이-자동화면 회전' 기능과 무관하게 동작한다.
즉, '자동화면 화전'을 'Diable'로 설정하더라고 회전이되는 것이 문제다.
- unspecified : '가로/세로' 모두 전환 O
=> 특징 : 폰의 '설정-시스템-디스플레이-자동화면 회전' 기능에 따라 동작한다.
즉, '자동화면 화전'을 'Diable'로 설정한다면 회전이 동작하지 않는다.

(2) 'Code' 설정
: Code 상에서 “setRequestedOrientation()” API를 사용하면 된다.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
...ETC...

2. 'Rotation' 주의 사항
: 안드로이드는 화면 회전 기능을 지원한다.
하지만, 아무런 설정이 없다면, 회전 할 때마다 기존에 있던 Activity의 Data를 보존하지 않는다. 즉, 가로/세로 전환 시에 UI가 새로 그려지면서 Activity의 onDestroy()와 onCreate()가 수행되기 때문이다.
1) 'onDestroy() & onCreate()' 다시 로딩하지 않는 방법
- 'AndroidManifest.xml' 설정
 : android:configChanges="keyboardHidden|orientation"

- 'Code' 설정
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    switch(newConfig.orientation) {
        case Configuration.ORIENTATION_PORTRAIT:
            .....working......
            break;
        case Configuration.ORIENTATION_LANDSCAPE:
            .....working......
            break;
    }
}
 : Activity가 다시 로딩되지 않기 때문에 화면의 크기는 변하지 않는다.  그러므로 'Code' 부분에서 위의 작업을 해주어야 한다.

2) 'onDestroy() & onCreate()' 호출 시, Data Backup 방법
 - 화면 회전 시, Data Save.
: 'public Object onRetainNonConfigurationInstance()'에 화면 회전시, 데이터를 저장하는 코딩을 한다.

public Object onRetainNonConfigurationInstance() {
    HashMap<String, Object> DataBackup = null;
    DataBackup = new HashMap<String, Object>();
    ...... Data Save Working.....
    return DataBackup;
}

- 'onCreate()' 다시 호출 시, Data Loading.
: 'public void onCreate(Bundle savedInstanceState)' 다시 호출 시, 'Data Loading' 작업을 한다.
public void onCreate(Bundle savedInstanceState) {
    ....
    Object obj = getLastNonConfigurationInstance()
    if (obj != null) {
        HashMap<String, Object> DataBackup = (HashMap<String, Object>) obj;
        ..... Data Loading .....
    }
    ....
}

3. AVD(Android Virtual Device) 가로/세로 모드 전환 Tip
: 안드로이드 애뮬레이터인 AVD(Android Virtual Device)의 '가로/세로' 전환은 [CTRL] + F11 또는 [CTRL] + F12를 누르면, 화면이 '가로/세로'로 전환된다.
※ 컨트롤 키를 계속 누른상태에서 키를 계속 누르면 바뀌지 않으니 주의.

: Function Key
 [CTRL] + F11
 [CTRL] + F12
 숫자키패드의 [7](숫자키패드의 [7]은 [NumLock]이 꺼져 있어야  작동 가능)

4. 화면 회전 각도
1) Android 2.1 -Eclar
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
int orientation = display.getOrientation();
=> orientation ==  0 :  세로
=> orientation  == 1. 가로

2) Android 2.2-Froyo
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
int rotation = display.getRotation();
=> Surface.ROTATION_0   : 세로
=> Surface.ROTATION_90  : 가로
=> Surface.ROTATION_180 : 세로
=> Surface.ROTATION_270 : 가로

추가로 문의 사항이나, 궁금한 점이 계시면 연락주세요.
(joonryang@gmail.com)
※ 도움이 되셨다면, ^^. 맨 위 광고클릭 좀..ㅎㅎ

댓글 없음:

댓글 쓰기