Gesture Navigation — bu zamonaviy smartfonlarning ko'pchiligida apparat tugmalarini almashtirgan, mobil ilovani sensor jestlar orqali boshqarish tizimidir. Android Developers (2024) ma'lumotlariga ko'ra, jest navigatsiyasi Android 10 dan boshlab standartga aylandi va Apple 2017 yilda iPhone X bilan jestlarga o'tdi. Tizimga swipe, pinch, double tap va long press kiradi — har bir jest ekran kontekstida ma'lum bir maqsadga ega. Tushunish jest navigatsiyasi arxitekturasini intuitiv va javob beruvchi interfeyslar yaratish uchun zarurdir.
Asosiy fikrlar
Gesture Navigation — foydalanuvchining mobil qurilma bilan sensor ekran tomonidan tanib olinadigan teginish, harakat va bosish ketma-ketliklari orqali o'zaro ta'sir qilish usulidir. An'anaviy tugmalardan farqli o'laroq, jestlar ekranda qattiq joylashuvga ega emas va ular harakat namunasiga ko'ra tanib olinadi: chekkadan surish, ikki barmoq bilan chimdik, uzoq bosish.
Jest navigatsiyasiga o'tish iPhone X bilan boshlandi (2017), Apple Home tugmasini butunlay olib tashlab, uni pastki chekkadan surish bilan almashtirdi. Google Android 10 da (2020) trendga ergashdi va foydalanuvchilarga tanlov taklif qildi: uch tugmali navigatsiya, ikki tugmali navigatsiya va to'liq jest navigatsiyasi. StatCounter (2025) ma'lumotlariga ko'ra, Android qurilmalarining 75% dan ortig'i va iOS qurilmalarining 95% i jest navigatsiyasidan foydalanadi.
Arxitektura nuqtai nazaridan jestni tanib olish uch bosqichdan iborat: Capture (sensor hodisalarini olish), Recognition (harakat namunasini aniqlash) va Action (belgilangan harakatni bajarish). Tizim darajasida Android va iOS asosiy navigatsion jestlar uchun o'rnatilgan ishlov beruvchilarga ega — orqaga surish, bosh ekranga o'tish, ilovalar almashtirgichini ochish. Dasturchi faqat o'z jestlarini ushbu tizimga to'g'ri integratsiya qilishi kerak.
Barcha sensor jestlar maqsad va bajarish usuliga ko'ra uch kategoriyaga bo'linishi mumkin. Har bir tur o'ziga xos ishlov berish qoidalari va interfeysda qo'llash bo'yicha tavsiyalarga ega.
Navigatsion jestlar ekranlar o'rtasida harakatlanishni boshqaradi: qaytish uchun chap chekkadan surish (iOS), ilovalar almashtirgichini ochish uchun yuqoriga surish, bosh ekranga qaytish uchun pastki chekkadan surish. Bu jestlar tizim tomonidan Window darajasida qayta ishlanadi va ilova ichidagi foydalanuvchi jestlari bilan ziddiyatga kelmasligi kerak.
Manipulyatsion jestlar ekrandagi ob'ektlarning joylashuvi, o'lchami yoki yo'nalishini o'zgartiradi. Pinch (ikki barmoq bilan masshtablash), Rotate (aylantirish), Pan (tortish), Swipe (tez surish) — bu jestlarning barchasi View yoki Composabale darajasida qayta ishlanadi va tizim navigatsiyasiga ta'sir qilmaydi.
Kontekstual jestlar boshqa ekranga o'tmasdan qo'shimcha funksiyalarni faollashtiradi. Long press (kontekst menyusi uchun uzoq bosish), Double tap (layk yoki masshtablash uchun ikki marta bosish), Edge swipe (Drawer ochish uchun chekkadan surish). Bu jestlar eng ehtiyotkorlik bilan amalga oshirishni talab qiladi, chunki ular tizim navigatsion jestlari bilan kesishishi mumkin.
| Jest turi | Misol | Ishlov berish darajasi | Tizim bilan ziddiyat |
|---|---|---|---|
| Navigatsion | Orqaga surish | Window / System | Birlamchi |
| Manipulyatsion | Pinch zoom | View | Yo'q |
| Kontekstual | Long press | View | Mumkin |
Android SDK past darajadagi MotionEvent dan yuqori darajadagi GestureDetector va GestureOverlayView gacha ko'p darajali jestlarni qayta ishlash tizimini taqdim etadi. Darajani to'g'ri tanlash jestning murakkabligi va ishlash talablariga bog'liq.
GestureDetector — MotionEvent ketma-ketligini aniq jestlarga aylantiruvchi yuqori darajadagi klass: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling. Dasturchi GestureDetector.SimpleOnGestureListener ning kerakli metodlarini bekor qiladi va tayyor tanib olingan hodisani oladi. GestureDetector masshtablashdan tashqari barcha standart jestlar uchun tavsiya etiladi — buning uchun ScaleGestureDetector mavjud.
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 — View uchun teginish maydonini kengaytirish mexanizmi. Maqsadli element minimal teginish oʻlchami 48dp dan kichik bo'lganda ishlatiladi. Masalan, ekran burchagidagi kichik „Yopish" tugmasi ko'rinadigan oʻlchamini oʻzgartirmasdan urish maydonini kengaytiruvchi TouchDelegate oladi. Google 48x48dp dan kichik barcha interaktiv elementlar uchun TouchDelegate ni tavsiya qiladi.
Compose jestlarni qayta ishlash uchun modifikatorlarni taqdim etadi: clickable, draggable, swipeable, combinedClickable (double tap va long press uchun). Ichki tomondan, Compose past darajadagi ishlov berish uchun PointerInputScope dan foydalanadi, lekin ko'pchilik dasturchilar uchun yuqori darajadagi modifikatorlar yetarli. Maxsus jestlar uchun pointerInput awaitPointerEvent bilan ishlatiladi.
iOS SDK UIGestureRecognizer arxitekturasidan foydalanadi — UITouch ketma-ketligini tahlil qiluvchi va ma'lum jestga mos kelishini aniqlovchi abstrakt asosiy klass. Apple imkon qadar standart recognizer lardan foydalanishni va faqat noyob jestlar uchun maxsus pastki klasslar yaratishni tavsiya qiladi.
UIKit tayyor recognizer lar to'plamini taqdim etadi: UITapGestureRecognizer, UISwipeGestureRecognizer, UIPanGestureRecognizer, UIPinchGestureRecognizer, UIRotationGestureRecognizer, UILongPressGestureRecognizer. Har bir recognizer holatlarga ega (possible, began, changed, ended, cancelled, failed) — dasturchi jestning turli bosqichlarida reaksiya berish uchun holatni kuzatadi.
let swipeBack = UISwipeGestureRecognizer(
target: self,
action: #selector(handleSwipeBack)
)
swipeBack.direction = .right
view.addGestureRecognizer(swipeBack)
@objc func handleSwipeBack() {
navigationController?.popViewController(animated: true)
}
SwiftUI Compose ga o'xshab deklarativ jest modifikatorlaridan foydalanadi: onTapGesture, onLongPressGesture, MagnificationGesture, RotationGesture, DragGesture. SwiftUI simultaneousGesture, sequencedGesture va exclusiveGesture orqali jestlar o'rtasidagi ziddiyatlarni avtomatik qayta ishlaydi — bir vaqtda faollashganda jestlarning ustuvorligini belgilovchi modifikatorlar.
Image("photo")
.gesture(
MagnificationGesture()
.onChanged { scale in
self.currentScale = scale
}
.sequenced(before: DragGesture())
)
InteractivePopGestureRecognizer — UINavigationController da orqaga surishni boshqaruvchi tizim recognizer i. Odatiy bo'lib, ildiz ekrandan tashqari barcha ekranlar uchun faol. Agar ilovangiz maxsus NavigationBar dan foydalansa, interactivePopGestureRecognizer ishlamay qolishi mumkin — navigationController.interactivePopGestureRecognizer?.delegate orqali dasturiy faollashtirish talab qilinadi.
Jest ziddiyati — jest navigatsiyasidagi eng qiyin muammolardan biridir. Foydalanuvchi jesti (masalan, chap chekkadan surish orqali Drawer ochish) tizim jesti bilan (iOS yoki Android da orqaga surish) bir-biriga to'g'ri kelganda, tizim qaysi jest ustuvorligini aniqlashi kerak. Ushbu ziddiyatni to'g'ri qayta ishlash UX uchun juda muhimdir.
Android 10+ ilovaga WindowInsets orqali oʻz jestlari uchun ekran maydonlarini rezerv qilishga imkon beradi. Tizim jestlari ishlamasligi kerak bo'lgan hududlarni ko'rsatish uchun ViewCompat.setSystemGestureExclusionRects dan foydalaning. Masalan, chap tomondagi Drawer uchun chap ekran chekkasini (kengligi 200dp gacha) tizim orqaga surishidan istisno qilishingiz mumkin. Google chegara belgilagan: har tomondan 200dp gacha istisno qilish mumkin.
val exclusionRect = Rect(0, 0, 200, height)
ViewCompat.setSystemGestureExclusionRects(
drawerView,
listOf(SystemGestureExclusionRect(exclusionRect))
)
iOS UIGestureRecognizerDelegate da gestureRecognizerShouldBegin metodini taqdim etadi, bu maxsus recognizerga tanib olishni boshlash kerakligi haqida qaror qabul qilish imkonini beradi. Chap chekkadan Drawer surish uchun teginish joyini tekshirish mumkin: agar foydalanuvchi Drawer ni tortsa (masofa threshold dan katta), maxsus jest boshqaruvni oladi. Agar jest tanib olinmasa, tizim boshqaruvni InteractivePopGestureRecognizerga qaytaradi.
Gesture Navigation diqqat bilan loyihalashni talab qiladi, ayniqsa tizim jest navigatsiyasiga ega qurilmalarda. Keng tarqalgan xatolar va ularni bartaraf etish bo'yicha tavsiyalarni ko'rib chiqaylik.
Eng keng tarqalgan xato — interaktiv elementlarni joylashtirish yoki tizim jest zonalarida (chap va o'ng chekkalar, pastki chekka) maxsus surishlarni amalga oshirish. Foydalanuvchi harakatni bajarishga urinadi, buning o'rniga tizim navigatsiyasi ishga tushadi. Har doim tizim jestlari uchun bo'shliqlarni nazarda tuting va ziddiyatlarni exclusion rects orqali qayta ishlang.
Jest parametrlari (velocity threshold, minimum distance) odatiy bo'lib platformalar orasida farqlanadi. Ilovangiz ko'p platformali bo'lsa, parametrlarni bir platformadan ikkinchisiga nusxalamang — har bir jestni Android va iOS da alohida sinab ko'ring. Flutter va React Native ba'zi parametrlarni avtomatik moslashtiradi, lekin hammasini emas.
Har bir jest vizual qayta aloqa bilan birga bo'lishi kerak: rang o'zgarishi, transformatsiya, animatsiya. Foydalanuvchi jestning tanib olinganligini va harakatning bajarilayotganligini tushunishi kerak. iOS da tizim recognizerlari avtomatik haptik feedback beradi, Android da uni HapticFeedbackConstants orqali qo'shish kerak.
Hamma foydalanuvchilar jestlarni bajara olmaydi — cheklangan motorikasi bo'lgan odamlar navigatsiya uchun VoiceOver va TalkBack dan foydalanadi. Har bir jest uchun tugma alternativi bo'lishi kerak. Google va Apple barcha jest harakatlarining foydalanish qulayligi uchun boshqaruv elementlari bilan takrorlanishini talab qiladi.
Tez-tez beriladigan savollar
iOS — Apple 2017 yilda iPhone X bilan jest navigatsiyasini joriy qildi, Home tugmasini pastki chekkadan surish bilan almashtirdi. Android 10 da (2020) misolga ergashdi, jestlarni tugmalarga muqobil sifatida taklif qildi.
Swip — yuqori velocity (piksel/s) bilan tez harakat va uzilishli. Scroll — past velocity bilan sekin harakat va uzluksiz. Farqlash uchun velocityX/Y dan foydalaning: chegara odatda platformaga qarab 500-1000 px/s ni tashkil qiladi.
Yo'q — Android va iOS ilovaga tizim jest navigatsiyasini o'chirishga ruxsat bermaydi. Siz faqat exclusion rects (Android) yoki gestureRecognizerShouldBegin (iOS) orqali ekran maydonlarini rezerv qilishingiz mumkin.
Android Emulator Ctrl+klik orqali multitouch ni qo'llab-quvvatlaydi (ikkinchi barmoq qo'shilishi). iOS Simulator — ikki barmoq uchun Option+klik. Flutter test unit testlarda swiplarni simulyatsiya qilish uchun WidgetTester.timedDrag dan foydalanadi.
Gesture War — ikki recognizer o'rtasidagi ziddiyat, ikkalasi ham bitta teginishni qayta ishlashga urinishganda. Ustuvorliklar orqali qoching: iOS da require(toFail:) dan foydalaning, Compose da — sequentialGesture va exclusiveGesture. Flutter avtomatik hal qilish uchun GestureArena dan foydalanadi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.