मल्टी-टच जेस्चर हैंडल करने की सुविधा

लिखने का तरीका आज़माएं
Android के लिए, Jetpack Compose हमारा सुझाया गया यूज़र इंटरफ़ेस (यूआई) टूलकिट है. Compose में टच और इनपुट इस्तेमाल करने का तरीका जानें.

मल्टी-टच जेस्चर तब होता है, जब स्क्रीन पर एक से ज़्यादा पॉइंटर (उंगलियों) से टैप किया जाता है एक साथ. इस दस्तावेज़ में, जेस्चर (हाव-भाव) वाले जेस्चर का पता लगाने का तरीका बताया गया है एक से ज़्यादा पॉइंटर सेट करें.

एक से ज़्यादा पॉइंटर ट्रैक करना

जब कई पॉइंटर एक ही समय पर स्क्रीन पर टैप करते हैं, तो सिस्टम निम्न टच इवेंट:

  • ACTION_DOWN: पहला पॉइंटर स्क्रीन पर टैप करने पर भेजा जाता है. इससे जेस्चर शुरू हो जाता है. कॉन्टेंट बनाने इस पॉइंटर का पॉइंटर डेटा हमेशा इंडेक्स 0 पर MotionEvent.
  • ACTION_POINTER_DOWN: तब भेजा जाता है जब अतिरिक्त पॉइंटर पहले के बाद स्क्रीन में प्रवेश करते हैं. डाउनलोड करके पॉइंटर का इंडेक्स जो अभी-अभी इसके इस्तेमाल से घट गया है getActionIndex().
  • ACTION_MOVE: यह सूचना तब भेजी जाती है, जब हाथ के जेस्चर में कोई बदलाव होता है. ऐसा होने पर, पॉइंटर.
  • ACTION_POINTER_UP: यह सूचना तब भेजी जाती है, जब कोई नॉन-प्राइमरी पॉइंटर ऊपर की ओर जाता है. तो आपको डाइग्नोस्टिक टूल के ज़रिए वह पॉइंटर जो getActionIndex() का इस्तेमाल करते हुए बढ़ा है.
  • ACTION_UP: तब भेजा जाता है जब आखिरी पॉइंटर स्क्रीन से बाहर चला जाता है.
  • ACTION_CANCEL: इससे पता चलता है कि हाथ के सभी जेस्चर (हाव-भाव) के साथ-साथ पूरा जेस्चर रद्द हो गया है.

शुरू और खत्म करने के लिए हाथ के जेस्चर

जेस्चर, ACTION_DOWN से शुरू होने वाले इवेंट की सीरीज़ होती है इवेंट और ACTION_UP या पर खत्म होने वाला ACTION_CANCEL इवेंट. एक बार में, हाथ के एक जेस्चर का इस्तेमाल किया जा रहा है. कॉन्टेंट बनाने डाउन, मूव, अप, और रद्द करने की कार्रवाइयां, हाथ के सभी जेस्चर पर लागू होती हैं. उदाहरण के लिए, ACTION_MOVE वाला इवेंट, सभी पॉइंटर के लिए हलचल का संकेत दे सकता है करें.

पॉइंटर पर नज़र रखें

अलग-अलग पॉइंटर को ट्रैक करने के लिए, पॉइंटर के इंडेक्स और आईडी का इस्तेमाल करें MotionEvent में स्थितियां.

  • इंडेक्स: MotionEvent स्टोर पॉइंटर जानकारी होती है. पॉइंटर का इंडेक्स, इस कॉलम में उसकी पोज़िशन होता है कलेक्शन. MotionEvent वाले ज़्यादातर तरीके, पॉइंटर इंडेक्स को इस तरह लेते हैं पॉइंटर आईडी के बजाय, पैरामीटर का इस्तेमाल करें.
  • आईडी: हर पॉइंटर में एक आईडी मैपिंग भी होती है, जो टच इवेंट में लगातार बना रहने पर, इससे किसी एक पॉइंटर को ट्रैक किया जा सकता है इस्तेमाल किया जा सकता है.

किसी मोशन इवेंट में, अलग-अलग पॉइंटर, तय क्रम में नहीं दिखते हैं. इसलिए, पॉइंटर का इंडेक्स, एक से दूसरे इवेंट में बदल सकता है, लेकिन पॉइंटर आईडी यह गारंटी है कि जब तक पॉइंटर बना रहेगा, तब तक वह स्थिर रहेगा सक्रिय है. इसका इस्तेमाल करें 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)
    }
    ...
}

Java

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 कार्रवाइयाँ वापस पाएं

इसका इस्तेमाल करें getActionMasked() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है तरीका या साथ काम करने वाला वर्शन MotionEventCompat.getActionMasked() MotionEvent की कार्रवाई को फिर से पाने के लिए. पहले वाले से अलग 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 -> ""
    }
}

Java

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 "";
}
पहली इमेज. मल्टी-टच ड्रॉइंग पैटर्न चुनें.

अन्य संसाधन

इनपुट इवेंट के बारे में ज़्यादा जानकारी के लिए, यह लेख देखें संदर्भ: