Gesture Navigation — müasir smartfonların əksəriyyətində aparat düymələrini əvəz edən, mobil tətbiqi sensor jestlər vasitəsilə idarə etmə sistemidir. Android Developers (2024) məlumatına görə, jest naviqasiyası Android 10-dan etibarən standart halına gəldi və Apple 2017-ci ildə iPhone X ilə jestlərə keçdi. Sistem swipe, pinch, double tap və long press daxildir — hər jestin ekran kontekstində müəyyən təyinatı var. Anlamaq jest naviqasiyasının arxitekturasını intuitiv və cavabdeh interfeyslər yaratmaq üçün vacibdir.
Əsas məqamlar
Gesture Navigation — istifadəçinin mobil cihazla sensor ekran tərəfindən tanınan toxunma, hərəkət və basma ardıcıllıqları vasitəsilə qarşılıqlı əlaqə metodudur. Ənənəvi düymələrdən fərqli olaraq, jestlərin ekranda sabit mövqeyi yoxdur və onlar hərəkət nümunəsinə görə tanınır: kənardan sürüşdürmə, iki barmaqla çimdik, uzun basma.
Jest naviqasiyasına keçid iPhone X ilə başladı (2017), Apple Home düyməsini tamamilə çıxararaq onu aşağı kənardan sürüşdürmə ilə əvəz etdi. Google Android 10-da (2020) trendi izlədi və istifadəçilərə seçim təklif etdi: üç düyməli naviqasiya, iki düyməli naviqasiya və tam jest naviqasiyası. StatCounter (2025) məlumatına görə, Android cihazlarının 75%-dən çoxu və iOS cihazlarının 95%-i jest naviqasiyasından istifadə edir.
Arxitektura baxımından jest tanınması üç mərhələdən ibarətdir: Capture (sensor hadisələrinin ələ keçirilməsi), Recognition (hərəkət nümunəsinin müəyyən edilməsi) və Action (təyin edilmiş hərəkətin icrası). Sistem səviyyəsində Android və iOS əsas naviqasiya jestləri üçün daxili emalçılara malikdir — geri sürüşdürmə, əsas ekrana keçid, tətbiq dəyişdiricisinin açılması. Tərtibatçı yalnız öz jestlərini bu sistemə düzgün inteqrasiya etməlidir.
Bütün sensor jestlər məqsəd və icra üsuluna görə üç kateqoriyaya bölünə bilər. Hər növün öz emal qaydaları və interfeysdə tətbiq üçün tövsiyələri var.
Naviqasiya jestləri ekranlar arasında hərəkəti idarə edir: geri qayıtmaq üçün sol kənardan sürüşdürmə (iOS), tətbiq dəyişdiricisini açmaq üçün yuxarı sürüşdürmə, əsas ekrana qayıtmaq üçün aşağı kənardan sürüşdürmə. Bu jestlər sistem tərəfindən Window səviyyəsində emal edilir və tətbiq daxilində istifadəçi jestləri ilə ziddiyyət təşkil etməməlidir.
Manipulyasiya jestləri ekrandakı obyektlərin mövqeyini, ölçüsünü və ya oriyentasiyasını dəyişir. Pinch (iki barmaqla miqyaslama), Rotate (fırlatma), Pan (sürükləmə), Swipe (sürətli sürüşdürmə) — bütün bu jestlər View və ya Composabale səviyyəsində emal edilir və sistem naviqasiyasına təsir etmir.
Kontekstual jestlər başqa ekrana keçmədən əlavə funksiyaları aktivləşdirir. Long press (kontekst menyusu üçün uzun basma), Double tap (bəyənmə və ya miqyaslama üçün ikiqat basma), Edge swipe (Drawer açmaq üçün kənardan sürüşdürmə). Bu jestlər ən diqqətli tətbiq tələb edir, çünki sistem naviqasiya jestləri ilə kəsişə bilər.
| Jest növü | Nümunə | Emal səviyyəsi | Sistem konflikti |
|---|---|---|---|
| Naviqasiya | Geri sürüşdürmə | Window / System | Birincili |
| Manipulyasiya | Pinch zoom | View | Yox |
| Kontekstual | Long press | View | Mümkün |
Android SDK aşağı səviyyəli MotionEvent-dən yüksək səviyyəli GestureDetector və GestureOverlayView-ə qədər çoxsəviyyəli jest emal sistemi təmin edir. Səviyyənin düzgün seçimi jestin mürəkkəbliyindən və performans tələblərindən asılıdır.
GestureDetector — MotionEvent ardıcıllığını konkret jestlərə çevirən yüksək səviyyəli sinif: onDown, onShowPress, onSingleTapUp, onScroll, onLongPress, onFling. Tərtibatçı GestureDetector.SimpleOnGestureListener-in lazımi metodlarını ləğv edir və hazır tanınmış hadisəni alır. GestureDetector miqyaslamadan başqa bütün standart jestlər üçün tövsiyə olunur — bunun üçün ScaleGestureDetector var.
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 üçün toxunma sahəsini genişləndirmə mexanizmi. Hədəf element minimum toxunma ölçüsü 48dp-dən kiçik olduqda istifadə olunur. Məsələn, ekranın küncündəki kiçik „Bağla" düyməsi görünən ölçüsünü dəyişmədən vurma sahəsini genişləndirən TouchDelegate alır. Google 48x48dp-dən kiçik bütün interaktiv elementlər üçün TouchDelegate tövsiyə edir.
Compose jestlərin emalı üçün modifikatorlar təmin edir: clickable, draggable, swipeable, combinedClickable (double tap və long press üçün). Daxildə Compose aşağı səviyyəli emal üçün PointerInputScope istifadə edir, lakin tərtibatçıların əksəriyyətinə yüksək səviyyəli modifikatorlar kifayət edir. Xüsusi jestlər üçün pointerInput awaitPointerEvent ilə istifadə olunur.
iOS SDK UIGestureRecognizer arxitekturasından istifadə edir — UITouch ardıcıllığını təhlil edən və tanınmış jestə uyğun olub-olmadığını müəyyən edən abstrakt əsas sinif. Apple mümkün olan hər yerdə standart recognizer istifadə etməyi və yalnız unikal jestlər üçün xüsusi alt siniflər yaratmağı tövsiyə edir.
UIKit hazır recognizer dəsti təmin edir: UITapGestureRecognizer, UISwipeGestureRecognizer, UIPanGestureRecognizer, UIPinchGestureRecognizer, UIRotationGestureRecognizer, UILongPressGestureRecognizer. Hər recognizer-in vəziyyətləri var (possible, began, changed, ended, cancelled, failed) — tərtibatçı jestin müxtəlif mərhələlərində reaksiya vermək üçün vəziyyəti izləyir.
let swipeBack = UISwipeGestureRecognizer(
target: self,
action: #selector(handleSwipeBack)
)
swipeBack.direction = .right
view.addGestureRecognizer(swipeBack)
@objc func handleSwipeBack() {
navigationController?.popViewController(animated: true)
}
SwiftUI Compose kimi deklarativ jest modifikatorlarından istifadə edir: onTapGesture, onLongPressGesture, MagnificationGesture, RotationGesture, DragGesture. SwiftUI simultaneousGesture, sequencedGesture və exclusiveGesture vasitəsilə jestlər arasında konfliktləri avtomatik emal edir — eyni vaxtda işə düşmə zamanı jestlərin prioritetini təyin edən modifikatorlar.
Image("photo")
.gesture(
MagnificationGesture()
.onChanged { scale in
self.currentScale = scale
}
.sequenced(before: DragGesture())
)
InteractivePopGestureRecognizer — UINavigationController-da geri sürüşdürməni idarə edən sistem recognizer-i. Susmaya görə, kök ekrandan başqa bütün ekranlar üçün aktivdir. Tətbiqiniz xüsusi NavigationBar istifadə edərsə, interactivePopGestureRecognizer işləməyə bilər — navigationController.interactivePopGestureRecognizer?.delegate vasitəsilə proqram aktivasiyası tələb olunur.
Jest konflikti — jest naviqasiyasında ən çətin problemlərdən biridir. İstifadəçi jesti (məsələn, sol kənardan sürüşdürmə ilə Drawer açmaq) sistem jesti ilə (iOS və ya Android-də geri sürüşdürmə) üst-üstə düşdükdə, sistem hansı jestin prioritet olduğunu müəyyən etməlidir. Bu konfliktin düzgün emalı UX üçün kritikdir.
Android 10+ tətbiqə WindowInsets vasitəsilə öz jestləri üçün ekran sahələrini rezerv etməyə icazə verir. Sistem jestlərinin işləməməli olduğu bölgələri göstərmək üçün ViewCompat.setSystemGestureExclusionRects istifadə edin. Məsələn, sol tərəfdəki Drawer üçün sol ekran kənarını (en 200dp-ə qədər) sistem geri sürüşdürməsindən xaric edə bilərsiniz. Google limit təyin edib: hər tərəfdən 200dp-ə qədər xaric etmək olar.
val exclusionRect = Rect(0, 0, 200, height)
ViewCompat.setSystemGestureExclusionRects(
drawerView,
listOf(SystemGestureExclusionRect(exclusionRect))
)
iOS UIGestureRecognizerDelegate-də gestureRecognizerShouldBegin metodunu təmin edir ki, bu da xüsusi recognizer-ə tanımaya başlamalı olub-olmadığına qərar verməyə imkan verir. Sol kənardan Drawer sürüşdürməsi üçün toxunma mövqeyini yoxlamaq olar: istifadəçi Drawer-i çəkirsə (məsafə threshold-dan çox), xüsusi jest idarəni ələ keçirir. Jest tanınmazsa, sistem idarəni InteractivePopGestureRecognizer-ə qaytarır.
Gesture Navigation diqqətli dizayn tələb edir, xüsusən sistem jest naviqasiyası olan cihazlarda. Tez-tez rast gəlinən səhvləri və onların aradan qaldırılması üçün tövsiyələri nəzərdən keçirək.
Ən geniş yayılmış səhv — interaktiv elementlərin yerləşdirilməsi və ya sistem jest zonalarında (sol və sağ kənarlar, aşağı kənar) xüsusi sürüşdürmələrin tətbiqi. İstifadəçi hərəkət etməyə çalışır, əvəzində sistem naviqasiyası işə düşür. Həmişə sistem jestləri üçün boşluqlar nəzərdə tutun və konfliktləri exclusion rects vasitəsilə emal edin.
Jest parametrləri (velocity threshold, minimum distance) susmaya görə platformalar arasında fərqlənir. Tətbiqiniz çoxplatformalıdırsa, parametrləri bir platformadan digərinə köçürməyin — hər jesti Android və iOS-da ayrıca test edin. Flutter və React Native bəzi parametrləri avtomatik uyğunlaşdırır, lakin hamısını yox.
Hər jest vizual əks əlaqə ilə müşayiət olunmalıdır: rəng dəyişikliyi, transformasiya, animasiya. İstifadəçi jestin tanındığını və hərəkətin icra olunduğunu başa düşməlidir. iOS-da sistem recognizer avtomatik haptic feedback verir, Android-də onu HapticFeedbackConstants vasitəsilə əlavə etmək lazımdır.
Bütün istifadəçilər jestləri yerinə yetirə bilməz — məhdud motorikası olan insanlar naviqasiya üçün VoiceOver və TalkBack istifadə edir. Hər jest üçün düymə alternativi olmalıdır. Google və Apple bütün jest hərəkətlərinin əlçatanlıq üçün idarəetmə elementləri ilə təkrarlanmasını tələb edir.
Tez-tez verilən suallar
iOS — Apple 2017-ci ildə iPhone X ilə jest naviqasiyasını tətbiq etdi, Home düyməsini aşağı kənardan sürüşdürmə ilə əvəz etdi. Android 10-da (2020) nümunəni izlədi, jestləri düymələrə alternativ olaraq təklif etdi.
Swip — yüksək velocity (piksel/san) ilə sürətli hərəkət və fasiləlidir. Scroll — aşağı velocity ilə yavaş hərəkət və davamlıdır. Fərqləndirmək üçün velocityX/Y istifadə edin: hədd adətən platformadan asılı olaraq 500-1000 px/s təşkil edir.
Xeyr — Android və iOS tətbiqə sistem jest naviqasiyasını söndürməyə icazə vermir. Yalnız exclusion rects (Android) və ya gestureRecognizerShouldBegin (iOS) vasitəsilə ekran sahələrini rezerv edə bilərsiniz.
Android Emulator Ctrl+klik vasitəsilə multitouchu dəstəkləyir (ikinci barmağın əlavə edilməsi). iOS Simulator — iki barmaq üçün Option+klik. Flutter test vahid testlərdə swipləri simulyasiya etmək üçün WidgetTester.timedDrag istifadə edir.
Gesture War — iki recognizer arasında konflikt, hər ikisi bir toxunmanı emal etməyə çalışdıqda. Prioritetlər vasitəsilə qaçının: iOS-da require(toFail:) istifadə edin, Compose-da — sequentialGesture və exclusiveGesture. Flutter avtomatik həll üçün GestureArena istifadə edir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun