Memastikan kompatibilitas dengan navigasi gestur

Mulai Android 10 (API level 29), sistem Android mendukung navigasi berbasis gestur sepenuhnya. Ada dua hal yang harus dilakukan developer aplikasi untuk memastikan aplikasi mereka kompatibel dengan 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 kolom 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>
    
Menu navigasi transparan dengan tombol yang diaktifkan.

Atau, Anda dapat melakukan tindakan ini secara dinamis dengan menggunakan Window.setNavigationBarColor() dan Window.setStatusBarColor().

Ketika perangkat disetel menggunakan navigasi gestur, dan Anda membuat latar belakang menu navigasi aplikasi Anda transparan, sistem secara otomatis memperbarui warna handle berdasarkan warna konten di belakangnya. Namun, ketika pengguna berada dalam mode navigasi 2 tombol atau 3 tombol, tombol-tombol ini tidak berubah warna. Sebagai gantinya, sistem menerapkan latar belakang transparan sehingga tombol tetap terlihat. Namun, sistem hanya dapat melakukan ini jika aplikasi menargetkan API level 29 atau lebih tinggi.

Menyetel tanda visibilitas UI

Agar dapat mengatur tampilan tepi ke tepi, aplikasi Anda harus memberi tahu sistem bahwa aplikasi dapat menangani tampilan tersebut. Anda dapat melakukannya menggunakan View.setSystemUiVisibility() untuk menyetel flag 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, flag SYSTEM_UI_FLAG_LAYOUT_STABLE dan SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN mungkin telah ditetapkan. Selain itu, jika Anda menggunakan setSystemUiVisibility() untuk menetapkan flag lain, seperti SYSTEM_UI_FLAG_IMMERSIVE, Anda harus berhati-hati bahwa flag lain tersebut tidak menimpa yang dirujuk di atas.

Meskipun aplikasi Anda menggunakan tampilan tepi ke tepi, sistem masih menggunakan API WindowInsets untuk menunjukkan posisi kolom sistem.

Menggunakan inset secara manual

Jika aplikasi Anda menggunakan hierarki tampilan kustom, Anda mungkin perlu menggunakan inset jendela sistem secara manual. Ini biasanya dapat dilakukan dengan mengimplementasikan 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(), such as for landscape
            // orientations
            return insets.consumeSystemWindowInsets();
        }
    });
    

WindowInsets menyediakan inset visual biasa untuk semua kolom sistem melalui getSystemWindowInsets(). Selain itu, Android 10 menambahkan metode berikut ke WindowInsets:

Menangani gestur aplikasi yang bertentangan

Model navigasi gestur mungkin bertentangan dengan gestur yang sebelumnya digunakan oleh developer aplikasi. Oleh karena itu, 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 API View.setSystemGestureExclusionRects() yang diperkenalkan di Android 10. 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 10 memperkenalkan API WindowInsets.getMandatorySystemGestureInsets(), yang menginformasikan ambang pengenalan sentuhan kepada aplikasi.

Game dan aplikasi non-Tampilan lainnya

Game dan aplikasi lain yang tidak memiliki hierarki tampilan sering mengharuskan pengguna untuk menggeser di dekat area gestur sistem. Dalam kasus tersebut, game dapat menggunakan Window.setSystemGestureExclusionRects() untuk mengecualikan area yang tumpang tindih dengan area yang disediakan 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.

Referensi lainnya

Untuk mempelajari navigasi gestur lebih lanjut, baca referensi tambahan berikut.

Entri blog

Video