اشاروں سے نیویگیشن ایک موبائل ایپلیکیشن کو ٹچ اشاروں کے ذریعے کنٹرول کرنے کا نظام ہے، جس نے زیادہ تر جدید اسمارٹ فونز پر ہارڈویئر بٹنوں کی جگہ لے لی ہے۔ Android Developers (2024) کے مطابق، Android 10 سے شروع ہو کر اشاروں سے نیویگیشن معیار بن گیا، جبکہ Apple نے 2017 میں iPhone X کے ساتھ اشاروں پر سوئچ کیا۔ سسٹم میں سوائپ، پنچ، ڈبل ٹیپ اور لانگ پریس شامل ہیں — ہر اشارے کا اسکرین کے سیاق و سباق میں ایک مخصوص مقصد ہوتا ہے۔ سمجھنا اشاروں سے نیویگیشن کے فن تعمیر کو سمجھنا بدیہی اور جوابدہ انٹرفیس بنانے کے لیے ضروری ہے۔
اہم نکات
اشاروں سے نیویگیشن ایک موبائل ڈیوائس کے ساتھ صارف کے تعامل کا ایک طریقہ ہے جو ٹچ اسکرین کے ذریعے پہچانے جانے والے چھونے، حرکت اور دبانے کی ترتیب کے ذریعے کام کرتا ہے۔ روایتی بٹنوں کے برعکس، اشاروں کی اسکرین پر کوئی مقررہ پوزیشن نہیں ہوتی اور وہ حرکت کے نمونوں سے پہچانے جاتے ہیں: کنارے سے سوائپ، دو انگلیوں سے پنچ، لانگ پریس۔
اشاروں سے نیویگیشن میں منتقلی iPhone X سے شروع ہوئی (2017)، جہاں Apple نے ہوم بٹن کو مکمل طور پر ہٹا دیا، اس کی جگہ نیچے کے کنارے سے سوائپ رکھ دیا۔ Google نے Android 10 (2020) میں اس رجحان کی پیروی کی، صارفین کو انتخاب فراہم کیا: تین بٹنوں والی نیویگیشن، دو بٹنوں والی نیویگیشن اور مکمل اشاروں سے نیویگیشن۔ StatCounter (2025) کے مطابق، Android ڈیوائسز کا 75% سے زیادہ اور iOS ڈیوائسز کا 95% اشاروں سے نیویگیشن استعمال کرتا ہے۔
فن تعمیر کے لحاظ سے، اشاروں کی پہچان تین مراحل پر مشتمل ہے: کیپچر (ٹچ ایونٹس کو پکڑنا)، پہچان (حرکت کے نمونے کی شناخت) اور عمل (مقرر کردہ عمل کو انجام دینا)۔ سسٹم کی سطح پر، Android اور iOS میں بنیادی نیویگیشن اشاروں کے لیے بلٹ ان ہینڈلر موجود ہیں — واپس سوائپ، ہوم اسکرین پر جانا، ایپ سویچر کھولنا۔ ڈویلپر کو صرف اپنے اشاروں کو اس سسٹم میں صحیح طریقے سے ضم کرنے کی ضرورت ہے۔
تمام ٹچ اشاروں کو مقصد اور طریقہ کار کی بنیاد پر تین زمروں میں تقسیم کیا جا سکتا ہے۔ ہر قسم کے اپنے پروسیسنگ قواعد اور انٹرفیس میں استعمال کے لیے سفارشات ہیں۔
نیویگیشن اشارے اسکرینوں کے درمیان حرکت کو کنٹرول کرتے ہیں: واپس جانے کے لیے بائیں کنارے سے سوائپ (iOS)، ایپ سویچر کھولنے کے لیے اوپر سوائپ، ہوم اسکرین پر واپس آنے کے لیے نیچے کے کنارے سے سوائپ۔ یہ اشارے ونڈو کی سطح پر سسٹم کے ذریعے پروسیس کیے جاتے ہیں اور ایپ کے اندر کسٹم اشاروں سے تصادم نہیں کرنا چاہیے۔
مینیپولیشن اشارے اسکرین پر موجود اشیاء کی پوزیشن، سائز یا سمت کو تبدیل کرتے ہیں۔ پنچ (دو انگلیوں سے زوم)، گھماؤ، پین (گھسیٹنا)، سوائپ (تیز سوائپ) — یہ تمام اشارے View یا Composable کی سطح پر پروسیس کیے جاتے ہیں اور سسٹم نیویگیشن کو متاثر نہیں کرتے۔
سیاقی اشارے دوسری اسکرین پر جانے کے بغیر اضافی افعال کو فعال کرتے ہیں۔ لانگ پریس (سیاقی مینو کے لیے)، ڈبل ٹیپ (لائک یا زوم کے لیے)، ایج سوائپ (Drawer کھولنے کے لیے)۔ ان اشاروں کو سب سے زیادہ محتاط نفاذ کی ضرورت ہوتی ہے کیونکہ یہ سسٹم نیویگیشن اشاروں کے ساتھ اوورلیپ ہو سکتے ہیں۔
| اشارے کی قسم | مثال | پروسیسنگ کی سطح | سسٹم تصادم |
|---|---|---|---|
| نیویگیشن | واپس سوائپ | ونڈو / سسٹم | بنیادی |
| مینیپولیشن | پنچ زوم | View | نہیں |
| سیاقی | لانگ پریس | View | ممکن |
Android SDK ایک کثیر سطحی اشاروں کی پروسیسنگ کا نظام فراہم کرتا ہے، جو نچلی سطح کے MotionEvent سے لے کر اعلیٰ سطح کے GestureDetector اور GestureOverlayView تک ہے۔ صحیح سطح کا انتخاب اشارے کی پیچیدگی اور کارکردگی کی ضروریات پر منحصر ہے۔
GestureDetector ایک اعلیٰ سطح کی کلاس ہے جو MotionEvent کی ترتیب کو مخصوص اشاروں میں تبدیل کرتی ہے: onDown، onShowPress، onSingleTapUp، onScroll، onLongPress، onFling۔ ڈویلپر GestureDetector.SimpleOnGestureListener کے مطلوبہ طریقوں کو اووررائیڈ کرتا ہے اور ایک تیار پہچانا ہوا ایونٹ حاصل کرتا ہے۔ GestureDetector اسکیلنگ کے علاوہ تمام معیاری اشاروں کے لیے تجویز کیا جاتا ہے — اس کے لیے 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 ایک View کے ٹچ ایریا کو بڑھانے کا ایک طریقہ کار ہے۔ یہ اس وقت استعمال ہوتا ہے جب ہدف عنصر کم از کم ٹچ سائز 48dp سے چھوٹا ہو۔ مثال کے طور پر، اسکرین کے کونے میں ایک چھوٹا "بند کریں" بٹن ایک TouchDelegate حاصل کرتا ہے جو دکھائی دینے والے سائز کو تبدیل کیے بغیر اس کے ہٹ ایریا کو بڑھاتا ہے۔ Google 48x48dp سے چھوٹے تمام انٹرایکٹو عناصر کے لیے TouchDelegate تجویز کرتا ہے۔
Compose اشاروں کو سنبھالنے کے لیے موڈیفائر فراہم کرتا ہے: clickable، draggable، swipeable، combinedClickable (ڈبل ٹیپ اور لانگ پریس کے لیے)۔ اندرونی طور پر، Compose نچلی سطح کی پروسیسنگ کے لیے PointerInputScope استعمال کرتا ہے، لیکن زیادہ تر ڈویلپرز کو صرف اعلیٰ سطح کے موڈیفائر کی ضرورت ہوتی ہے۔ کسٹم اشاروں کے لیے awaitPointerEvent کے ساتھ pointerInput استعمال کریں۔
iOS SDK UIGestureRecognizer فن تعمیر کا استعمال کرتا ہے — ایک خلاصی بنیادی کلاس جو UITouch کی ترتیب کا تجزیہ کرتی ہے اور تعین کرتی ہے کہ آیا یہ کسی معروف اشارے سے مطابقت رکھتا ہے۔ Apple جہاں ممکن ہو معیاری پہچان کنندگان استعمال کرنے اور صرف منفرد اشاروں کے لیے کسٹم ذیلی کلاسز بنانے کی تجویز کرتا ہے۔
UIKit تیار پہچان کنندگان کا ایک سیٹ فراہم کرتا ہے: UITapGestureRecognizer، UISwipeGestureRecognizer، UIPanGestureRecognizer، UIPinchGestureRecognizer، UIRotationGestureRecognizer، UILongPressGestureRecognizer۔ ہر پہچان کنندہ کی حالتیں ہوتی ہیں (possible، began، changed، ended، cancelled، failed) — ڈویلپر اشارے کے مختلف مراحل میں رد عمل ظاہر کرنے کے لیے حالت کو ٹریک کرتا ہے۔
let swipeBack = UISwipeGestureRecognizer(
target: self,
action: #selector(handleSwipeBack)
)
swipeBack.direction = .right
view.addGestureRecognizer(swipeBack)
@objc func handleSwipeBack() {
navigationController?.popViewController(animated: true)
}
SwiftUI Compose کی طرح اعلانیہ اشاروں کے موڈیفائر استعمال کرتا ہے: onTapGesture، onLongPressGesture، MagnificationGesture، RotationGesture، DragGesture۔ SwiftUI simultaneousGesture، sequencedGesture اور exclusiveGesture کے ذریعے اشاروں کے درمیان تصادم کو خود بخود سنبھالتا ہے — موڈیفائر جو بیک وقت متحرک ہونے پر اشارے کی ترجیح کا تعین کرتے ہیں۔
Image("photo")
.gesture(
MagnificationGesture()
.onChanged { scale in
self.currentScale = scale
}
.sequenced(before: DragGesture())
)
InteractivePopGestureRecognizer ایک سسٹم پہچان کنندہ ہے جو UINavigationController میں واپس سوائپ اشارے کو کنٹرول کرتا ہے۔ ڈیفالٹ کے طور پر، یہ روٹ کے علاوہ تمام اسکرینوں کے لیے فعال ہے۔ اگر آپ کی ایپ کسٹم NavigationBar استعمال کرتی ہے، تو interactivePopGestureRecognizer کام کرنا بند کر سکتا ہے — اسے navigationController.interactivePopGestureRecognizer?.delegate کے ذریعے پروگراماتی طور پر فعال کرنے کی ضرورت ہوگی۔
اشاروں کا تصادم اشاروں سے نیویگیشن میں سب سے مشکل مسائل میں سے ایک ہے۔ جب ایک کسٹم اشارہ (مثال کے طور پر، بائیں کنارے سے سوائپ کر کے Drawer کھولنا) سسٹم کے اشارے (iOS یا Android پر واپس سوائپ) سے مطابقت رکھتا ہے، تو سسٹم کو تعین کرنا ہوتا ہے کہ کس اشارے کی ترجیح ہے۔ اس تصادم کو صحیح طریقے سے سنبھالنا صارف کے تجربے کے لیے اہم ہے۔
Android 10+ ایپ کو WindowInsets کے ذریعے اپنے اشاروں کے لیے اسکرین کے علاقے محفوظ کرنے کی اجازت دیتا ہے۔ ViewCompat.setSystemGestureExclusionRects کا استعمال کرتے ہوئے ان علاقوں کی وضاحت کریں جہاں سسٹم کے اشارے متحرک نہیں ہونے چاہئیں۔ مثال کے طور پر، بائیں جانب Drawer کے لیے، آپ اسکرین کے بائیں کنارے (200dp چوڑائی تک) کو سسٹم کے واپس سوائپ سے خارج کر سکتے ہیں۔ Google نے ایک حد مقرر کی ہے: ہر طرف 200dp تک خارج کیا جا سکتا ہے۔
val exclusionRect = Rect(0, 0, 200, height)
ViewCompat.setSystemGestureExclusionRects(
drawerView,
listOf(SystemGestureExclusionRect(exclusionRect))
)
iOS UIGestureRecognizerDelegate میں gestureRecognizerShouldBegin طریقہ فراہم کرتا ہے، جو کسٹم پہچان کنندہ کو یہ فیصلہ کرنے کی اجازت دیتا ہے کہ آیا اسے پہچان شروع کرنی چاہیے۔ بائیں کنارے سے Drawer سوائپ کے لیے، آپ ٹچ کی پوزیشن چیک کر سکتے ہیں: اگر صارف Drawer کو گھسیٹ رہا ہے (فاصلہ حد سے زیادہ ہے)، کسٹم اشارہ کنٹرول لے لیتا ہے۔ اگر اشارہ پہچانا نہیں جاتا، سسٹم InteractivePopGestureRecognizer کو کنٹرول واپس دے دیتا ہے۔
اشاروں سے نیویگیشن کے لیے محتاط ڈیزائن کی ضرورت ہوتی ہے، خاص طور پر سسٹم اشاروں والے آلات پر۔ آئیے عام غلطیوں اور ان کو دور کرنے کی سفارشات پر نظر ڈالتے ہیں۔
سب سے عام غلطی سسٹم اشاروں والے علاقوں (بائیں اور دائیں کنارے، نیچے کا کنارہ) میں انٹرایکٹو عناصر رکھنا یا کسٹم سوائپ لاگو کرنا ہے۔ صارف ایک عمل کرنے کی کوشش کرتا ہے، لیکن اس کے بجائے سسٹم نیویگیشن متحرک ہو جاتی ہے۔ ہمیشہ سسٹم اشاروں کے لیے مارجن فراہم کریں اور exclusion rects کے ذریعے تصادم کو سنبھالیں۔
اشاروں کے پیرامیٹرز (رفتار کی حد، کم از کم فاصلہ) ڈیفالٹ طور پر پلیٹ فارمز کے درمیان مختلف ہوتے ہیں۔ اگر آپ کی ایپ کراس پلیٹ فارم ہے تو، ایک پلیٹ فارم سے دوسرے پر پیرامیٹرز کاپی نہ کریں — ہر اشارے کو Android اور iOS پر الگ الگ جانچیں۔ Flutter اور React Native خود بخود کچھ پیرامیٹرز کو ڈھال لیتے ہیں، لیکن سب کو نہیں۔
ہر اشارہ بصری فیڈ بیک کے ساتھ ہونا چاہیے: رنگ کی تبدیلی، تبدیلی، اینیمیشن۔ صارف کو سمجھنا چاہیے کہ اشارہ پہچان لیا گیا اور عمل انجام دیا جا رہا ہے۔ iOS پر، سسٹم پہچان کنندگان خود بخود ہپٹک فیڈ بیک فراہم کرتے ہیں؛ Android پر اسے HapticFeedbackConstants کے ذریعے شامل کرنے کی ضرورت ہے۔
تمام صارف اشارے انجام نہیں دے سکتے — محدود موٹر مہارت والے لوگ نیویگیشن کے لیے VoiceOver اور TalkBack استعمال کرتے ہیں۔ ہر اشارے کے لیے ایک بٹن کا متبادل ہونا چاہیے۔ Google اور Apple تقاضا کرتے ہیں کہ تمام اشاروں کی کارروائیوں کو رسائی کے لیے دستیاب کنٹرولز کے ساتھ نقل کیا جائے۔
اکثر پوچھے گئے سوالات
iOS — Apple نے 2017 میں iPhone X کے ساتھ اشاروں سے نیویگیشن متعارف کرائی، ہوم بٹن کو نیچے کے کنارے سے سوائپ سے تبدیل کر دیا۔ Android نے Android 10 (2020) میں اس مثال کی پیروی کی، بٹنوں کے متبادل کے طور پر اشارے پیش کیے۔
سوائپ تیز رفتار (px/s) کے ساتھ ایک تیز حرکت ہے اور وقفے والی ہے۔ اسکرول کم رفتار کے ساتھ ایک سست حرکت ہے اور مسلسل ہے۔ فرق کرنے کے لیے velocityX/Y استعمال کریں: حد عام طور پر پلیٹ فارم کے لحاظ سے 500—1000 px/s ہوتی ہے۔
نہیں — Android اور iOS کسی ایپ کو سسٹم اشاروں سے نیویگیشن غیر فعال کرنے کی اجازت نہیں دیتے۔ آپ صرف exclusion rects (Android) یا gestureRecognizerShouldBegin (iOS) کے ذریعے اسکرین کے علاقے محفوظ کر سکتے ہیں۔
Android Emulator Ctrl+کلک کے ذریعے ملٹی ٹچ کو سپورٹ کرتا ہے (دوسری انگلی شامل کرنا)۔ iOS Simulator دو انگلیوں کے لیے Option+کلک استعمال کرتا ہے۔ Flutter test یونٹ ٹیسٹ میں سوائپ کی نقل کرنے کے لیے WidgetTester.timedDrag استعمال کرتا ہے۔
اشاروں کی جنگ (Gesture War) دو پہچان کنندگان کے درمیان تصادم ہے جب دونوں ایک ہی ٹچ کو پروسیس کرنے کی کوشش کرتے ہیں۔ ترجیحات کے ذریعے روکیں: iOS میں require(toFail:) استعمال کریں، Compose میں sequentialGesture اور exclusiveGesture استعمال کریں۔ Flutter خودکار حل کے لیے GestureArena استعمال کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں