Navigasi gestur

Android Q memperkenalkan opsi untuk sepenuhnya menggunakan navigasi sistem gestur. Ada dua hal yang harus dilakukan developer aplikasi untuk mempersiapkan fitur ini:

  • Memperluas konten aplikasi dari tepi ke tepi.
  • Menangani gestur aplikasi yang bertentangan.

Konten aplikasi tepi-ke-tepi

Untuk memanfaatkan ruang layar tambahan yang disediakan pada menu navigasi floating, Anda perlu membuat beberapa perubahan pada aplikasi.

Menyetel bar sistem transparan

Anda dapat melakukannya dengan menyetel nilai berikut dalam tema Anda:

<!-- 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>
    

Selain itu, Anda juga dapat melakukannya secara dinamis menggunakan Window.setNavigationBarColor() dan Window.setStatusBarColor().

Menyetel tanda visibilitas UI

Agar dapat mengatur tampilan dari tepi ke tepi, aplikasi Anda harus memberi tahu sistem bahwa aplikasi dapat menangani tampilan tersebut. Anda dapat melakukannya menggunakan View.setSystemUiVisibility() untuk menyetel tanda berikut:

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);
    

Secara bersama-sama, tanda ini memberi tahu sistem bahwa aplikasi Anda harus diletakkan pada layar penuh, dan seolah-olah menu navigasi dan status bar tidak ada di sana. Untuk aktivitas layar penuh lainnya, Anda juga dapat menetapkan SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN, yang memungkinkan Anda untuk menggambar di belakang status bar.

Jika Anda menggunakan class tampilan seperti CoordinatorLayout atau DrawerLayout yang otomatis menangani status bar, tanda SYSTEM_UI_FLAG_LAYOUT_STABLE dan SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN mungkin telah ditetapkan. Selain itu, jika Anda menggunakan setSystemUiVisibility() untuk menetapkan tanda lain, seperti SYSTEM_UI_FLAG_IMMERSIVE, Anda harus berhati-hati agar tanda lain tersebut tidak menimpa tanda yang dirujuk di atas.

Meskipun aplikasi Anda menggunakan tampilan tepi-ke-tepi, sistem tetap menggunakan WindowInsets API untuk menunjukkan posisi sistem bar.

Menggunakan sisipan secara manual

Jika aplikasi Anda menggunakan hierarki tampilan kustom, Anda mungkin perlu menggunakan sisipan jendela sistem secara manual. Normalnya, Anda dapat melakukannya dengan menerapkan antarmuka 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()
            //    (i.e landscape orientations)
            return insets.consumeSystemWindowInsets();
        }
    });
    

WindowInsets menyediakan sisipan visual reguler untuk semua sistem bar melalui getSystemWindowInsets(). Selain itu, Android Q juga menambahkan metode berikut ke WindowInsets:

Menangani gestur aplikasi yang bertentangan

Model navigasi gestur mungkin bertentangan dengan gestur yang sebelumnya digunakan oleh developer aplikasi. Sehingga Anda mungkin perlu melakukan penyesuaian pada antarmuka pengguna aplikasi.

Konflik dengan gestur Kembali

Gestur sistem baru untuk Kembali adalah geser ke dalam dari tepi kiri atau kanan layar. Hal ini dapat mengganggu elemen navigasi aplikasi di area tersebut. Untuk mempertahankan fungsi elemen di tepi kiri dan kanan layar, Anda harus menghentikan gestur Kembali secara selektif dengan menunjukkan kepada sistem area mana yang perlu menerima input sentuhan. Anda dapat melakukannya dengan meneruskan List<Rect> ke View.setSystemGestureExclusionRects() API yang diperkenalkan pada Android Q. Metode ini juga tersedia di ViewCompat pada androidx.core:core:1.1.0-dev01.

Contoh:

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);
    }
    

Konflik dengan gestur Beranda/Beralih Cepat

Gestur sistem baru untuk Beranda dan Beralih Cepat melibatkan gestur geser di bagian bawah layar di area yang sebelumnya ditempati menu navigasi. Aplikasi tidak dapat keluar dari gestur ini, karena gestur tersebut dapat bertentangan dengan gestur Kembali.

Untuk mengurangi masalah ini, Android Q memperkenalkan WindowInsets.getMandatorySystemGestureInsets() API, yang menginformasikan ambang pengenalan sentuhan kepada aplikasi.

Game dan aplikasi non-Tampilan lainnya

Game dan aplikasi lainnya yang tidak memiliki hierarki tampilan sering mengharuskan pengguna untuk menggeser di dekat area gestur sistem. Dalam kasus semacam ini, game dapat menggunakan Window.setSystemGestureExclusionRects() untuk mengecualikan area yang tumpang-tindih dengan area yang dikhususkan untuk gestur sistem. Game harus memastikan untuk mengecualikan area ini saja jika diperlukan, misalnya selama game dijalankan.

Jika game mengharuskan pengguna untuk menggeser di dekat area gestur beranda, aplikasi dapat meminta untuk ditempatkan dalam mode imersif. Hal ini akan menonaktifkan gestur sistem selagi pengguna berinteraksi dengan game, tetapi memungkinkan pengguna untuk mengaktifkan kembali gestur sistem dengan menggeser dari bagian bawah layar.