Android Immersive Mode

사용자에게 컨텐츠 몰입 환경을 제공해주자!

marojun
marojun
Dec 3, 2013 · 6 min read
시스템바와 네비게이션을 숨겨 컨텐츠에 몰입하는 환경을 제공한다.

정확히 말하자면 Immersive Mode는 킷캣(4.4) 버전부터 적용된다. 4.4에서 Immersive Mode를 사용하기 위해서는 아래와 같이 코드를 작성하면된다.

int uiOptions = getActivity().getWindow().getDecorView().getSystemUiVisibility();
int newUiOptions = uiOptions;
boolean isImmersiveModeEnabled = ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
if (isImmersiveModeEnabled) {
Log.i(TAG, “Turning immersive mode mode off. “);
} else {
Log.i(TAG, “Turning immersive mode mode on.”);
}
newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
getActivity().getWindow().getDecorView().setSystemUiVisibility(newUiOptions);

코드를 보면 getSystemUiVisibility()를 통해 setSystemUiVisibility()로 설정된 현재 시스템 UI상태 값을 받아 Immersive Mode인지 여부를 체크한다. 이후 개발자가 각각의 경우에 대해 서비스의 성격에 따른 기능을 적용하도록 한다.

만약 Immersive Mode를 적용하고자 한다면 꼭,

SYSTEM_UI_FLAG_HIDE_NAVIGATION, SYSTEM_UI_FLAG_FULLSCREEN, SYSTEM_UI_FLAG_IMMERSIVE_STICKY

세가지 플래그 값을 모두 적용하여 setSystemUiVisibility()를 통해 반영 하도록 한다.

만약 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 플래그 하나만 사용한다면 아무런 효과도 얻을 수가 없다.

그렇다고 해서 SYSTEM_UI_FLAG_IMMERSIVE_STICKY를 사용하지 않고, SYSTEM_UI_FLAG_HIDE_NAVIGATION 이나 SYSTEM_UI_FLAG_FULLSCREEN 플래그를 단독으로 사용한다고 네비게이션, 시스템바가 사라지지 않는 것은 아니다.

그러나 SYSTEM_UI_FLAG_IMMERSIVE_STICKY와 같이 사용한다면 사용자가 현재 화면에 몰입 할 수 있는 최적의 상태로 적용되어 진다.

SYSTEM_UI_FLAG_HIDE_NAVIGATION을 단독으로 적용할 경우 네비게이션은 사라지지만 화면을 터치하면 다시 네비게이션이 활성화 된다. 영화와 같이 영상을 보는 경우에는 문제가 없겠지만 책을 읽는다면 다음장으로 넘기기위해 화면을 터치한다면 해당 모드가 풀려버릴 것이다. SYSTEM_UI_FLAG_IMMERSIVE_STICKY와 함께 사용할 경우 화면을 터치한다고 원래대로 돌아가는 것이 아니라 개발자가 사용자의 특정 액션이 발생하면 네비게이션을 활성화 할 수 있도록 정의할 수 있다.

SYSTEM_UI_FLAG_FULLSCREEN을 단독으로 적용할 경우 화면 상단에서 아래로 스와이프하면 시스템바가 활성화 된다. 이것도 마찬가지로 단순히 시간이나 배터리 소모량을 보고 싶은경우에도 Immersive Mode가 풀려 사용자의 몰입도가 떨어지게된다. 이에SYSTEM_UI_FLAG_IMMERSIVE_STICKY와 함께 사용한다면 스와이프 할 경우 반투명의 상태바가 현재 화면위에 잠시 나타났다가 사라지게 된다. 이를 풀기 위해서는 위 플래그와 마찬가지로 개발자가 정의한 특정 액션 발생시 시스템 바를 활성화 시킬수 있다.

그럼 하위버전에는 이러한 모드를 사용할 수 없는 것일까? 결론부터 말하자면 사용할 수 없다. 그러나 SYSTEM_UI_FLAG_HIDE_NAVIGATION나 SYSTEM_UI_FLAG_FULLSCREEN는 하위버전에서도 사용할 수 있기에 완벽하지는 않지만 아래와 같이 비슷하게나마 구현할 수 있도록 할 수는 있다.

// 아이스크림 샌드위치(4.0) 이상일 경우 
if (Build.VERSION.SDK_INT >= 14) {
newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}
// 젤리빈(4.1) 이상일 경우
if (Build.VERSION.SDK_INT >= 16) {
newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
}
// 킷캣(4.4) 이상일 경우
if (Build.VERSION.SDK_INT >= 18) {
newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
}

사실 분기문을 보면 알겠지만 유사효과도 현재 OS가 아이스크림 샌드위치(4.0) 이상이여야 사용할 수 있다. 이에 대부분의 개발자들은 본인들이 개발한 앱의 최소지원 OS버전이 2.2나 2.3이기에 해당 코드 사용량이 미미할 것으로 생각할 수도 있겠지만 현재 4.0이상 사용자가 65%이상이라는 점과 직접 써본 결과 해당 코드를 사용했을때 사용자가 느끼는 편의성은 개발적으로 소모되는 시간에 비례해 훨씬 더 많은 가치를 가져다 준다라고 말하고 싶다. 특히 책 또는 동영상과 관련된 앱에서는 꼭 해당기능 적용이 선택이 아닌 필수가 아닐까한다.

marojun’s Android

안드로이드 관련 글을 공유합니다. 

    marojun

    Written by

    marojun

    전슬마로. 협업과 공유를 통해 세상을 멋지게 바꿀수 있다고 믿는 개발자. KTH와 SK Planet을 거쳐 NCSOFT에서 iOS와 Android를 개발하고 있다. — 안드로이드 개발 그룹 https://www.facebook.com/groups/junsle/ 에 놀러오세요

    marojun’s Android

    안드로이드 관련 글을 공유합니다. 

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade