Gesture Navigation — adalah sistem kontrol aplikasi mobile melalui gesture sentuh, yang telah menggantikan tombol hardware di sebagian besar smartphone modern. Menurut Android Developers (2024), navigasi gesture telah menjadi standar mulai dari Android 10, dan Apple beralih ke gesture sejak iPhone X pada 2017. Sistem ini mencakup swipe, pinch, double tap dan long press — setiap gesture memiliki tujuan tertentu dalam konteks layar. Memahami arsitektur navigasi gesture sangat penting untuk menciptakan antarmuka yang intuitif dan responsif.
Poin utama
Gesture Navigation — adalah metode interaksi pengguna dengan perangkat mobile melalui urutan sentuhan, gerakan, dan tekanan yang dikenali oleh layar sentuh. Berbeda dengan tombol tradisional, gesture tidak memiliki posisi tetap di layar dan dikenali berdasarkan pola gerakan: swipe dari tepi, pinch dengan dua jari, tekan lama.
Transisi ke navigasi gesture dimulai dengan iPhone X (2017), di mana Apple sepenuhnya menghilangkan tombol Home, menggantinya dengan swipe dari tepi bawah. Google mengikuti tren di Android 10 (2020), menawarkan pengguna pilihan: navigasi tiga tombol, navigasi dua tombol, dan navigasi gesture penuh. Menurut StatCounter (2025), lebih dari 75% perangkat Android dan 95% perangkat iOS menggunakan navigasi gesture.
Secara arsitektur, pengenalan gesture terdiri dari tiga tahap: Capture (menangkap peristiwa sentuh), Recognition (menentukan pola gerakan), dan Action (mengeksekusi tindakan yang ditentukan). Di tingkat sistem, Android dan iOS memiliki pemroses bawaan untuk gesture navigasi dasar — swipe kembali, pergi ke layar utama, membuka pengalih aplikasi. Pengembang hanya perlu mengintegrasikan gesture mereka dengan benar ke dalam sistem ini.
Semua gesture sentuh dapat dibagi menjadi tiga kategori berdasarkan tujuan dan cara pelaksanaannya. Setiap jenis memiliki aturan pemrosesan dan rekomendasi sendiri untuk digunakan dalam antarmuka.
Gesture navigasi mengontrol perpindahan antar layar: swipe dari tepi kiri untuk kembali (iOS), swipe ke atas untuk membuka pengalih aplikasi, swipe dari tepi bawah untuk kembali ke layar utama. Gesture ini diproses oleh sistem di tingkat Window dan tidak boleh bertentangan dengan gesture pengguna di dalam aplikasi.
Gesture manipulasi mengubah posisi, ukuran, atau orientasi objek di layar. Pinch (memperbesar dengan dua jari), Rotate (memutar), Pan (menyeret), Swipe (menggesek cepat untuk menggulir) — semua gesture ini diproses di tingkat View atau Composabale dan tidak memengaruhi navigasi sistem.
Gesture kontekstual mengaktifkan fungsi tambahan tanpa berpindah ke layar lain. Long press (tekan lama untuk menu kontekstual), Double tap (ketuk dua kali untuk like atau zoom), Edge swipe (gesek dari tepi untuk membuka Drawer). Gesture ini memerlukan implementasi yang paling hati-hati karena dapat tumpang tindih dengan gesture navigasi sistem.
| Jenis gesture | Contoh | Tingkat pemrosesan | Konflik dengan sistem |
|---|---|---|---|
| Navigasi | Swipe kembali | Window / System | Primer |
| Manipulasi | Pinch zoom | View | Tidak |
| Kontekstual | Long press | View | Mungkin |
Android SDK menyediakan sistem pemrosesan gesture bertingkat, mulai dari MotionEvent tingkat rendah hingga GestureDetector dan GestureOverlayView tingkat tinggi. Pemilihan tingkat yang tepat tergantung pada kompleksitas gesture dan kebutuhan kinerja.
GestureDetector — adalah kelas tingkat tinggi yang mengubah urutan MotionEvent menjadi gesture spesifik: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling. Pengembang menimpa metode yang diperlukan dari GestureDetector.SimpleOnGestureListener dan menerima peristiwa yang telah dikenali. GestureDetector direkomendasikan untuk semua gesture standar, kecuali zoom — untuk itu ada ScaleGestureDetector.
val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
override fun onFling(
e1: MotionEvent?, e2: MotionEvent,
velocityX: Float, velocityY: Float
): Boolean {
val deltaX = e2.x - (e1?.x ?: 0f)
return if (Math.abs(deltaX) > Math.abs(e2.y - (e1?.y ?: 0f))) {
if (deltaX > 0) onSwipeRight() else onSwipeLeft()
true
} else false
}
})
view.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event) }
TouchDelegate — mekanisme untuk memperluas area sentuh untuk View. Digunakan ketika elemen target lebih kecil dari ukuran sentuh minimum 48dp. Misalnya, tombol kecil “Tutup” di sudut layar mendapatkan TouchDelegate yang memperluas area sentuhnya tanpa mengubah ukuran yang terlihat. Google merekomendasikan TouchDelegate untuk semua elemen interaktif yang lebih kecil dari 48x48dp.
Compose menyediakan pengubah untuk pemrosesan gesture: clickable, draggable, swipeable, combinedClickable (untuk double tap dan long press). Secara internal, Compose menggunakan PointerInputScope untuk pemrosesan tingkat rendah, tetapi bagi sebagian besar pengembang, pengubah tingkat tinggi sudah cukup. Untuk gesture khusus, digunakan pointerInput dengan awaitPointerEvent.
iOS SDK menggunakan arsitektur UIGestureRecognizer — kelas dasar abstrak yang menganalisis urutan UITouch dan menentukan apakah itu sesuai dengan gesture yang dikenal. Apple merekomendasikan untuk menggunakan recognizer standar di mana pun memungkinkan, dan hanya untuk gesture unik membuat subkelas khusus.
UIKit menyediakan satu set recognizer siap pakai: UITapGestureRecognizer, UISwipeGestureRecognizer, UIPanGestureRecognizer, UIPinchGestureRecognizer, UIRotationGestureRecognizer, UILongPressGestureRecognizer. Setiap recognizer memiliki status (possible, began, changed, ended, cancelled, failed) — pengembang melacak status untuk bereaksi pada berbagai tahap gesture.
let swipeBack = UISwipeGestureRecognizer(
target: self,
action: #selector(handleSwipeBack)
)
swipeBack.direction = .right
view.addGestureRecognizer(swipeBack)
@objc func handleSwipeBack() {
navigationController?.popViewController(animated: true)
}
SwiftUI menggunakan pengubah gesture deklaratif, mirip dengan Compose: onTapGesture, onLongPressGesture, MagnificationGesture, RotationGesture, DragGesture. SwiftUI secara otomatis menangani konflik antar gesture melalui simultaneousGesture, sequencedGesture dan exclusiveGesture — pengubah yang menentukan prioritas gesture saat aktivasi bersamaan.
Image("photo")
.gesture(
MagnificationGesture()
.onChanged { scale in
self.currentScale = scale
}
.sequenced(before: DragGesture())
)
InteractivePopGestureRecognizer — recognizer sistem yang mengelola swipe kembali di UINavigationController. Secara default, ia aktif untuk semua layar kecuali layar root. Jika aplikasi Anda menggunakan NavigationBar khusus, interactivePopGestureRecognizer mungkin berhenti bekerja — diperlukan aktivasi terprogram melalui navigationController.interactivePopGestureRecognizer?.delegate.
Konflik gesture — salah satu masalah paling sulit dalam navigasi gesture. Ketika gesture pengguna (misalnya, membuka Drawer dengan swipe dari tepi kiri) tumpang tindih dengan gesture sistem (swipe kembali di iOS atau Android), sistem harus menentukan gesture mana yang memiliki prioritas. Penanganan konflik ini dengan benar sangat penting untuk UX.
Android 10+ memungkinkan aplikasi untuk menyediakan area layar untuk gesture-nya sendiri melalui WindowInsets. Gunakan ViewCompat.setSystemGestureExclusionRects untuk menunjukkan wilayah di mana gesture sistem tidak boleh berfungsi. Misalnya, untuk Drawer di kiri, Anda dapat mengecualikan tepi kiri layar (lebar hingga 200dp) dari swipe kembali sistem. Google menetapkan batas: hingga 200dp di setiap sisi dapat dikecualikan.
val exclusionRect = Rect(0, 0, 200, height)
ViewCompat.setSystemGestureExclusionRects(
drawerView,
listOf(SystemGestureExclusionRect(exclusionRect))
)
iOS menyediakan metode gestureRecognizerShouldBegin di UIGestureRecognizerDelegate, yang memungkinkan recognizer khusus untuk memutuskan apakah akan memulai pengenalan. Untuk swipe Drawer dari tepi kiri, Anda dapat memeriksa posisi sentuhan: jika pengguna menarik Drawer (jarak lebih besar dari threshold), gesture khusus mengambil alih kendali. Jika gesture tidak dikenali, sistem mengembalikan kendali ke InteractivePopGestureRecognizer.
Gesture Navigation memerlukan perancangan yang cermat, terutama pada perangkat dengan navigasi gesture sistem. Mari kita lihat kesalahan umum dan rekomendasi untuk mengatasinya.
Kesalahan paling umum — menempatkan elemen interaktif atau mengimplementasikan swipe khusus di zona gesture sistem (tepi kiri dan kanan, tepi bawah). Pengguna mencoba melakukan tindakan, tetapi sebaliknya navigasi sistem teraktivasi. Selalu sediakan ruang untuk gesture sistem dan tangani konflik melalui exclusion rects.
Parameter gesture (velocity threshold, minimum distance) secara default berbeda antar platform. Jika aplikasi Anda lintas platform, jangan menyalin parameter dari satu platform ke platform lain — uji setiap gesture secara terpisah di Android dan iOS. Flutter dan React Native secara otomatis menyesuaikan beberapa parameter, tetapi tidak semua.
Setiap gesture harus disertai dengan umpan balik visual: perubahan warna, transformasi, animasi. Pengguna harus memahami bahwa gesture telah dikenali dan tindakan sedang dijalankan. Di iOS, recognizer sistem secara otomatis memberikan umpan balik haptic, di Android harus ditambahkan melalui HapticFeedbackConstants.
Tidak semua pengguna dapat melakukan gesture — orang dengan keterbatasan motorik menggunakan VoiceOver dan TalkBack untuk navigasi. Untuk setiap gesture harus ada alternatif tombol. Google dan Apple mewajibkan semua tindakan gesture untuk diduplikasi oleh elemen kontrol yang dapat diakses.
Pertanyaan yang sering diajukan
iOS — Apple mengimplementasikan navigasi gesture dengan iPhone X pada 2017, menggantikan tombol Home dengan swipe dari tepi bawah. Android mengikuti contoh di Android 10 (2020), menawarkan gesture sebagai alternatif tombol.
Swipe — gerakan cepat dengan velocity tinggi (piksel/detik) dan terputus-putus. Scroll — gerakan lambat dengan velocity rendah dan terus-menerus. Gunakan velocityX/Y untuk membedakan: ambang batas biasanya 500-1000 px/s tergantung platform.
Tidak — Android dan iOS tidak mengizinkan aplikasi untuk menonaktifkan navigasi gesture sistem. Anda hanya dapat menyediakan area layar melalui exclusion rects (Android) atau gestureRecognizerShouldBegin (iOS).
Android Emulator mendukung multi-sentuh melalui Ctrl+klik (menambahkan jari kedua). iOS Simulator — melalui Option+klik untuk dua jari. Flutter test menggunakan WidgetTester.timedDrag untuk simulasi swipe dalam pengujian unit.
Gesture War — konflik antara dua recognizer ketika keduanya mencoba memproses satu sentuhan. Hindari melalui prioritas: di iOS gunakan require(toFail:), di Compose — sequentialGesture dan exclusiveGesture. Flutter menggunakan GestureArena untuk penyelesaian otomatis.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga