Navigasi gestur

Dimulai dengan Android 10 (level API 29), sistem Android mendukung navigasi berbasis gesture sepenuhnya. Ada dua hal yang harus dilakukan developer aplikasi untuk memastikan aplikasi mereka kompatibel dengan fitur ini:

  • Memperpanjang konten aplikasi dari ujung ke ujung.
  • Menangani gesture aplikasi yang saling bertentangan.

Konten aplikasi edge-to-edge

Untuk memanfaatkan ruang layar tambahan yang disediakan oleh bilah navigasi mengambang, Anda harus membuat beberapa perubahan pada aplikasi Anda.

Mengatur bilah sistem transparan

Anda dapat melakukan ini dengan menetapkan nilai-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>
Bilah navigasi transparan dengan tombol yang diaktifkan.

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

Ketika perangkat disetel menggunakan navigasi gesture, dan Anda membuat latar belakang bilah 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.

Mengatur flag visibilitas UI

Agar dapat menampilkan tampilan Anda edge-to-edge, aplikasi Anda harus memberi tahu sistem bahwa aplikasi tersebut dapat menangani tampilan seperti itu. Anda dapat melakukan ini 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);

Bersama-sama, flag-flag ini memberi tahu sistem bahwa aplikasi Anda harus ditata dengan layar penuh, dan seolah-olah bilah navigasi dan statusnya tidak ada. Untuk kejadian layar penuh tambahan, Anda juga dapat menyetel SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN, yang memungkinkan Anda untuk menggambar di belakang bilah status.

Jika Anda menggunakan kelas tampilan seperti CoordinatorLayout atau DrawerLayout yang secara otomatis menangani bilah status, flag SYSTEM_UI_FLAG_LAYOUT_STABLE dan SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN mungkin sudah ditetapkan. Juga, jika Anda menggunakan setSystemUiVisibility() untuk mengatur flag lain, seperti SYSTEM_UI_FLAG_IMMERSIVE, Anda harus berhati-hati bahwa flag lain itu tidak menimpa yang dirujuk di atas.

Meskipun aplikasi Anda menggunakan tampilan edge-to-edge, sistem masih menggunakan WindowInsets API untuk menunjukkan di mana bar sistem berada.

Mengkonsumsi inset secara manual

Jika aplikasi Anda menggunakan hierarki tampilan khusus, Anda mungkin perlu menggunakan inset jendela sistem secara manual. Anda biasanya melakukan ini 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 reguler untuk semua bilah sistem melalui getSystemWindowInsets(). Selain itu, Android 10 menambahkan metode berikut ke WindowInsets:

Menangani gesture aplikasi yang saling bertentangan

Model navigasi gesture mungkin bertentangan dengan gesture yang sebelumnya digunakan oleh developer aplikasi. Anda mungkin perlu menyesuaikan antarmuka pengguna aplikasi Anda sebagai hasilnya.

Konflik dengan gesture Kembali

Gerakan sistem baru untuk Kembali adalah sapuan ke dalam dari kiri atau tepi kanan layar. Ini dapat mengganggu elemen navigasi aplikasi di area tersebut. Untuk mempertahankan fungsionalitas elemen di tepi kiri dan kanan layar, Anda harus opt-out dari gesture Kembali secara selektif dengan menunjukkan pada sistem daerah mana yang perlu menerima input sentuhan. Anda dapat melakukan ini dengan mengirimkan List<Rect> ke View.setSystemGestureExclusionRects() API yang diperkenalkan di Android 10. Metode ini juga tersedia di ViewCompat pada androidx.core:core:1.1.0-dev01.

Sebagai 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 gesture Home/Quick Switch

Gerakan sistem baru untuk Home dan Quick Switch keduanya melibatkan gesekan di bagian bawah layar di ruang yang sebelumnya ditempati oleh bilah navigasi. Aplikasi tidak dapat opt-out dari gesture ini, karena aplikasi tersebut bisa bersama gesture Kembali.

Untuk mengurangi masalah ini, Android 10 memperkenalkan WindowInsets.getMandatorySystemGestureInsets() API, yang menginformasikan aplikasi tentang ambang batas pengenalan sentuhan.

Game dan aplikasi non-Tampilan lainnya

Game dan aplikasi lain yang tidak memiliki hierarki tampilan sering mengharuskan pengguna untuk mengusap di dekat area gesture sistem. Dalam kasus tersebut, game dapat menggunakan Window.setSystemGestureExclusionRects() untuk mengecualikan area yang tumpang tindih dengan area yang disediakan untuk gesture sistem. Game harus memastikan untuk hanya mengecualikan area ini bila perlu, seperti saat bermain game.

Jika sebuah game mengharuskan pengguna untuk mengusap di dekat area gesture beranda, aplikasi dapat meminta ditata dalam mode imersif. Ini menonaktifkan gesture sistem saat pengguna berinteraksi dengan game, tetapi memungkinkan pengguna untuk mengaktifkan kembali gesture sistem dengan mengusap dari bagian bawah layar.

Sumber daya tambahan

Untuk mempelajari lebih lanjut tentang navigasi gesture, baca sumber daya tambahan berikut.

Postingan blog

Video