মাল্টি-টাচ জেসচার হল যখন একাধিক পয়েন্টার (আঙুল) একই সময়ে স্ক্রিনে ট্যাপ করে। এই ডকুমেন্ট থেকে জানা যাবে যে একাধিক পয়েন্টার ব্যবহার করে কীভাবে জেসচার শনাক্ত করা যায়।
একাধিক পয়েন্টার ট্র্যাক করুন
একাধিক পয়েন্টার একই সময়ে স্ক্রিনে ট্যাপ করলে, সিস্টেম নিম্নলিখিত টাচ ইভেন্ট তৈরি করে:
ACTION_DOWN: প্রথম পয়েন্টার স্ক্রিনে ট্যাপ করলে পাঠানো হয়। এটি জেসচার শুরু করে। এই পয়েন্টারের জন্য পয়েন্টার ডেটা সবসময়MotionEvent-এর0ইনডেক্সে থাকে।ACTION_POINTER_DOWN: প্রথমটির পরে অতিরিক্ত পয়েন্টার স্ক্রিনে প্রবেশ করলে পাঠানো হয়।getActionIndex()ব্যবহার করে আপনি সেই পয়েন্টারের ইন্ডেক্স পেতে পারেন যেটি এইমাত্র নিচে নেমে গেছে।ACTION_MOVE: যেকোনও সংখ্যক পয়েন্টার সহ কোনও জেসচারে পরিবর্তন হলে পাঠানো হয়।ACTION_POINTER_UP: নন-প্রাইমারি পয়েন্টার উপরে গেলে পাঠানো হয়।getActionIndex()ব্যবহার করে আপনি সেই পয়েন্টারের ইনডেক্স পেতে পারেন যেটি এইমাত্র উপরে গেছে।ACTION_UP: শেষ পয়েন্টার স্ক্রিন থেকে চলে গেলে পাঠানো হয়।ACTION_CANCEL: সব পয়েন্টার সহ সম্পূর্ণ জেসচার বাতিল করা হয়েছে বলে দেখায়।
শুরু ও শেষ করার জেসচার
জেসচার হল ইভেন্টের একটি সিরিজ যা ACTION_DOWN
ইভেন্ট দিয়ে শুরু হয় এবং ACTION_UP অথবা
ACTION_CANCEL ইভেন্ট দিয়ে শেষ হয়। একবারে একটিই অ্যাক্টিভ জেসচার থাকে। DOWN, MOVE, UP এবং CANCEL অ্যাকশনগুলি সম্পূর্ণ জেসচারের ক্ষেত্রে প্রযোজ্য। যেমন, ACTION_MOVE সহ কোনও ইভেন্ট
সেই মুহূর্তে সব পয়েন্টার নিচের দিকে
সরানোর ইঙ্গিত দিতে পারে।
পয়েন্টার ট্র্যাক করুন
MotionEvent-এর মধ্যে প্রতিটি পয়েন্টারের পজিশন ট্র্যাক করতে পয়েন্টারের ইন্ডেক্স ও আইডি ব্যবহার করুন।
- ইনডেক্স: একটি
MotionEventঅ্যারেতে পয়েন্টার তথ্য স্টোর করে। পয়েন্টারের ইনডেক্স হল এই অ্যারের মধ্যে এর অবস্থান। বেশিরভাগMotionEventপদ্ধতি পয়েন্টার আইডির পরিবর্তে পয়েন্টার ইনডেক্সকে প্যারামিটার হিসেবে গ্রহণ করে। - ID: প্রতিটি পয়েন্টারের একটি ID ম্যাপিংও থাকে যা টাচ ইভেন্ট জুড়ে থাকে যাতে সম্পূর্ণ জেসচার জুড়ে একটি স্বতন্ত্র পয়েন্টার ট্র্যাক করা যায়।
কোনও মোশন ইভেন্টের মধ্যে নির্দিষ্ট ক্রম ছাড়াই আলাদা আলাদা পয়েন্টার দেখা যায়। তাই,
একটি পয়েন্টারের ইন্ডেক্স একটি ইভেন্ট থেকে পরবর্তী ইভেন্টে পরিবর্তিত হতে পারে, তবে পয়েন্টারটি
যতক্ষণ অ্যাক্টিভ থাকবে ততক্ষণ পয়েন্টার আইডি
একই থাকবে। একটি জেসচারে পরবর্তী সব মোশন ইভেন্ট জুড়ে পয়েন্টার ট্র্যাক করতে, পয়েন্টারের আইডি পেতে
getPointerId()
পদ্ধতি ব্যবহার করুন। তারপর, পরপর মোশন ইভেন্টের জন্য, সেই মোশন ইভেন্টে প্রদত্ত পয়েন্টার আইডির জন্য পয়েন্টার ইনডেক্স পেতে
findPointerIndex()
পদ্ধতি ব্যবহার করুন।
যেমন:
Kotlin
private var mActivePointerId: Int = 0 override fun onTouchEvent(event: MotionEvent): Boolean { ... // Get the pointer ID. mActivePointerId = event.getPointerId(0) // ... Many touch events later... // Use the pointer ID to find the index of the active pointer // and fetch its position. val (x: Float, y: Float) = event.findPointerIndex(mActivePointerId).let { pointerIndex -> // Get the pointer's current position. event.getX(pointerIndex) to event.getY(pointerIndex) } ... }
জাভা
private int mActivePointerId; public boolean onTouchEvent(MotionEvent event) { ... // Get the pointer ID. mActivePointerId = event.getPointerId(0); // ... Many touch events later... // Use the pointer ID to find the index of the active pointer // and fetch its position. int pointerIndex = event.findPointerIndex(mActivePointerId); // Get the pointer's current position. float x = event.getX(pointerIndex); float y = event.getY(pointerIndex); ... }
একাধিক টাচ পয়েন্টার সাপোর্ট করতে, আপনি সব অ্যাক্টিভ পয়েন্টার তাদের আইডি সহ
তাদের স্বতন্ত্র ACTION_POINTER_DOWN এবং
ACTION_DOWN ইভেন্ট টাইমে ক্যাশে করতে পারেন। আপনার ক্যাশে থেকে পয়েন্টারগুলি সরান
তাদের ACTION_POINTER_UP এবং ACTION_UPইভেন্ট। অন্যান্য অ্যাকশন ইভেন্ট সঠিকভাবে ম্যানেজ করার জন্য
আপনি এইসব ক্যাশে করা আইডিকে সহায়ক হিসেবে পেতে পারেন। যেমন, ACTION_MOVE ইভেন্ট প্রসেস করার সময়, প্রতিটি ক্যাশে করা অ্যাক্টিভ পয়েন্টার আইডির
ইনডেক্স খুঁজে নিন, getX()
এবং
getY()
ফাংশন ব্যবহার করে পয়েন্টারের কোঅর্ডিনেট ফিরিয়ে আনুন, তারপর কোন পয়েন্টার সরানো হয়েছে তা
জানতে আপনার ক্যাশে করা কোঅর্ডিনেটের সাথে এই কোঅর্ডিনেট তুলনা করুন।
getActionIndex() ফাংশনটি শুধুমাত্র
ACTION_POINTER_UP এবং ACTION_POINTER_DOWN ইভেন্টের
সাথে ব্যবহার করুন। ACTION_MOVE ইভেন্টের সাথে এই ফাংশন ব্যবহার করবেন না, কারণ এটি
সবসময় 0 রিটার্ন করে।
MotionEventটি অ্যাকশন ফিরিয়ে আনুন
MotionEvent-এর অ্যাকশন ফিরিয়ে আনতে
getActionMasked()
পদ্ধতি বা কম্প্যাটিবিলিটি ভার্সন
MotionEventCompat.getActionMasked()
ব্যবহার করুন। আগের
getAction()
পদ্ধতির মতো নয়, getActionMasked() একাধিক
পয়েন্টারের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে। এটি পয়েন্টার ইনডেক্স ছাড়াই অ্যাকশনটি ফিরিয়ে দেয়। সঠিক পয়েন্টার ইনডেক্স সহ অ্যাকশনের জন্য,
অ্যাকশনের সাথে যুক্ত পয়েন্টারের ইনডেক্স ফিরিয়ে আনতে getActionIndex() ব্যবহার করুন,
যেমনটি নিম্নলিখিত স্নিপেটে দেখানো হয়েছে:
Kotlin
val (xPos: Int, yPos: Int) = MotionEventCompat.getActionMasked(event).let { action -> Log.d(DEBUG_TAG, "The action is ${actionToString(action)}") // Get the index of the pointer associated with the action. MotionEventCompat.getActionIndex(event).let { index -> // The coordinates of the current screen contact, relative to // the responding View or Activity. MotionEventCompat.getX(event, index).toInt() to MotionEventCompat.getY(event, index).toInt() } } if (event.pointerCount > 1) { Log.d(DEBUG_TAG, "Multitouch event") } else { // Single touch event. Log.d(DEBUG_TAG, "Single touch event") } ... // Given an action int, returns a string description. fun actionToString(action: Int): String { return when (action) { MotionEvent.ACTION_DOWN -> "Down" MotionEvent.ACTION_MOVE -> "Move" MotionEvent.ACTION_POINTER_DOWN -> "Pointer Down" MotionEvent.ACTION_UP -> "Up" MotionEvent.ACTION_POINTER_UP -> "Pointer Up" MotionEvent.ACTION_OUTSIDE -> "Outside" MotionEvent.ACTION_CANCEL -> "Cancel" else -> "" } }
জাভা
int action = MotionEventCompat.getActionMasked(event); // Get the index of the pointer associated with the action. int index = MotionEventCompat.getActionIndex(event); int xPos = -1; int yPos = -1; Log.d(DEBUG_TAG,"The action is " + actionToString(action)); if (event.getPointerCount() > 1) { Log.d(DEBUG_TAG,"Multitouch event"); // The coordinates of the current screen contact, relative to // the responding View or Activity. xPos = (int)MotionEventCompat.getX(event, index); yPos = (int)MotionEventCompat.getY(event, index); } else { // Single touch event. Log.d(DEBUG_TAG,"Single touch event"); xPos = (int)MotionEventCompat.getX(event, index); yPos = (int)MotionEventCompat.getY(event, index); } ... // Given an action int, returns a string description public static String actionToString(int action) { switch (action) { case MotionEvent.ACTION_DOWN: return "Down"; case MotionEvent.ACTION_MOVE: return "Move"; case MotionEvent.ACTION_POINTER_DOWN: return "Pointer Down"; case MotionEvent.ACTION_UP: return "Up"; case MotionEvent.ACTION_POINTER_UP: return "Pointer Up"; case MotionEvent.ACTION_OUTSIDE: return "Outside"; case MotionEvent.ACTION_CANCEL: return "Cancel"; } return ""; }
অতিরিক্ত রিসোর্স
ইনপুট ইভেন্ট সম্পর্কিত আরও তথ্যের জন্য, নিম্নলিখিত রেফারেন্স দেখুন: