জেসচার নেভিগেশন হল একটি মোবাইল অ্যাপ্লিকেশনকে স্পর্শ জেসচারের মাধ্যমে নিয়ন্ত্রণ করার পদ্ধতি, যা অধিকাংশ আধুনিক স্মার্টফোনে হার্ডওয়্যার বাটন প্রতিস্থাপন করেছে। Android Developers (2024)-এর মতে, Android 10 থেকে শুরু করে জেসচার নেভিগেশন মানক হয়ে গেছে, যখন Apple 2017 সালে iPhone X-এর মাধ্যমে জেসচারে স্থানান্তরিত হয়। সিস্টেমে সোয়াইপ, পিঞ্চ, ডাবল ট্যাপ এবং লং প্রেস অন্তর্ভুক্ত — প্রতিটি জেসচারের স্ক্রিনের প্রসঙ্গে একটি নির্দিষ্ট উদ্দেশ্য থাকে। বোঝা জেসচার নেভিগেশনের আর্কিটেকচার স্বজ্ঞাত এবং প্রতিক্রিয়াশীল ইন্টারফেস তৈরির জন্য অপরিহার্য।
মূল বিষয়
জেসচার নেভিগেশন হল একটি মোবাইল ডিভাইসের সাথে ব্যবহারকারীর মিথস্ক্রিয়ার একটি পদ্ধতি যা টাচ স্ক্রিন দ্বারা স্বীকৃত স্পর্শ, চলাচল এবং চাপের ক্রমগুলির মাধ্যমে কাজ করে। ঐতিহ্যবাহী বাটনের বিপরীতে, জেসচারগুলির স্ক্রিনে কোনো নির্দিষ্ট অবস্থান থাকে না এবং এগুলি চলাচলের প্যাটার্ন দ্বারা স্বীকৃত হয়: কিনারা থেকে সোয়াইপ, দুই আঙুল দিয়ে পিঞ্চ, লং প্রেস।
জেসচার নেভিগেশনে রূপান্তর iPhone X দিয়ে শুরু হয়েছিল (2017), যেখানে Apple হোম বাটন সম্পূর্ণরূপে সরিয়ে ফেলে, এটিকে নিচের কিনারা থেকে সোয়াইপ দিয়ে প্রতিস্থাপন করে। Google Android 10 (2020)-এ এই প্রবণতা অনুসরণ করে, ব্যবহারকারীদের পছন্দ প্রদান করে: তিন-বাটন নেভিগেশন, দুই-বাটন নেভিগেশন এবং পূর্ণ জেসচার নেভিগেশন। StatCounter (2025) অনুসারে, 75% এর বেশি Android ডিভাইস এবং 95% iOS ডিভাইস জেসচার নেভিগেশন ব্যবহার করে।
স্থাপত্যগতভাবে, জেসচার শনাক্তকরণ তিনটি পর্যায় নিয়ে গঠিত: ক্যাপচার (স্পর্শ ইভেন্ট ক্যাপচার করা), শনাক্তকরণ (চলাচলের প্যাটার্ন চিহ্নিত করা) এবং অ্যাকশন (নির্ধারিত কাজ সম্পাদন করা)। সিস্টেম স্তরে, Android এবং iOS-এ মৌলিক নেভিগেশন জেসচারের জন্য অন্তর্নির্মিত হ্যান্ডলার রয়েছে — সোয়াইপ ব্যাক, হোম স্ক্রিনে যাওয়া, অ্যাপ সুইচার খোলা। ডেভেলপারকে শুধুমাত্র তার নিজস্ব জেসচারগুলিকে এই সিস্টেমে সঠিকভাবে সংহত করতে হবে।
সব স্পর্শ জেসচারকে উদ্দেশ্য এবং নির্বাহ পদ্ধতির ভিত্তিতে তিনটি বিভাগে ভাগ করা যায়। প্রতিটি প্রকারের নিজস্ব প্রক্রিয়াকরণ নিয়ম এবং ইন্টারফেসে ব্যবহারের জন্য সুপারিশ রয়েছে।
নেভিগেশন জেসচার স্ক্রিনের মধ্যে চলাচল নিয়ন্ত্রণ করে: ফিরে যেতে বাম কিনারা থেকে সোয়াইপ (iOS), অ্যাপ সুইচার খুলতে উপরে সোয়াইপ, হোম স্ক্রিনে ফিরতে নিচের কিনারা থেকে সোয়াইপ। এই জেসচারগুলি উইন্ডো স্তরে সিস্টেম দ্বারা পরিচালিত হয় এবং অ্যাপের ভিতরে কাস্টম জেসচারের সাথে দ্বন্দ্ব করা উচিত নয়।
ম্যানিপুলেশন জেসচার স্ক্রিন上的 অবজেক্টের অবস্থান, আকার বা অভিমুখ পরিবর্তন করে। পিঞ্চ (দুই-আঙুলের জুম), রোটেট (ঘূর্ণন), প্যান (টেনে আনা), সোয়াইপ (দ্রুত সোয়াইপ) — এই সব জেসচার View বা Composable স্তরে পরিচালিত হয় এবং সিস্টেম নেভিগেশনকে প্রভাবিত করে না।
প্রাসঙ্গিক জেসচার অন্য স্ক্রিনে নেভিগেট না করেই অতিরিক্ত ফাংশন সক্রিয় করে। লং প্রেস (প্রসঙ্গ মেনুর জন্য), ডাবল ট্যাপ (লাইক বা জুমের জন্য), এজ সোয়াইপ (Drawer খোলার জন্য)। এই জেসচারগুলির সবচেয়ে সতর্ক বাস্তবায়ন প্রয়োজন কারণ এগুলি সিস্টেম নেভিগেশন জেসচারের সাথে ওভারল্যাপ হতে পারে।
| জেসচারের প্রকার | উদাহরণ | প্রক্রিয়াকরণ স্তর | সিস্টেমের সাথে দ্বন্দ্ব |
|---|---|---|---|
| নেভিগেশন | সোয়াইপ ব্যাক | Window / সিস্টেম | প্রাথমিক |
| ম্যানিপুলেশন | পিঞ্চ জুম | 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)-এ উদাহরণ অনুসরণ করে, বাটনের বিকল্প হিসাবে জেসচার প্রদান করে।
সোয়াইপ উচ্চ বেগ (পিক্সেল/সেকেন্ড) সহ একটি দ্রুত গতি এবং বিরতি সহ হয়। স্ক্রল কম বেগ সহ একটি ধীর গতি এবং অবিরাম। পার্থক্য করতে 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন