Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

전체 화면 모드 사용 설정

동영상, 게임, 이미지 갤러리, 책, 프레젠테이션 슬라이드 같은 콘텐츠를 이용하기에 최적의 환경은 전체 화면입니다. 이 페이지에서는 전체 화면에서 사용자를 콘텐츠에 더욱 몰입하게 하는 방법과 사용자가 앱을 실수로 종료하지 않도록 하는 방법을 설명합니다.

앱에 화면 공간을 최대한 활용하겠다는 단순한 이유로 전체 화면 모드를 사용 설정하려고 할 수 있습니다. 하지만 사용자가 알림 확인이나 즉흥적인 검색 등을 위해 얼마나 자주 앱을 시작하고 종료하는지 고려해야 합니다. 전체 화면에서는 사용자가 시스템에서 원하는 곳으로 쉽게 이동할 수 없으므로 공간을 조금 더 제공한다는 단순한 이유를 넘어서 사용자 환경에 다른 혜택(게임 중에 실수로 앱이 종료되는 일을 방지하거나 이미지, 동영상, 책을 볼 때 몰입형 환경을 제공)을 줄 수 있는 경우에만 전체 화면 모드를 사용해야 합니다.

전체 화면 옵션

Android에서는 lean back, Immersive, sticky immersive라는 3가지 옵션으로 앱을 전체 화면 모드로 전환할 수 있습니다. 이 세 가지 방식에서는 모두 시스템 표시줄이 숨겨지고 활동에서 모든 터치 이벤트를 계속 수신합니다. 이 방식의 차이점은 사용자가 시스템 표시줄을 보기 영역으로 어떻게 다시 가져오느냐입니다.

다음은 이러한 각 옵션을 설명한 것입니다. 예제 코드를 보려면 전체 화면 모드 사용 설정으로 건너뛰세요.

lean back

lean back 모드는 사용자가 동영상을 시청할 때와 같이 화면과 거의 상호작용하지 않을 때 사용할 수 있는 전체 화면 환경 설정입니다.

시스템 표시줄을 다시 표시하려면 사용자는 화면 아무 곳이나 탭하면 됩니다.

lean back 모드를 사용 설정하려면 setSystemUiVisibility()를 호출하고 SYSTEM_UI_FLAG_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION을 전달합니다.

시스템 표시줄이 다시 표시되면 UI에 대한 다른 업데이트를 진행하라는 콜백을 받을 수 있습니다. UI 공개 여부 변경에 대한 응답을 참조하세요.

immersive

immersive 모드는 사용자가 화면과 많이 상호작용하는 앱용으로 만들어졌습니다. 게임을 하거나 갤러리에서 이미지를 보거나 책 또는 프레젠테이션 슬라이드처럼 페이지가 나뉜 콘텐츠를 읽을 경우가 이에 해당합니다.

시스템 표시줄을 다시 표시하려면 시스템 표시줄이 숨겨진 가장자리에서 스와이프하면 됩니다. 이같이 정교한 동작이 필요하기 때문에 사용자가 실수로 터치하거나 스와이프해서 사용자의 앱 참여도가 떨어지는 일이 없습니다.

immersive 모드를 사용 설정하려면 setSystemUiVisibility()를 호출하고 SYSTEM_UI_FLAG_IMMERSIVE 플래그를 SYSTEM_UI_FLAG_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION과 함께 전달합니다.

사용자가 콘텐츠에 아주 몰입했을 때 필요 없는 자체 컨트롤이 있는 앱의 경우 그러한 컨트롤을 시스템 표시줄과 같이 사라지고 다시 표시되도록 설정합니다. 이 권장사항은 앱 컨트롤을 숨기고 표시할 수 있는 앱별 동작에도 적용됩니다. 예를 들어 화면 아무 곳을 터치하면 툴바나 팔레트가 나타나는 경우 시스템 표시줄도 나타나야 합니다.

시스템 표시줄이 다시 표시되면 UI에 대한 다른 업데이트를 진행하라는 콜백을 받을 수 있습니다. UI 공개 여부 변경에 대한 응답을 참조하세요.

sticky immersive

일반적인 immersive 모드에서는 사용자가 가장자리에서 스와이프하면 그때마다 시스템 표시줄을 표시하는 역할을 시스템이 담당합니다. 따라서 앱은 그러한 동작이 발생했는지 인식조차 하지 못합니다. 따라서 사용자가 스와이프를 많이 해야 하는 게임을 하거나 그림 앱을 사용하는 경우 등 기본 앱 설정 중 하나로 실제로 화면 가장자리에서 스와이프해야 하는 경우에는 대신 'sticky' immersive 모드를 사용 설정해야 합니다.

sticky immersive 모드에서는 시스템 표시줄이 있는 가장자리에서 스와이프하면 시스템 표시줄이 표시되지만 반투명 상태이며 터치 동작이 앱에 전달되어 앱도 터치 동작에 반응하게 됩니다.

예를 들어 그리기 앱에 이 방식을 적용하면 사용자가 화면 맨 가장자리부터 선을 그리고 싶을 때 가장자리에서 스와이프하면 시스템 표시줄이 표시되고 맨 가장자리부터 선이 그려집니다. 몇 초간 아무런 상호작용이 없거나 사용자가 시스템 표시줄이 아닌 다른 곳에서 터치하거나 동작하면 바로 시스템 표시줄이 자동으로 사라집니다.

sticky immersive 모드를 사용 설정하려면 setSystemUiVisibility()를 호출하고 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 플래그를 SYSTEM_UI_FLAG_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION과 함께 전달합니다.

stick immersive 모드에서는 시스템 UI 공개 여부가 변경되어도 콜백이 수신되지 않습니다. 따라서 sticky immersive 모드의 자동 숨김 동작이 필요하지만 자체 UI 컨트롤을 표시하기 위해 시스템 UI가 다시 표시되는 시점도 알고자 하는 경우에는 몇 초 후에 immersive 모드로 다시 전환되도록 일반 IMMERSIVE 플래그와 Handler.postDelayed() 또는 이와 유사한 요소를 사용합니다.

전체 화면 모드 사용 설정

사용하려는 전체 화면 모드의 종류에 상관없이 setSystemUiVisibility()를 호출하고 이를 SYSTEM_UI_FLAG_HIDE_NAVIGATION 또는 SYSTEM_UI_FLAG_FULLSCREEN 중 하나에 또는 두 개 모두에 전달해야 합니다. SYSTEM_UI_FLAG_IMMERSIVE(일반 immersive 모드) 또는 SYSTEM_UI_FLAG_IMMERSIVE_STICKY(sticky immersive 모드)를 포함하거나 lean back 모드를 사용 설정하기 위해 이 두 모드를 제외해도 됩니다.

시스템 표시줄이 숨겨졌다가 표시될 때 레이아웃의 크기가 조절되는 것을 방지하려면 다른 시스템 UI 플래그(예: SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONSYSTEM_UI_FLAG_LAYOUT_STABLE)를 포함하는 것이 좋습니다. 또한 작업 표시줄과 다른 UI 컨트롤도 동시에 숨겨지는지 반드시 확인해야 합니다.

다음은 변경된 화면 공간에 따라 레이아웃 크기를 조절하지 않고 활동에 상태 표시줄과 탐색 메뉴를 숨기거나 표시하는 방법을 보여주는 코드입니다.

Kotlin

    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus) hideSystemUI()
    }

    private fun hideSystemUI() {
        // Enables regular immersive mode.
        // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
        // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
                // Set the content to appear under the system bars so that the
                // content doesn't resize when the system bars hide and show.
                or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                // Hide the nav bar and status bar
                or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_FULLSCREEN)
    }

    // Shows the system bars by removing all the flags
    // except for the ones that make the content appear under the system bars.
    private fun showSystemUI() {
        window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    }
    

자바

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            hideSystemUI();
        }
    }

    private void hideSystemUI() {
        // Enables regular immersive mode.
        // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
        // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_IMMERSIVE
                // Set the content to appear under the system bars so that the
                // content doesn't resize when the system bars hide and show.
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                // Hide the nav bar and status bar
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN);
    }

    // Shows the system bars by removing all the flags
    // except for the ones that make the content appear under the system bars.
    private void showSystemUI() {
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }
    

사용자 환경 개선을 위해 다음을 구현할 수도 있습니다.

  • 상태를 매끄럽게 전환하기 위해 모든 UI 컨트롤의 공개 여부를 시스템 표시줄과 동기화된 상태로 유지할 수 있습니다. 앱이 immersive 모드로 전환되면 모든 UI 컨트롤도 시스템 표시줄과 함께 숨겨지고 시스템 UI가 다시 표시되면 UI 컨트롤도 다시 표시됩니다. 이렇게 하려면 UI 공개 여부 변경에 응답에 설명된 것처럼 콜백을 수신할 View.OnSystemUiVisibilityChangeListener를 구현하면 됩니다.
  • onWindowFocusChanged()를 구현합니다. 창 포커스를 얻으면 시스템 표시줄을 다시 숨길 수 있습니다. 앱 위에 대화상자나 팝업 메뉴 등이 표시되어 창 포커스를 잃는 경우, Handler.postDelayed() 또는 이와 유사한 요소를 사용하여 이전에 예약해 놓은 '숨김' 대기 동작을 취소할 수 있습니다.
  • 사용자가 콘텐츠를 터치하여 시스템 표시줄의 공개 여부를 수동으로 전환할 수 있도록 onSingleTapUp(MotionEvent)를 감지하는 GestureDetector를 구현할 수 있습니다. 단순한 클릭 리스너는 사용자가 화면에서 손가락을 드래그하는 경우에도 트리거되기 때문에 이러한 방식에 맞는 최적의 해결 방법이 아닙니다(클릭 타겟이 전체 화면을 차지한다고 가정할 때).

참고: SYSTEM_UI_FLAG_IMMERSIVE_STICKY 플래그를 사용하면 스와이프할 때 시스템 UI가 일시적으로 반투명 상태로 표시되지만 플래그가 지워지지 않고 시스템 UI 공개 여부 변경 리스너가 트리거되지 않습니다.

추가 샘플 코드

각 전체 화면 모드를 사용하는 코드를 더 보려면 다음 샘플을 참조하세요.

기타 고려사항

Android Automotive OS에서는 자동차 제조업체가 전체 화면 모드를 차단할 수 있습니다.