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

동작 탐색

Android 10 (API 레벨 29)부터 Android 시스템에서 완전한 동작 기반 탐색을 지원합니다. 앱에서 이 기능이 호환되도록 하기 위해 앱 개발자가 취해야 할 두 가지 조치가 있습니다.

  • 앱 콘텐츠를 가장자리까지 확장합니다.
  • 앱 동작의 충돌을 처리합니다.

더욱 넓은 화면을 활용하는 앱 콘텐츠

떠 있는 탐색 메뉴가 제공하는 추가적인 화면 공간을 활용하려면 앱을 다소 변경해야 합니다.

투명한 시스템 메뉴 설정

테마에서 다음과 같이 값을 설정하면 됩니다.

<!-- values-29/themes.xml: -->

<style name="AppTheme" parent="...">
    <item name="android:navigationBarColor">@android:color/transparent</item>

    <!-- Optional, but recommended for full edge-to-edge rendering -->
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>
버튼이 있는 투명한 탐색 메뉴가 활성화되었습니다.

또는 Window.setNavigationBarColor()Window.setStatusBarColor()를 사용하여 동적으로 설정할 수 있습니다.

기기가 동작 탐색을 사용하도록 설정하고 앱 탐색 메뉴의 배경을 투명하게 지정하면 시스템이 그 뒤의 콘텐츠 색상에 기초해서 자동으로 핸들 색상을 업데이트합니다. 그러나 사용자가 2버튼 또는 3버튼 탐색 모드에 있을 경우에는 버튼의 색상이 바뀌지 않습니다. 그 대신 버튼이 계속 보이도록 시스템에서 반투명한 배경을 적용합니다. 하지만 앱이 API 레벨 29 이상을 대상으로 할 경우에만 시스템에서 이렇게 설정이 가능합니다.

UI 가시성 플래그 설정

뷰가 더욱 넓은 화면을 활용하도록 배치하려면 앱이 이런 뷰를 처리할 수 있다는 것을 시스템에 알려야 합니다. 이는 View.setSystemUiVisibility()를 사용하여 다음과 같은 플래그를 설정하면 됩니다.

Kotlin

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)

Java

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

이 플래그들은 앱을 전체 화면에 배치해야 하고, 탐색 메뉴와 상태 표시줄이 그곳에 없는 것처럼 간주해야 한다는 것을 시스템에 전달합니다. 추가적인 전체 화면 이벤트의 경우, 상태 표시줄 뒤에 그리게 해주는 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN을 설정할 수도 있습니다.

CoordinatorLayout 또는 DrawerLayout과 같이 상태 표시줄을 자동으로 처리하는 뷰 클래스를 사용할 경우, SYSTEM_UI_FLAG_LAYOUT_STABLESYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 플래그가 이미 설정되었을 수도 있습니다. 또한 setSystemUiVisibility()를 사용하여 다른 플래그(예: SYSTEM_UI_FLAG_IMMERSIVE)를 설정한다면 다른 플래그들이 위에서 언급한 플래그를 재정의하지 않도록 주의해야 합니다.

앱이 더욱 넓은 화면을 활용하는 뷰를 사용하더라도 시스템은 WindowInsets API를 사용해 시스템 메뉴가 있는 위치를 표시합니다.

인셋의 수동 사용

앱이 맞춤 뷰 계층 구조를 사용할 경우, 시스템 창 인셋을 수동으로 사용해야 할 수도 있습니다. 그렇게 하려면 일반적으로는 OnApplyWindowInsetsListener 인터페이스를 구현하면 됩니다.

Kotlin

view.setOnApplyWindowInsetsListener() {v, insets ->
    insets.consumeSystemWindowInsets()

Java

view.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
    @Override
    public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
        // 1. Move views on top edge down by insets.getSystemWindowInsetTop()
        // 2. Move views on bottom edge up by insets.getSystemWindowInsetBottom()
        // 3. Also check getSystemWindowInsetLeft/Right(), such as for landscape
        // orientations
        return insets.consumeSystemWindowInsets();
    }
});

WindowInsetsgetSystemWindowInsets()을 통해 모든 시스템 메뉴에 일정한 시각적 인셋을 제공합니다. 또한 Android 10은 다음 메서드를 WindowInsets에 추가합니다.

충돌하는 앱 동작 처리

동작 탐색 모델은 앱 개발자가 이전에 사용한 동작과 충돌을 일으킬 수 있습니다. 따라서 앱 사용자 인터페이스도 조정해야 할 수 있습니다.

'뒤로' 동작과의 충돌

'뒤로'에 대한 새로운 시스템 동작은 화면 가장자리 왼쪽이나 오른쪽에서 안쪽으로 스와이프하는 것입니다. 이 동작은 해당 영역의 앱 탐색 요소에 방해가 될 수 있습니다. 화면의 왼쪽과 오른쪽 가장자리에 있는 기능을 유지하기 위해서는 시스템에 터치 입력을 수신해야 할 영역이 어디인지 표시해 '뒤로' 동작을 선택적으로 옵트아웃해야 합니다. 이는 Android 10에서 도입된 View.setSystemGestureExclusionRects() API에 List<Rect>를 전달하면 됩니다. 이 메서드는 androidx.core:core:1.1.0-dev01부터 ViewCompat에도 제공됩니다.

예를 들면 다음과 같습니다.

Kotlin

var exclusionRects = listOf(rect1, rect2, rect3)

fun onLayout(
        changedCanvas: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
  // Update rect bounds and the exclusionRects list
  setSystemGestureExclusionRects(exclusionRects)
}

fun onDraw(canvas: Canvas) {
  // Update rect bounds and the exclusionRects list
  setSystemGestureExclusionRects(exclusionRects)
}

Java

List<Rect> exclusionRects;

public void onLayout(
        boolean changedCanvas, int left, int top, int right, int bottom) {
    // Update rect bounds and the exclusionRects list
    setSystemGestureExclusionRects(exclusionRects);
}

public void onDraw(Canvas canvas) {
    // Update rect bounds and the exclusionRects list
    setSystemGestureExclusionRects(exclusionRects);
}

'홈/빠른 전환' 동작과의 충돌

'홈'과 '빠른 전환'에 대한 새로운 시스템 동작은 탐색 메뉴가 사용하고 있던 공간의 화면 하단에서 스와이프하는 것입니다. '뒤로' 동작과 달리 앱은 이 동작을 옵트아웃할 수 없습니다.

이 문제를 완화하기 위해 Android 10에서는 앱에 터치 인식 임계값을 알려주는 WindowInsets.getMandatorySystemGestureInsets() API를 도입했습니다.

게임 및 뷰가 없는 기타 앱

뷰 계층 구조가 없는 다른 앱과 게임은 사용자가 시스템 동작 영역 근처에서 스와이프해야 하는 경우가 많습니다. 이 경우에 게임은 Window.setSystemGestureExclusionRects()를 사용하여 시스템 동작에 예약된 영역과 중첩되는 영역을 제외할 수 있습니다. 게임은 필요한 경우(예: 게임 플레이 중)에 해당 영역만 제외하도록 해야 합니다.

게임에서 사용자가 홈 동작 영역 근처를 스와이프해야 하는 경우, 앱을 몰입형 모드로 배치하도록 요청할 수 있습니다. 이렇게 하면 사용자가 게임과 상호작용하는 동안 시스템 동작이 비활성화되지만, 화면 하단에서 스와이프하면 시스템 동작이 다시 활성화됩니다.

참고 자료

동작 탐색에 대한 자세한 내용은 다음의 추가 리소스를 참조하세요.

블로그 게시물

동영상