टच डिवाइस

Android में कई तरह की टच स्क्रीन और टच पैड काम करते हैं. इनमें स्टाइलस वाले डिजिटाइज़र टैबलेट भी शामिल हैं.

टच स्क्रीन, टच डिवाइस होते हैं. ये डिसप्ले से इस तरह जुड़े होते हैं कि उपयोगकर्ता को स्क्रीन पर मौजूद आइटम को सीधे तौर पर कंट्रोल करने का अनुभव मिलता है.

टच पैड, टच डिवाइस होते हैं. ये किसी डिसप्ले से नहीं जुड़े होते हैं, जैसे कि डिजिटाइज़र टैबलेट. आम तौर पर, टच पैड का इस्तेमाल पॉइंट करने या किसी यूज़र इंटरफ़ेस को पूरी तरह से इनडायरेक्ट पोज़िशनिंग या जेस्चर के आधार पर कंट्रोल करने के लिए किया जाता है.

टच डिवाइसों में ऐसे बटन हो सकते हैं जो माउस के बटन की तरह काम करते हैं.

टच डिवाइसों को कभी-कभी अलग-अलग टूल का इस्तेमाल करके कंट्रोल किया जा सकता है. जैसे, उंगलियां या स्टाइलस. यह डिवाइस में मौजूद टच सेंसर टेक्नोलॉजी पर निर्भर करता है.

वर्चुअल बटन लागू करने के लिए, कभी-कभी टच डिवाइसों का इस्तेमाल किया जाता है. उदाहरण के लिए, कुछ Android डिवाइसों पर टच स्क्रीन सेंसर का एरिया, डिसप्ले के किनारे से आगे तक फैला होता है. यह टच सेंसिटिव कीपैड के हिस्से के तौर पर, दो तरह से काम करता है.

टच डिवाइसों की कई तरह की वैरायटी की वजह से, Android कई तरह की कॉन्फ़िगरेशन प्रॉपर्टी पर निर्भर करता है. इससे हर डिवाइस की विशेषताओं और उसके काम करने के तरीके के बारे में जानकारी मिलती है.

टच डिवाइस की कैटगरी

किसी इनपुट डिवाइस को मल्टी-टच डिवाइस के तौर पर तब ही माना जाता है, जब वह इन दोनों शर्तों को पूरा करता हो:

  • इनपुट डिवाइस, ABS_MT_POSITION_X और ABS_MT_POSITION_Y ऐब्सलूट ऐक्सिस की मौजूदगी की जानकारी देता है.
  • इनपुट डिवाइस में कोई गेमपैड बटन नहीं है. यह शर्त, कुछ गेमपैड के साथ होने वाली समस्या को हल करती है. ये गेमपैड, ऐक्सिस को ऐसे कोड के साथ रिपोर्ट करते हैं जो एमटी ऐक्सिस को ओवरलैप करते हैं.

किसी इनपुट डिवाइस को सिंगल-टच डिवाइस के तौर पर तब माना जाता है, जब ये दोनों शर्तें पूरी होती हों:

  • इनपुट डिवाइस को मल्टी-टच डिवाइस के तौर पर नहीं माना जाता. इनपुट डिवाइस को सिंगल-टच डिवाइस या मल्टी-टच डिवाइस के तौर पर बांटा जाता है. इसे दोनों कैटगरी में नहीं रखा जा सकता.
  • इनपुट डिवाइस, ABS_X और ABS_Y ऐब्सलूट ऐक्सिस की मौजूदगी के साथ-साथ, BTN_TOUCH की कोड की मौजूदगी की जानकारी देता है.

जब किसी इनपुट डिवाइस को टच डिवाइस के तौर पर बांटा जाता है, तो वर्चुअल बटन की मौजूदगी का पता लगाने के लिए, डिवाइस के लिए वर्चुअल बटन मैप फ़ाइल को लोड करने की कोशिश की जाती है. अगर कोई वर्चुअल बटन मैप उपलब्ध है, तो डिवाइस के लिए बटन लेआउट फ़ाइल भी लोड की जाती है. इन फ़ाइलों की जगह और फ़ॉर्मैट के बारे में जानने के लिए, [वर्चुअल बटन मैप फ़ाइलें](#virtual-key-map-files) देखें.

इसके बाद, सिस्टम टच डिवाइस के लिए इनपुट डिवाइस की कॉन्फ़िगरेशन फ़ाइल लोड करता है.

पहले से मौजूद सभी टच डिवाइसों में, इनपुट डिवाइस की कॉन्फ़िगरेशन फ़ाइलें होनी चाहिए. अगर इनपुट डिवाइस की कोई कॉन्फ़िगरेशन फ़ाइल मौजूद नहीं है, तो सिस्टम एक डिफ़ॉल्ट कॉन्फ़िगरेशन चुनता है. यह कॉन्फ़िगरेशन, सामान्य कामों के लिए इस्तेमाल किए जाने वाले टच पेरिफ़ेरल के लिए सही होता है. जैसे, बाहरी यूएसबी या ब्लूटूथ एचआईडी टच स्क्रीन या टच पैड. ये डिफ़ॉल्ट सेटिंग, पहले से मौजूद टच स्क्रीन के लिए नहीं बनाई गई हैं. इनकी वजह से, टच स्क्रीन गलत तरीके से काम कर सकती है.

इनपुट डिवाइस का डिवाइस कॉन्फ़िगरेशन लोड होने के बाद, सिस्टम इनपुट डिवाइस को टचस्क्रीन, टच पैड या पॉइंटिंग डिवाइस के तौर पर बांटता है.

  • टच स्क्रीन डिवाइस का इस्तेमाल, स्क्रीन पर मौजूद ऑब्जेक्ट को सीधे तौर पर कंट्रोल करने के लिए किया जाता है. उपयोगकर्ता सीधे स्क्रीन को छूता है. इसलिए, सिस्टम को ऑब्जेक्ट में किए जा रहे बदलावों को दिखाने के लिए, किसी अन्य सुविधा की ज़रूरत नहीं होती.
  • टच पैड डिवाइस का इस्तेमाल, किसी ऐप्लिकेशन को सेंसर के किसी खास हिस्से पर टच करने की सटीक जानकारी देने के लिए किया जाता है. यह डिजिटाइज़र टैबलेट के लिए मददगार हो सकता है.
  • पॉइंटर डिवाइस का इस्तेमाल, कर्सर की मदद से स्क्रीन पर मौजूद ऑब्जेक्ट को इनडायरेक्ट तरीके से कंट्रोल करने के लिए किया जाता है. उंगलियों को मल्टी-टच पॉइंटर जेस्चर के तौर पर समझा जाता है. अन्य टूल, जैसे कि स्टाइलस को ऐब्सलूट पोज़िशन का इस्तेमाल करके समझा जाता है. ज़्यादा जानकारी के लिए, इनडायरेक्ट मल्टी-टच पॉइंटर जेस्चर देखें.

इनपुट डिवाइस को टच स्क्रीन, टच पैड या पॉइंटर डिवाइस के तौर पर बांटने के लिए, इन नियमों का इस्तेमाल किया जाता है.

  • अगर touch.deviceType प्रॉपर्टी सेट है, तो डिवाइस टाइप को बताए गए तरीके से सेट किया जाता है.
  • अगर इनपुट डिवाइस, INPUT_PROP_DIRECT इनपुट प्रॉपर्टी की मौजूदगी की जानकारी देता है (EVIOCGPROP ioctl के ज़रिए), तो डिवाइस टाइप को टच स्क्रीन पर सेट किया जाता है. इस शर्त के तहत, यह माना जाता है कि डायरेक्ट इनपुट टच डिवाइस, कनेक्ट किए गए डिसप्ले से जुड़े हैं.
  • अगर इनपुट डिवाइस, INPUT_PROP_POINTER इनपुट प्रॉपर्टी की मौजूदगी की जानकारी देता है (EVIOCGPROP ioctl के ज़रिए), तो डिवाइस टाइप को पॉइंटर पर सेट किया जाता है.
  • अगर इनपुट डिवाइस, REL_X या REL_Y रिलेटिव ऐक्सिस की मौजूदगी की जानकारी देता है, तो डिवाइस टाइप को टच पैड पर सेट किया जाता है. यह शर्त, माउस और टच पैड, दोनों वाले इनपुट डिवाइसों के लिए साफ़ तौर पर जानकारी देती है. इस मामले में, पॉइंटर को कंट्रोल करने के लिए टच पैड का इस्तेमाल नहीं किया जाता, क्योंकि माउस पहले से ही उसे कंट्रोल करता है.
  • ऐसा न होने पर, डिवाइस टाइप को पॉइंटर पर सेट किया जाता है. यह डिफ़ॉल्ट सेटिंग पक्का करती है कि जिन टच पैड को किसी अन्य खास काम के लिए तय नहीं किया गया है वे पॉइंटर को कंट्रोल करें.

बटन

बटन वैकल्पिक कंट्रोल होते हैं. ऐप्लिकेशन इनका इस्तेमाल करके, अन्य फ़ंक्शन चला सकते हैं. टच डिवाइसों पर मौजूद बटन, माउस के बटन की तरह ही काम करते हैं. इनका इस्तेमाल मुख्य रूप से पॉइंटर टाइप के टच डिवाइसों या स्टाइलस के साथ किया जाता है.

ये बटन इस्तेमाल किए जा सकते हैं:

  • BTN_LEFT: MotionEvent.BUTTON_PRIMARY पर मैप किया गया.
  • BTN_RIGHT: MotionEvent.BUTTON_SECONDARY पर मैप किया गया.
  • BTN_MIDDLE: MotionEvent.BUTTON_MIDDLE पर मैप किया गया.
  • BTN_BACK और BTN_SIDE: MotionEvent.BUTTON_BACK पर मैप किया गया. इस बटन को दबाने पर, बटन कोड KeyEvent.KEYCODE_BACK के साथ बटन दबाने की प्रोसेस भी सिंथेसाइज़ होती है.
  • BTN_FORWARD और BTN_EXTRA: इन्हें MotionEvent.BUTTON_FORWARD पर मैप किया गया है. इस बटन को दबाने से, बटन कोड KeyEvent.KEYCODE_FORWARD के साथ बटन दबाने की प्रोसेस भी सिंथेसाइज़ होती है.
  • BTN_STYLUS: MotionEvent.BUTTON_SECONDARY पर मैप किया गया.
  • BTN_STYLUS2: MotionEvent.BUTTON_TERTIARY पर मैप किया गया.

टूल और उनके टाइप

टूल, उंगली, स्टाइलस या कोई अन्य डिवाइस होता है. इसका इस्तेमाल, टच डिवाइस से इंटरैक्ट करने के लिए किया जाता है. टचस्क्रीन वाले कुछ डिवाइस, अलग-अलग तरह के टूल के बीच अंतर कर सकते हैं.

Android में अन्य जगहों पर, जैसे कि MotionEvent एपीआई में, टूल को अक्सर पॉइंटर कहा जाता है.

ये टूल टाइप इस्तेमाल किए जा सकते हैं:

  • BTN_TOOL_FINGER और MT_TOOL_FINGER: MotionEvent.TOOL_TYPE_FINGER से मैप किया गया.
  • BTN_TOOL_PEN और MT_TOOL_PEN: इन्हें MotionEvent.TOOL_TYPE_STYLUS पर मैप किया गया है.
  • BTN_TOOL_RUBBER: MotionEvent.TOOL_TYPE_ERASER पर मैप किया गया.
  • BTN_TOOL_BRUSH: MotionEvent.TOOL_TYPE_STYLUS पर मैप किया गया.
  • BTN_TOOL_PENCIL: MotionEvent.TOOL_TYPE_STYLUS पर मैप किया गया.
  • BTN_TOOL_AIRBRUSH: MotionEvent.TOOL_TYPE_STYLUS पर मैप किया गया.
  • BTN_TOOL_MOUSE: MotionEvent.TOOL_TYPE_MOUSE पर मैप किया गया.
  • BTN_TOOL_LENS: MotionEvent.TOOL_TYPE_MOUSE पर मैप किया गया.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, और BTN_TOOL_QUADTAP: इन्हें MotionEvent.TOOL_TYPE_FINGER से मैप किया गया है.

टूल पर कर्सर घुमाना और उन्हें टच करना

टूल, टच डिवाइस के संपर्क में हो सकते हैं या रेंज में हो सकते हैं और उसके ऊपर होवर कर सकते हैं. सभी टच डिवाइस, उनके ऊपर होवर किए जा रहे टूल की मौजूदगी का पता नहीं लगा सकते. जिन डिवाइसों में यह सुविधा होती है, जैसे कि रेडियो फ़्रीक्वेंसी पर आधारित स्टाइलस डिजिटाइज़र, वे अक्सर यह पता लगा सकते हैं कि स्टाइलस, डिजिटाइज़र की तय रेंज में है या नहीं.

InputReader कॉम्पोनेंट, टच करने वाले टूल को कर्सर घुमाने वाले टूल से अलग करता है. इसी तरह, टच करने वाले टूल और कर्सर घुमाने वाले टूल की जानकारी, ऐप्लिकेशन को अलग-अलग तरीकों से दी जाती है.

टच करने वाले टूल, ऐप्लिकेशन को टच इवेंट के तौर पर रिपोर्ट किए जाते हैं. इसके लिए, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN, और MotionEvent.ACTION_POINTER_UP का इस्तेमाल किया जाता है.

होवरिंग टूल, ऐप्लिकेशन को सामान्य मोशन इवेंट के तौर पर रिपोर्ट किए जाते हैं. इसके लिए, MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE, और MotionEvent.ACTION_HOVER_EXIT का इस्तेमाल किया जाता है.

टच डिवाइस के ड्राइवर से जुड़ी ज़रूरी शर्तें

  • टच डिवाइस ड्राइवर को सिर्फ़ उन ऐक्सिस और बटन के लिए ऐक्सिस और बटन कोड रजिस्टर करने चाहिए जो वे इस्तेमाल करते हैं. इस्तेमाल न किए जा सकने वाले ऐक्सिस या बटन कोड रजिस्टर करने से, डिवाइस की कैटगरी तय करने वाले एल्गोरिदम में गड़बड़ी हो सकती है. इसके अलावा, ऐसा हो सकता है कि सिस्टम, डिवाइस की सुविधाओं का गलत तरीके से पता लगाए. उदाहरण के लिए, अगर डिवाइस BTN_TOUCH की कोड की जानकारी देता है, तो सिस्टम यह मान लेता है कि BTN_TOUCH का इस्तेमाल हमेशा यह बताने के लिए किया जाता है कि टूल, स्क्रीन को छू रहा है या नहीं. इसलिए, BTN_TOUCH का इस्तेमाल यह बताने के लिए नहीं किया जाना चाहिए कि टूल सिर्फ़ रेंज में है और होवर कर रहा है.
  • सिंगल-टच डिवाइसों में, इन Linux इनपुट इवेंट का इस्तेमाल किया जाता है:
    • ABS_X: (ज़रूरी है) टूल के X कोऑर्डिनेट की जानकारी देता है.
    • ABS_Y: (ज़रूरी है) टूल के Y कोऑर्डिनेट की जानकारी देता है.
    • ABS_PRESSURE: (ज़रूरी नहीं) इससे टूल की टिप पर पड़ने वाले फ़िज़िकल प्रेशर या टच कॉन्टैक्ट के सिग्नल की क्षमता का पता चलता है.
    • ABS_TOOL_WIDTH: (ज़रूरी नहीं) यह टच कॉन्टैक्ट या टूल के क्रॉस-सेक्शनल एरिया या चौड़ाई की जानकारी देता है.
    • ABS_DISTANCE: (ज़रूरी नहीं) यह टच डिवाइस की सतह से टूल की दूरी की जानकारी देता है.
    • ABS_TILT_X: (ज़रूरी नहीं) यह X ऐक्सिस के साथ, टच डिवाइस की सतह से टूल के झुकाव की जानकारी देता है.
    • ABS_TILT_Y: (ज़रूरी नहीं) यह Y ऐक्सिस के साथ-साथ, टच डिवाइस की सतह से टूल के झुकाव की जानकारी देता है.
    • BTN_TOUCH: (ज़रूरी है) इससे पता चलता है कि टूल, डिवाइस को छू रहा है या नहीं.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (ज़रूरी नहीं) बटन की स्थितियों की जानकारी देता है.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (ज़रूरी नहीं) टूल टाइप की जानकारी देता है.
  • मल्टी-टच डिवाइस, इन Linux इनपुट इवेंट का इस्तेमाल करते हैं:
    • ABS_MT_POSITION_X: (ज़रूरी है) टूल के X कोऑर्डिनेट की जानकारी देता है.
    • ABS_MT_POSITION_Y: (ज़रूरी है) टूल के Y कोऑर्डिनेट की जानकारी देता है.
    • ABS_MT_PRESSURE: (ज़रूरी नहीं) इससे टूल की टिप पर पड़ने वाले दबाव या टच कॉन्टैक्ट के सिग्नल की क्षमता का पता चलता है.
    • ABS_MT_TOUCH_MAJOR: (ज़रूरी नहीं) टच कॉन्टैक्ट के क्रॉस-सेक्शनल एरिया या टच कॉन्टैक्ट के लंबे डाइमेंशन की लंबाई की जानकारी देता है.
    • ABS_MT_TOUCH_MINOR: (ज़रूरी नहीं) यह टच कॉन्टैक्ट के छोटे डाइमेंशन की लंबाई की जानकारी देता है. अगर ABS_MT_TOUCH_MAJOR किसी इलाके के मेज़रमेंट की रिपोर्ट कर रहा है, तो इस ऐक्सिस का इस्तेमाल नहीं किया जाना चाहिए.
    • ABS_MT_WIDTH_MAJOR: (ज़रूरी नहीं) टूल के क्रॉस-सेक्शनल एरिया या टूल के लंबे डाइमेंशन की लंबाई की जानकारी देता है. इस ऐक्सिस का इस्तेमाल तब तक न करें, जब तक आपको टूल के डाइमेंशन के बारे में जानकारी न हो.
    • ABS_MT_WIDTH_MINOR: (ज़रूरी नहीं) इससे टूल के छोटे डाइमेंशन की लंबाई की जानकारी मिलती है. इस ऐक्सिस का इस्तेमाल तब नहीं किया जाना चाहिए, जब ABS_MT_WIDTH_MAJOR किसी इलाके के माप की जानकारी दे रहा हो या टूल के डाइमेंशन की जानकारी न हो.
    • ABS_MT_ORIENTATION: (ज़रूरी नहीं) टूल के ओरिएंटेशन की जानकारी देता है.
    • ABS_MT_DISTANCE: (ज़रूरी नहीं) टच डिवाइस की सतह से टूल की दूरी की जानकारी देता है.
    • ABS_MT_TOOL_TYPE: (ज़रूरी नहीं) टूल टाइप को MT_TOOL_FINGER या MT_TOOL_PEN के तौर पर रिपोर्ट करता है.
    • ABS_MT_TRACKING_ID: (ज़रूरी नहीं) टूल का ट्रैकिंग आईडी रिपोर्ट करता है. ट्रैकिंग आईडी, एक आर्बिट्रेरी नॉन-नेगेटिव इंटिजर होता है. इसका इस्तेमाल, एक से ज़्यादा टूल चालू होने पर हर टूल की अलग से पहचान करने और उसे ट्रैक करने के लिए किया जाता है. उदाहरण के लिए, जब डिवाइस को कई उंगलियों से छुआ जाता है, तो हर उंगली को एक अलग ट्रैकिंग आईडी असाइन किया जाना चाहिए. इस आईडी का इस्तेमाल तब तक किया जाता है, जब तक उंगली डिवाइस के संपर्क में रहती है. ट्रैकिंग आईडी को फिर से इस्तेमाल किया जा सकता है. ऐसा तब किया जा सकता है, जब उनसे जुड़े टूल रेंज से बाहर हो जाएं.
    • ABS_MT_SLOT: (ज़रूरी नहीं) Linux मल्टी-टच प्रोटोकॉल 'B' का इस्तेमाल करते समय, टूल के स्लॉट आईडी की जानकारी देता है. ज़्यादा जानकारी के लिए, Linux मल्टी-टच प्रोटोकॉल दस्तावेज़ देखें.
    • BTN_TOUCH: (ज़रूरी है) इससे पता चलता है कि टूल, डिवाइस को छू रहा है या नहीं.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (ज़रूरी नहीं) बटन की स्थितियों की जानकारी देता है.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (ज़रूरी नहीं) टूल टाइप की जानकारी देता है.
  • अगर सिंगल-टच और मल्टी-टच प्रोटोकॉल, दोनों के लिए ऐक्सिस तय किए गए हैं, तो सिर्फ़ मल्टी-टच ऐक्सिस का इस्तेमाल किया जाता है. साथ ही, सिंगल-टच ऐक्सिस को अनदेखा कर दिया जाता है.
  • ABS_X, ABS_Y, ABS_MT_POSITION_X, और ABS_MT_POSITION_Y ऐक्सिस की कम से कम और ज़्यादा से ज़्यादा वैल्यू, डिवाइस के हिसाब से तय की गई सतह की यूनिट में, डिवाइस के चालू हिस्से की सीमाओं को तय करती हैं. टच स्क्रीन के मामले में, ऐक्टिव एरिया टच डिवाइस के उस हिस्से के बारे में बताता है जो असल में डिसप्ले को कवर करता है.

    टच स्क्रीन के लिए, सिस्टम अपने-आप रिपोर्ट की गई टच पोज़िशन को सरफेस यूनिट में इंटरपोलेट करता है, ताकि डिसप्ले पिक्सल में टच पोज़िशन को इस कैलकुलेशन के हिसाब से हासिल किया जा सके:

        displayX = (x - minX) * displayWidth / (maxX - minX + 1)
        displayY = (y - minY) * displayHeight / (maxY - minY + 1)
        

    ऐसा हो सकता है कि टच स्क्रीन, रिपोर्ट किए गए ऐक्टिव एरिया के बाहर के टच को रिपोर्ट करे.

    ऐक्टिव एरिया के बाहर किए गए टच, ऐप्लिकेशन को नहीं भेजे जाते. हालांकि, इनका इस्तेमाल वर्चुअल बटन के लिए किया जा सकता है.

    ऐक्टिव एरिया में शुरू होने वाले या डिसप्ले एरिया में आने और जाने वाले टच, ऐप्लिकेशन को डिलीवर किए जाते हैं. इसलिए, अगर कोई टच किसी ऐप्लिकेशन की सीमाओं के अंदर शुरू होता है और फिर ऐक्टिव एरिया से बाहर चला जाता है, तो ऐप्लिकेशन को डिसप्ले कोऑर्डिनेट के साथ टच इवेंट मिल सकते हैं. ये कोऑर्डिनेट नेगेटिव हो सकते हैं या डिसप्ले की सीमाओं से बाहर हो सकते हैं. आम तौर पर, ऐसा हो सकता है.

    टच डिवाइस को कभी भी टच कोऑर्डिनेट को ऐक्टिव एरिया की सीमाओं तक सीमित नहीं करना चाहिए. अगर टच, ऐक्टिव एरिया से बाहर जाता है, तो इसे ऐक्टिव एरिया से बाहर के तौर पर रिपोर्ट किया जाना चाहिए या इसे बिलकुल भी रिपोर्ट नहीं किया जाना चाहिए.

    उदाहरण के लिए, अगर उपयोगकर्ता की उंगली टच स्क्रीन के सबसे ऊपर बाएं कोने के पास छू रही है, तो यह (minX, minY) का कोऑर्डिनेट रिपोर्ट कर सकता है. अगर उंगली ऐक्टिव एरिया से बाहर की ओर बढ़ती रहती है, तो टच स्क्रीन को minX और minY से कम कॉम्पोनेंट वाले निर्देशांकों की रिपोर्टिंग शुरू करनी चाहिए, जैसे कि (minX - 2, minY - 3) या फिर टच की रिपोर्टिंग पूरी तरह से बंद कर देनी चाहिए. दूसरे शब्दों में, जब उपयोगकर्ता की उंगली असल में ऐक्टिव एरिया के बाहर टच कर रही हो, तब टच स्क्रीन को (minX, minY) की जानकारी नहीं देनी चाहिए.

    टच कोऑर्डिनेट को डिसप्ले के किनारे पर क्लैंप करने से, स्क्रीन के किनारे पर एक आर्टिफ़िशियल हार्ड बाउंड्री बन जाती है. इससे सिस्टम, डिसप्ले एरिया की सीमाओं में आने या जाने वाले मोशन को आसानी से ट्रैक नहीं कर पाता.

  • ABS_PRESSURE या ABS_MT_PRESSURE से रिपोर्ट की गई वैल्यू, अगर वे रिपोर्ट की जाती हैं, तो टूल के डिवाइस को छूने पर शून्य नहीं होनी चाहिए. इसके अलावा, टूल के होवर करने पर शून्य होनी चाहिए.

    प्रेशर की जानकारी देना ज़रूरी नहीं है. हालांकि, हमारा सुझाव है कि आप यह जानकारी दें. ऐप्लिकेशन, प्रेशर की जानकारी का इस्तेमाल करके, प्रेशर-सेंसिटिव ड्रॉइंग और अन्य इफ़ेक्ट लागू कर सकते हैं.

  • जब टूल डिवाइस को छू रहा हो, तब ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR या ABS_MT_WIDTH_MINOR से रिपोर्ट की गई वैल्यू शून्य नहीं होनी चाहिए. इसके अलावा, अन्य मामलों में यह वैल्यू शून्य होनी चाहिए. हालांकि, ऐसा करना ज़रूरी नहीं है. उदाहरण के लिए, हो सकता है कि टच डिवाइस, उंगली से किए गए टच के साइज़ को मेज़र कर पाए, लेकिन स्टाइलस से किए गए टच के साइज़ को नहीं.

    साइज़ की जानकारी देना ज़रूरी नहीं है. हालांकि, हमारा सुझाव है कि आप यह जानकारी दें. ऐप्लिकेशन, दबाव की जानकारी का इस्तेमाल करके, साइज़ के हिसाब से ड्रॉइंग और अन्य इफ़ेक्ट लागू कर सकते हैं.

  • जब टूल डिवाइस को छू रहा हो, तब ABS_DISTANCE या ABS_MT_DISTANCE से रिपोर्ट की गई वैल्यू शून्य के करीब होनी चाहिए. टूल के सीधे संपर्क में होने पर भी, दूरी शून्य से ज़्यादा हो सकती है. रिपोर्ट की गई सटीक वैल्यू इस बात पर निर्भर करती हैं कि हार्डवेयर, दूरी को किस तरह मेज़र करता है.

    दूरी की जानकारी देना ज़रूरी नहीं है. हालांकि, स्टाइलस डिवाइसों के लिए ऐसा करने का सुझाव दिया जाता है.

  • जब टूल, डिवाइस के लंबवत हो, तो ABS_TILT_X और ABS_TILT_Y से रिपोर्ट की गई वैल्यू शून्य होनी चाहिए. अगर टिल्ट की वैल्यू शून्य नहीं है, तो इसका मतलब है कि टूल को झुकाकर पकड़ा गया है.

    X और Y ऐक्सिस के साथ झुकाव के कोणों को, लंबवत से डिग्री में तय किया गया माना जाता है. सेंटर पॉइंट (बिलकुल लंबवत) हर ऐक्सिस के लिए, (max + min) / 2 से दिया जाता है. सेंटर पॉइंट से कम वैल्यू, ऊपर या बाईं ओर झुकाव को दिखाती हैं. वहीं, सेंटर पॉइंट से ज़्यादा वैल्यू, नीचे या दाईं ओर झुकाव को दिखाती हैं.

    InputReader, X और Y टिल्ट कॉम्पोनेंट को 0 से PI / 2 रेडियन की रेंज वाले लंबवत टिल्ट ऐंगल और -PI से PI रेडियन की रेंज वाले प्लेनर ओरिएंटेशन ऐंगल में बदलता है. इस तरह से ओरिएंटेशन की जानकारी देने पर, यह उंगली के टच की जानकारी देने के लिए इस्तेमाल किए जाने वाले तरीके के साथ काम करती है.

    टिल्ट की जानकारी देना ज़रूरी नहीं है. हालांकि, स्टाइलस डिवाइसों के लिए ऐसा करने का सुझाव दिया जाता है.

  • अगर टूल टाइप की जानकारी ABS_MT_TOOL_TYPE से मिलती है, तो वह BTN_TOOL_* से मिली टूल टाइप की जानकारी की जगह लागू होगी. अगर टूल टाइप की कोई जानकारी उपलब्ध नहीं है, तो टूल टाइप डिफ़ॉल्ट रूप से MotionEvent.TOOL_TYPE_FINGER पर सेट हो जाता है.

  • किसी टूल को चालू तब माना जाता है, जब वह इन शर्तों को पूरा करता हो:

    • सिंगल-टच प्रोटोकॉल का इस्तेमाल करते समय, टूल तब चालू होता है, जब BTN_TOUCH या BTN_TOOL_* की वैल्यू 1 हो.

      इस शर्त का मतलब है कि InputReader के पास टूल के बारे में कम से कम कुछ जानकारी होनी चाहिए. जैसे, क्या वह टच कर रहा है या कम से कम उसके टूल का टाइप क्या है. अगर कोई जानकारी उपलब्ध नहीं है, तो माना जाता है कि टूल बंद है (रेंज से बाहर है).

    • मल्टी-टच प्रोटोकॉल 'A' का इस्तेमाल करने पर, टूल तब चालू होता है, जब वह सबसे हाल की सिंक रिपोर्ट में दिखता है. जब टूल, सिंक रिपोर्ट में दिखना बंद हो जाता है, तो वह मौजूद नहीं रहता.
    • मल्टी-टच प्रोटोकॉल 'B' का इस्तेमाल करते समय, टूल तब तक चालू रहता है, जब तक उसमें कोई स्लॉट चालू रहता है. स्लॉट खाली होने पर, टूल हट जाता है.
  • किसी टूल को होवर करने वाला टूल तब माना जाता है, जब वह ये शर्तें पूरी करता हो:
    • अगर टूल BTN_TOOL_MOUSE या BTN_TOOL_LENS है, तो टूल कर्सर को घुमा नहीं रहा है. भले ही, इनमें से कोई भी शर्त पूरी हो.
    • अगर टूल चालू है और ड्राइवर, प्रेशर की जानकारी देता है, और रिपोर्ट किया गया प्रेशर शून्य है, तो इसका मतलब है कि टूल होवर कर रहा है.
    • अगर टूल चालू है और ड्राइवर, BTN_TOUCH बटन कोड के साथ काम करता है और BTN_TOUCH की वैल्यू शून्य है, तो इसका मतलब है कि टूल को होवर किया जा रहा है.
  • InputReader, मल्टी-टच प्रोटोकॉल 'A' और 'B', दोनों के साथ काम करता है. नए ड्राइवर को 'B' प्रोटोकॉल का इस्तेमाल करना चाहिए. हालांकि, दोनों में से किसी भी प्रोटोकॉल का इस्तेमाल किया जा सकता है.
  • Android 4.0 के बाद से, टच स्क्रीन ड्राइवर में बदलाव करने की ज़रूरत पड़ सकती है, ताकि Linux इनपुट प्रोटोकॉल की शर्तों का पालन किया जा सके.

    ये बदलाव करने पड़ सकते हैं:

    • जब कोई टूल इनऐक्टिव हो जाता है (उंगली "ऊपर" जाती है), तो उसे मल्टी-टच सिंक की बाद की रिपोर्ट में नहीं दिखना चाहिए. जब सभी टूल बंद हो जाते हैं (सभी उंगलियां "ऊपर" हो जाती हैं), तो ड्राइवर को सिंक रिपोर्ट का खाली पैकेट भेजना चाहिए. जैसे, SYN_MT_REPORT के बाद SYN_REPORT.

      Android के पिछले वर्शन में, "अप" इवेंट की रिपोर्ट करने के लिए, प्रेशर वैल्यू को 0 पर सेट करके भेजा जाता था. पुराना तरीका, Linux इनपुट प्रोटोकॉल की खास बातों के साथ काम नहीं करता था. इसलिए, अब इसे इस्तेमाल नहीं किया जा सकता.

    • फ़िज़िकल प्रेशर या सिग्नल की क्वालिटी की जानकारी, ABS_MT_PRESSURE का इस्तेमाल करके रिपोर्ट की जानी चाहिए.

      Android के पिछले वर्शन, ABS_MT_TOUCH_MAJOR से प्रेशर की जानकारी हासिल करते थे. पुराना तरीका, Linux इनपुट प्रोटोकॉल की खास बातों के साथ काम नहीं करता था. इसलिए, अब इसे इस्तेमाल नहीं किया जा सकता.

    • टच साइज़ की जानकारी, ABS_MT_TOUCH_MAJOR का इस्तेमाल करके रिपोर्ट की जानी चाहिए.

      Android के पिछले वर्शन, ABS_MT_TOOL_MAJOR से साइज़ की जानकारी हासिल करते थे. पुराना तरीका, Linux इनपुट प्रोटोकॉल के साथ काम नहीं करता था. इसलिए, अब इसे इस्तेमाल नहीं किया जा सकता.

    टच डिवाइस के ड्राइवर को अब Android के हिसाब से कस्टमाइज़ करने की ज़रूरत नहीं है. स्टैंडर्ड Linux इनपुट प्रोटोकॉल का इस्तेमाल करके, Android कई तरह के टच पेरिफ़ेरल के साथ काम कर सकता है. जैसे, बिना बदलाव किए गए ड्राइवर का इस्तेमाल करके, बाहरी एचआईडी मल्टी-टच टच स्क्रीन.

टच डिवाइस पर की जाने वाली कार्रवाइयां

यहां Android पर टच डिवाइस के काम करने के तरीके के बारे में खास जानकारी दी गई है.

  1. EventHub, evdev ड्राइवर से रॉ इवेंट पढ़ता है.
  2. InputReader, रॉ इवेंट का इस्तेमाल करता है और हर टूल की पोज़िशन और अन्य विशेषताओं के बारे में इंटरनल स्टेटस को अपडेट करता है. यह बटन की स्थितियों को भी ट्रैक करता है.
  3. अगर BACK या FORWARD को दबाया या छोड़ा गया, तो InputReader, InputDispatcher को मुख्य इवेंट के बारे में सूचना देता है.
  4. InputReader से यह तय होता है कि वर्चुअल बटन दबाया गया है या नहीं. अगर ऐसा होता है, तो यह InputDispatcher को मुख्य इवेंट के बारे में सूचना देता है.
  5. InputReader से यह तय होता है कि टच, डिसप्ले की सीमाओं के अंदर शुरू हुआ था या नहीं. अगर ऐसा होता है, तो यह InputDispatcher को टच इवेंट के बारे में सूचना देता है.
  6. अगर कोई टचिंग टूल नहीं है, लेकिन कम से कम एक होवरिंग टूल है, तो InputReader, InputDispatcher को होवर इवेंट के बारे में सूचना देता है.
  7. अगर टच डिवाइस का टाइप पॉइंटर है, तो InputReader पॉइंटर जेस्चर का पता लगाता है, पॉइंटर और स्पॉट को उसके हिसाब से मूव करता है, और पॉइंटर इवेंट के बारे में InputDispatcher को सूचना देता है.
  8. InputDispatcher, WindowManagerPolicy का इस्तेमाल करके यह तय करता है कि इवेंट भेजे जाने चाहिए या नहीं. साथ ही, यह भी तय करता है कि इवेंट की वजह से डिवाइस चालू होना चाहिए या नहीं. इसके बाद, InputDispatcher इवेंट को सही ऐप्लिकेशन पर डिलीवर करता है.

टच डिवाइस का कॉन्फ़िगरेशन

टच डिवाइस के काम करने का तरीका, डिवाइस के ऐक्सिस, बटन, इनपुट प्रॉपर्टी, इनपुट डिवाइस कॉन्फ़िगरेशन, वर्चुअल बटन मैप, और बटन के लेआउट से तय होता है.

कीबोर्ड कॉन्फ़िगरेशन में इस्तेमाल होने वाली फ़ाइलों के बारे में ज़्यादा जानने के लिए, यहां दिए गए सेक्शन देखें:

प्रॉपर्टी

टच डिवाइस के काम करने के तरीके को कॉन्फ़िगर और कैलिब्रेट करने के लिए, सिस्टम कई इनपुट डिवाइस कॉन्फ़िगरेशन प्रॉपर्टी पर निर्भर करता है.

इसकी एक वजह यह है कि टच डिवाइसों के लिए डिवाइस ड्राइवर, अक्सर डिवाइस के हिसाब से इकाइयों का इस्तेमाल करके, टच की विशेषताओं की जानकारी देते हैं.

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

सिस्टम, इनपुट डिवाइस की कॉन्फ़िगरेशन फ़ाइलों में एन्कोड किए गए कैलिब्रेशन पैरामीटर का इस्तेमाल करता है. इससे टच डिवाइस से मिली वैल्यू को डिकोड, ट्रांसफ़ॉर्म, और नॉर्मलाइज़ किया जाता है. इससे वैल्यू को आसान स्टैंडर्ड फ़ॉर्मैट में बदला जाता है, ताकि ऐप्लिकेशन उन्हें समझ सकें.

दस्तावेज़ के कन्वेंशन

दस्तावेज़ बनाने के लिए, हम कैलिब्रेशन की प्रोसेस के दौरान सिस्टम से इस्तेमाल की जाने वाली वैल्यू के बारे में बताने के लिए, इन नियमों का इस्तेमाल करते हैं.

रॉ ऐक्सिस वैल्यू

यहां दिए गए एक्सप्रेशन, टच डिवाइस ड्राइवर की ओर से EV_ABS इवेंट के तौर पर रिपोर्ट की गई रॉ वैल्यू दिखाते हैं.

raw.x
ABS_X या ABS_MT_POSITION_X ऐक्सिस की वैल्यू.
raw.y
ABS_Y या ABS_MT_POSITION_Y ऐक्सिस की वैल्यू.
raw.pressure
ABS_PRESSURE या ABS_MT_PRESSURE ऐक्सिस की वैल्यू. अगर यह उपलब्ध नहीं है, तो 0.
raw.touchMajor
ABS_MT_TOUCH_MAJOR ऐक्सिस की वैल्यू. अगर यह उपलब्ध नहीं है, तो 0.
raw.touchMinor
ABS_MT_TOUCH_MINOR ऐक्सिस की वैल्यू या उपलब्ध न होने पर raw.touchMajor.
raw.toolMajor
ABS_TOOL_WIDTH या ABS_MT_WIDTH_MAJOR ऐक्सिस की वैल्यू. अगर यह उपलब्ध नहीं है, तो 0.
raw.toolMinor
ABS_MT_WIDTH_MINOR ऐक्सिस की वैल्यू या उपलब्ध न होने पर raw.toolMajor.
raw.orientation
ABS_MT_ORIENTATION ऐक्सिस की वैल्यू. अगर यह उपलब्ध नहीं है, तो 0.
raw.distance
ABS_DISTANCE या ABS_MT_DISTANCE ऐक्सिस की वैल्यू. अगर यह उपलब्ध नहीं है, तो 0.
raw.tiltX
ABS_TILT_X ऐक्सिस की वैल्यू. अगर यह उपलब्ध नहीं है, तो 0.
raw.tiltY
ABS_TILT_Y ऐक्सिस की वैल्यू. अगर यह उपलब्ध नहीं है, तो 0.

रॉ ऐक्सिस रेंज

यहां दिए गए एक्सप्रेशन, रॉ वैल्यू की सीमाओं को दिखाते हैं. हर ऐक्सिस के लिए EVIOCGABS ioctl को कॉल करके, इन्हें हासिल किया जाता है.

raw.*.min
रॉ ऐक्सिस की सबसे कम वैल्यू.
raw.*.max
रॉ ऐक्सिस की ज़्यादा से ज़्यादा वैल्यू.
raw.*.range
raw.*.max - raw.*.min के बराबर.
raw.*.fuzz
रॉ ऐक्सिस की सटीक जानकारी. उदाहरण के लिए, fuzz = 1 का मतलब है कि वैल्यू +/- 1 यूनिट तक सटीक हैं.
raw.width
टच एरिया की चौड़ाई, raw.x.range + 1 के बराबर है.
raw.height
टच एरिया की कुल ऊंचाई, raw.y.range + 1 के बराबर है.

आउटपुट रेंज

यहां दिए गए एक्सप्रेशन, आउटपुट कोऑर्डिनेट सिस्टम की विशेषताओं के बारे में बताते हैं. सिस्टम, टच डिवाइस से इस्तेमाल की जाने वाली सरफ़ेस यूनिट से टच पोज़िशन की जानकारी को आउटपुट यूनिट में ट्रांसलेट करने के लिए, लीनियर इंटरपोलेशन का इस्तेमाल करता है. इन आउटपुट यूनिट की जानकारी, ऐप्लिकेशन को दी जाती है. जैसे, डिसप्ले पिक्सल.

output.width
आउटपुट की चौड़ाई. टच स्क्रीन (डिसप्ले से जुड़ी) के लिए, यह पिक्सल में डिसप्ले की चौड़ाई होती है. टच पैड (जो डिसप्ले से जुड़े नहीं हैं) के लिए, आउटपुट की चौड़ाई raw.width के बराबर होती है. इससे पता चलता है कि कोई इंटरपोलेशन नहीं किया गया है.
output.height
आउटपुट की ऊंचाई. टचस्क्रीन (डिसप्ले से जुड़ी) के लिए, यह पिक्सल में डिसप्ले की ऊंचाई होती है. टच पैड (जो डिसप्ले से जुड़े नहीं हैं) के लिए, आउटपुट की ऊंचाई raw.height के बराबर होती है. इससे पता चलता है कि कोई इंटरपोलेशन नहीं किया गया है.
output.diag
आउटपुट कोऑर्डिनेट सिस्टम के डायगनल की लंबाई, जो sqrt(output.width ^2 + output.height ^2) के बराबर है.

बुनियादी कॉन्फ़िगरेशन

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

touch.deviceType

परिभाषा: touch.deviceType = touchScreen | touchPad | pointer | default

इससे टच डिवाइस के टाइप के बारे में पता चलता है.

  • अगर वैल्यू touchScreen है, तो टच डिवाइस एक टच स्क्रीन है, जो डिसप्ले से जुड़ी है.

  • अगर वैल्यू touchPad है, तो टच डिवाइस एक टच पैड है, जो डिसप्ले से जुड़ा नहीं है.

  • अगर वैल्यू pointer है, तो टच डिवाइस एक ऐसा टच पैड है जो डिसप्ले से जुड़ा नहीं है. साथ ही, इसके मोशन का इस्तेमाल, इनडायरेक्ट मल्टी-टच पॉइंटर जेस्चर के लिए किया जाता है.

  • अगर वैल्यू default है, तो सिस्टम क्लासिफ़िकेशन एल्गोरिदम के हिसाब से, डिवाइस टाइप का अपने-आप पता लगाता है.

डिवाइस का टाइप, टच डिवाइस के काम करने के तरीके पर कैसे असर डालता है, इस बारे में ज़्यादा जानने के लिए कैटगरी सेक्शन देखें.

Android 3 और इससे पहले के वर्शन में, सभी टच डिवाइसों को टच स्क्रीन माना जाता था.

touch.orientationAware

परिभाषा: touch.orientationAware = 0 | 1

इससे यह तय होता है कि टच डिवाइस को डिसप्ले ओरिएंटेशन में होने वाले बदलावों पर प्रतिक्रिया देनी चाहिए या नहीं.

  • अगर वैल्यू 1 है, तो डिसप्ले का ओरिएंटेशन बदलने पर, टच डिवाइस से रिपोर्ट की गई टच पोज़िशन को घुमा दिया जाता है.

  • अगर वैल्यू 0 है, तो टच डिवाइस से रिपोर्ट की गई टच पोज़िशन पर, डिसप्ले ओरिएंटेशन में होने वाले बदलावों का असर नहीं पड़ता.

अगर डिवाइस टचस्क्रीन है, तो डिफ़ॉल्ट वैल्यू 1 होगी. अगर ऐसा नहीं है, तो डिफ़ॉल्ट वैल्यू 0 होगी.

सिस्टम, इंटरनल और एक्सटर्नल टच स्क्रीन और डिसप्ले के बीच अंतर करता है. ओरिएंटेशन के हिसाब से काम करने वाली इंटरनल टच स्क्रीन, इंटरनल डिसप्ले के ओरिएंटेशन के हिसाब से घूमती है. ओरिएंटेशन के हिसाब से काम करने वाली बाहरी टच स्क्रीन, बाहरी डिसप्ले के ओरिएंटेशन के हिसाब से घूमती है.

ओरिएंटेशन अवेयरनेस का इस्तेमाल, Nexus One जैसे डिवाइसों पर टच स्क्रीन को घुमाने के लिए किया जाता है. उदाहरण के लिए, जब डिवाइस को उसके सामान्य ओरिएंटेशन से घड़ी की सुई की दिशा में 90 डिग्री घुमाया जाता है, तो टच की सटीक पोज़िशन को फिर से मैप किया जाता है. इससे टच स्क्रीन के सटीक कोऑर्डिनेट सिस्टम के सबसे ऊपर बाएं कोने में किया गया टच, डिसप्ले के रोटेट किए गए कोऑर्डिनेट सिस्टम के सबसे ऊपर बाएं कोने में किए गए टच के तौर पर रिपोर्ट किया जाता है. ऐसा इसलिए किया जाता है, ताकि टच को उसी कोऑर्डिनेट सिस्टम के साथ रिपोर्ट किया जा सके जिसका इस्तेमाल ऐप्लिकेशन, अपने विज़ुअल एलिमेंट बनाने के लिए करते हैं.

Honeycomb से पहले, सभी टच डिवाइसों को ओरिएंटेशन के बारे में जानकारी देने वाला माना जाता था.

touch.gestureMode

परिभाषा: touch.gestureMode = pointer | spots | default

इससे पॉइंटर जेस्चर के लिए प्रज़ेंटेशन मोड तय होता है. यह कॉन्फ़िगरेशन प्रॉपर्टी सिर्फ़ तब काम की होती है, जब टच डिवाइस पॉइंटर टाइप का हो.

  • अगर यह वैल्यू pointer है, तो टच पैड जेस्चर को माउस पॉइंटर की तरह कर्सर के ज़रिए दिखाया जाता है.

  • अगर वैल्यू spots है, तो टच पैड जेस्चर को एक ऐंकर से दिखाया जाता है. यह ऐंकर, जेस्चर के सेंट्रॉइड को दिखाता है. साथ ही, यह गोल स्पॉट के सेट को दिखाता है, जो अलग-अलग उंगलियों की पोज़िशन को दिखाता है.

INPUT_PROP_SEMI_MT इनपुट प्रॉपर्टी सेट होने पर, डिफ़ॉल्ट वैल्यू pointer होती है. अगर यह प्रॉपर्टी सेट नहीं है, तो डिफ़ॉल्ट वैल्यू spots होती है.

X और Y फ़ील्ड

X और Y फ़ील्ड, संपर्क क्षेत्र के केंद्र की पोज़िशन की जानकारी देते हैं.

हिसाब लगाना

कैलकुलेशन आसान है: टच ड्राइवर से मिली पोज़िशन की जानकारी को आउटपुट कोऑर्डिनेट सिस्टम में लीनियर तरीके से इंटरपोलेट किया जाता है.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

touchMajor, touchMinor, toolMajor, toolMinor, size फ़ील्ड

touchMajor और touchMinor फ़ील्ड, आउटपुट यूनिट (पिक्सल) में संपर्क क्षेत्र के अनुमानित डाइमेंशन के बारे में बताते हैं.

toolMajor और toolMinor फ़ील्ड, आउटपुट यूनिट (पिक्सल) में टूल के अनुमानित डाइमेंशन के बारे में बताते हैं.

size फ़ील्ड, टच के सामान्य साइज़ के बारे में बताता है. यह साइज़, टच डिवाइस से महसूस किए जा सकने वाले सबसे बड़े टच के हिसाब से होता है. नॉर्मलाइज़ किया गया सबसे छोटा साइज़ 0.0 हो सकता है. इसका मतलब है कि कोई संपर्क नहीं है या इसे मेज़र नहीं किया जा सकता. वहीं, नॉर्मलाइज़ किया गया सबसे बड़ा साइज़ 1.0 हो सकता है. इसका मतलब है कि सेंसर एरिया पूरी तरह से भरा हुआ है.

जब लंबाई और चौड़ाई, दोनों का अनुमान लगाया जा सकता है, तब touchMajor फ़ील्ड, संपर्क क्षेत्र के लंबे डाइमेंशन के बारे में बताता है. वहीं, touchMinor फ़ील्ड, संपर्क क्षेत्र के छोटे डाइमेंशन के बारे में बताता है. जब संपर्क क्षेत्र के सिर्फ़ अनुमानित व्यास को मापा जा सकता है, तब touchMajor और touchMinor फ़ील्ड बराबर होते हैं.

इसी तरह, toolMajor फ़ील्ड, टूल के क्रॉस-सेक्शनल एरिया के लंबे डाइमेंशन के बारे में बताता है. वहीं, toolMinor फ़ील्ड, छोटे डाइमेंशन के बारे में बताता है.

अगर टच साइज़ उपलब्ध नहीं है, लेकिन टूल साइज़ उपलब्ध है, तो टूल साइज़ को टच साइज़ के बराबर सेट किया जाता है. इसके उलट, अगर टूल का साइज़ उपलब्ध नहीं है, लेकिन टच का साइज़ उपलब्ध है, तो टच का साइज़, टूल के साइज़ के बराबर सेट किया जाता है.

टच डिवाइस, टच साइज़ और टूल साइज़ को अलग-अलग तरीकों से मेज़र या रिपोर्ट करते हैं. फ़िलहाल, तीन तरह के मेज़रमेंट किए जा सकते हैं: डायमीटर, एरिया, और जियोमेट्रिक बाउंडिंग बॉक्स.

<touch.size.calibration< h4=""></touch.size.calibration<>

परिभाषा: touch.size.calibration = none | geometric | diameter | area | default

इससे पता चलता है कि टच ड्राइवर, टच साइज़ और टूल साइज़ की जानकारी देने के लिए किस तरह के मेज़रमेंट का इस्तेमाल करता है.

  • अगर वैल्यू none है, तो साइज़ शून्य पर सेट हो जाता है.

  • अगर वैल्यू geometric है, तो माना जाता है कि साइज़ को पोज़िशन की तरह ही, सरफेस यूनिट में तय किया गया है. इसलिए, इसे उसी तरह से स्केल किया जाता है.

  • अगर वैल्यू diameter है, तो साइज़ को टच या टूल के डायमीटर (चौड़ाई) के अनुपात में माना जाता है.

  • अगर वैल्यू area है, तो साइज़ को टच या टूल के एरिया के अनुपात में माना जाता है.

  • अगर वैल्यू default है, तो सिस्टम geometric कैलिब्रेशन का इस्तेमाल करता है. ऐसा तब होता है, जब raw.touchMajor या raw.toolMajor ऐक्सिस उपलब्ध हो. ऐसा न होने पर, यह none कैलिब्रेशन का इस्तेमाल करता है.

touch.size.scale

परिभाषा: touch.size.scale = <एक नॉन-नेगेटिव फ़्लोटिंग पॉइंट नंबर>

इससे कैलिब्रेशन में इस्तेमाल किए जाने वाले कॉन्स्टेंट स्केल फ़ैक्टर के बारे में पता चलता है.

डिफ़ॉल्ट वैल्यू 1.0 है.

touch.size.bias

परिभाषा: touch.size.bias = <नॉन-नेगेटिव फ़्लोटिंग पॉइंट नंबर>

कैलिब्रेशन में इस्तेमाल की जाने वाली बायस वैल्यू तय करता है.

डिफ़ॉल्ट वैल्यू 0.0 है.

touch.size.isSummed

परिभाषा: touch.size.isSummed = 0 | 1

इससे यह तय होता है कि साइज़ को सभी चालू संपर्कों के साइज़ के योग के तौर पर रिपोर्ट किया जाए या हर संपर्क के लिए अलग-अलग रिपोर्ट किया जाए.

  • अगर वैल्यू 1 है, तो रिपोर्ट किए गए साइज़ को इस्तेमाल करने से पहले, संपर्कों की संख्या से भाग दिया जाता है.

  • अगर वैल्यू 0 है, तो रिपोर्ट किए गए साइज़ का इस्तेमाल उसी तरह किया जाता है.

डिफ़ॉल्ट वैल्यू 0 है.

कुछ टच डिवाइस, खास तौर पर "सेमी-एमटी" डिवाइस, एक से ज़्यादा टच के अलग-अलग डाइमेंशन में अंतर नहीं कर पाते. इसलिए, वे साइज़ का ऐसा मेज़रमेंट दिखाते हैं जो उनके कुल एरिया या चौड़ाई को दिखाता है. ऐसे डिवाइसों के लिए, इस प्रॉपर्टी को सिर्फ़ 1 पर सेट किया जाना चाहिए. अगर आपको कोई संदेह है, तो इस वैल्यू को 0 पर सेट करें.

हिसाब लगाना

touchMajor, touchMinor, toolMajor, toolMinor, और size फ़ील्ड का कैलकुलेशन, तय किए गए कैलिब्रेशन पैरामीटर पर निर्भर करता है.

If raw.touchMajor and raw.toolMajor are available:
    touchMajor = raw.touchMajor
    touchMinor = raw.touchMinor
    toolMajor = raw.toolMajor
    toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
    toolMajor = touchMajor = raw.touchMajor
    toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
    touchMajor = toolMajor = raw.toolMajor
    touchMinor = toolMinor = raw.toolMinor
Else
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
    touchMajor = touchMajor / numberOfActiveContacts
    touchMinor = touchMinor / numberOfActiveContacts
    toolMajor = toolMajor / numberOfActiveContacts
    toolMinor = toolMinor / numberOfActiveContacts
    size = size / numberOfActiveContacts
End If

If touch.size.calibration == "none":
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
Else If touch.size.calibration == "geometric":
    outputScale = average(output.width / raw.width, output.height / raw.height)
    touchMajor = touchMajor * outputScale
    touchMinor = touchMinor * outputScale
    toolMajor = toolMajor * outputScale
    toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
    touchMajor = sqrt(touchMajor)
    touchMinor = touchMajor
    toolMajor = sqrt(toolMajor)
    toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
    touchMinor = touchMajor
    toolMinor = toolMajor
End If

If touchMajor != 0:
    output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
    output.touchMajor = 0
End If

If touchMinor != 0:
    output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
    output.touchMinor = 0
End If

If toolMajor != 0:
    output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
    output.toolMajor = 0
End If

If toolMinor != 0:
    output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
    output.toolMinor = 0
End If

output.size = size

प्रेशर फ़ील्ड

pressure फ़ील्ड से पता चलता है कि टच डिवाइस पर कितना फ़िज़िकल प्रेशर लगाया गया है. इसकी वैल्यू 0.0 (कोई टच नहीं) से 1.0 (सामान्य प्रेशर) के बीच होती है.

शून्य प्रेशर का मतलब है कि टूल होवर कर रहा है.

touch.pressure.calibration

परिभाषा: touch.pressure.calibration = none | physical | amplitude | default

इससे पता चलता है कि टच ड्राइवर, प्रेशर की जानकारी देने के लिए किस तरह के मेज़रमेंट का इस्तेमाल करता है.

  • अगर वैल्यू none है, तो प्रेशर की जानकारी नहीं होती. इसलिए, टच करने पर इसे 1.0 और कर्सर घुमाने पर 0.0 पर सेट किया जाता है.

  • अगर वैल्यू physical है, तो माना जाता है कि प्रेशर ऐक्सिस, टच पैड पर लगाए गए प्रेशर की असल फ़िज़िकल इंटेंसिटी को मेज़र करता है.

  • अगर वैल्यू amplitude है, तो माना जाता है कि प्रेशर ऐक्सिस, सिग्नल के ऐम्प्लिट्यूड को मेज़र करता है. यह ऐम्प्लिट्यूड, संपर्क के साइज़ और लगाए गए प्रेशर से जुड़ा होता है.

  • अगर वैल्यू default है, तो सिस्टम physical कैलिब्रेशन का इस्तेमाल करता है. ऐसा तब होता है, जब प्रेशर ऐक्सिस उपलब्ध हो. ऐसा न होने पर, none का इस्तेमाल किया जाता है.

touch.pressure.scale

परिभाषा: touch.pressure.scale = <नॉन-नेगेटिव फ़्लोटिंग पॉइंट नंबर>

इससे कैलिब्रेशन में इस्तेमाल किए जाने वाले कॉन्स्टेंट स्केल फ़ैक्टर के बारे में पता चलता है.

डिफ़ॉल्ट वैल्यू 1.0 / raw.pressure.max है.

हिसाब लगाना

pressure फ़ील्ड की वैल्यू, कैलिब्रेशन के लिए तय किए गए पैरामीटर पर निर्भर करती है.

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

ओरिएंटेशन और टिल्ट फ़ील्ड

orientation फ़ील्ड, टच और टूल के ओरिएंटेशन को ऐंगुलर मेज़रमेंट के तौर पर दिखाता है. 0 ओरिएंटेशन से पता चलता है कि मुख्य ऐक्सिस वर्टिकल है. -PI/2 से पता चलता है कि मुख्य ऐक्सिस बाईं ओर है. PI/2 से पता चलता है कि मुख्य ऐक्सिस दाईं ओर है. जब कोई स्टाइलस टूल मौजूद होता है, तो ओरिएंटेशन रेंज को -PI या PI से पूरी सर्कल रेंज में दिखाया जा सकता है.

tilt फ़ील्ड, टूल के झुकाव को ऐंगुलर मेज़रमेंट के तौर पर दिखाता है. 0 का झुकाव दिखाता है कि टूल, सतह के लंबवत है. PI/2 का झुकाव दिखाता है कि टूल, सतह पर सपाट है.

touch.orientation.calibration

परिभाषा: touch.orientation.calibration = none | interpolated | vector | default

इससे पता चलता है कि ओरिएंटेशन की जानकारी देने के लिए, टच ड्राइवर किस तरह के मेज़रमेंट का इस्तेमाल करता है.

  • अगर वैल्यू none है, तो ओरिएंटेशन की जानकारी नहीं होती. इसलिए, इसे 0 पर सेट किया जाता है.
  • अगर वैल्यू interpolated है, तो ओरिएंटेशन को लीनियर तरीके से इंटरपोलेट किया जाता है. इससे raw.orientation.min की रॉ वैल्यू, -PI/2 पर मैप होती है और raw.orientation.max की रॉ वैल्यू, PI/2 पर मैप होती है. (raw.orientation.min + raw.orientation.max) / 2 की बीच की वैल्यू, 0 पर मैप होती है.
  • अगर वैल्यू vector है, तो ओरिएंटेशन को एक पैक्ड वेक्टर के तौर पर समझा जाता है. इसमें दो साइंड 4-बिट फ़ील्ड होते हैं. इस प्रज़ेंटेशन का इस्तेमाल, Atmel ऑब्जेक्ट पर आधारित प्रोटोकॉल के हिस्सों पर किया जाता है. डिकोड होने पर, वेक्टर से ओरिएंटेशन ऐंगल और कॉन्फ़िडेंस मैग्नीट्यूड मिलता है. कॉन्फ़िडेंस मैग्नीट्यूड का इस्तेमाल, साइज़ की जानकारी को स्केल करने के लिए किया जाता है. हालांकि, ऐसा तब नहीं किया जाता, जब यह ज्यामितीय हो.
  • अगर वैल्यू default है, तो सिस्टम interpolated कैलिब्रेशन का इस्तेमाल करता है. ऐसा तब होता है, जब ओरिएंटेशन ऐक्सिस उपलब्ध हो. अगर ऐसा नहीं है, तो none का इस्तेमाल किया जाता है.

हिसाब लगाना

orientation और tilt फ़ील्ड का कैलकुलेशन, तय किए गए कैलिब्रेशन पैरामीटर और उपलब्ध इनपुट पर निर्भर करता है.

If touch.tiltX and touch.tiltY are available:
    tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
    tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
    tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
    tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
    output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
    output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
    center = average(raw.orientation.min, raw.orientation.max)
    output.orientation = PI / (raw.orientation.max - raw.orientation.min)
    output.tilt = 0
Else If touch.orientation.calibration == "vector":
    c1 = (raw.orientation & 0xF0) >> 4
    c2 = raw.orientation & 0x0F

    If c1 != 0 or c2 != 0:
        If c1 >= 8 Then c1 = c1 - 16
        If c2 >= 8 Then c2 = c2 - 16
        angle = atan2(c1, c2) / 2
        confidence = sqrt(c1*c1 + c2*c2)

        output.orientation = angle

        If touch.size.calibration == "diameter" or "area":
            scale = 1.0 + confidence / 16
            output.touchMajor *= scale
            output.touchMinor /= scale
            output.toolMajor *= scale
            output.toolMinor /= scale
        End If
    Else
        output.orientation = 0
    End If
    output.tilt = 0
Else
    output.orientation = 0
    output.tilt = 0
End If

If orientation aware:
    If screen rotation is 90 degrees:
        output.orientation = output.orientation - PI / 2
    Else If screen rotation is 270 degrees:
        output.orientation = output.orientation + PI / 2
    End If
End If

दूरी वाला फ़ील्ड

distance फ़ील्ड, टूल और टच डिवाइस की सतह के बीच की दूरी के बारे में बताता है. 0.0 वैल्यू का मतलब है कि डिवाइस सीधे तौर पर संपर्क में है. वहीं, ज़्यादा वैल्यू का मतलब है कि डिवाइस सतह से दूर है.

touch.distance.calibration

परिभाषा: touch.distance.calibration = none | scaled | default

इससे पता चलता है कि दूरी की जानकारी देने के लिए, टच ड्राइवर किस तरह के मेज़रमेंट का इस्तेमाल करता है.

  • अगर वैल्यू none है, तो दूरी की जानकारी नहीं होती. इसलिए, इसे 0 पर सेट किया जाता है.

  • अगर वैल्यू scaled है, तो रिपोर्ट की गई दूरी को एक कॉन्स्टेंट स्केल फ़ैक्टर से गुणा किया जाता है.

  • अगर वैल्यू default है, तो सिस्टम scaled कैलिब्रेशन का इस्तेमाल करता है. ऐसा तब होता है, जब दूरी का ऐक्सिस उपलब्ध हो. ऐसा न होने पर, none का इस्तेमाल किया जाता है.

touch.distance.scale

परिभाषा: touch.distance.scale = <एक नॉन-नेगेटिव फ़्लोटिंग पॉइंट नंबर>

इससे कैलिब्रेशन में इस्तेमाल किए जाने वाले कॉन्स्टेंट स्केल फ़ैक्टर के बारे में पता चलता है.

डिफ़ॉल्ट वैल्यू 1.0 है.

हिसाब लगाना

distance फ़ील्ड का कैलकुलेशन, कैलिब्रेशन के लिए तय किए गए पैरामीटर पर निर्भर करता है.

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

उदाहरण

# Input device configuration file for a touch screen that supports pressure,
# size and orientation. The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

साथ काम करने से जुड़े नोट

Android Ice Cream Sandwich 4.0 में, टच डिवाइसों के लिए कॉन्फ़िगरेशन प्रॉपर्टी में काफ़ी बदलाव किए गए हैं. टच डिवाइसों के लिए, इनपुट डिवाइस की सभी कॉन्फ़िगरेशन फ़ाइलों को अपडेट करना ज़रूरी है, ताकि नई कॉन्फ़िगरेशन प्रॉपर्टी का इस्तेमाल किया जा सके.

पुराने टच डिवाइस के ड्राइवर भी अपडेट करने पड़ सकते हैं.

वर्चुअल बटन मैप फ़ाइलें

वर्चुअल बटन लागू करने के लिए, टच डिवाइसों का इस्तेमाल किया जा सकता है.

ऐसा करने के कई तरीके हैं. यह टच कंट्रोलर की क्षमताओं पर निर्भर करता है. कुछ टच कंट्रोलर को सीधे तौर पर कॉन्फ़िगर किया जा सकता है, ताकि फ़र्मवेयर रजिस्टर सेट करके सॉफ़्ट बटन लागू किए जा सकें. अन्य मामलों में, सॉफ़्टवेयर में टच कोऑर्डिनेट से की कोड तक मैपिंग करना बेहतर होता है.

जब सॉफ़्टवेयर में वर्चुअल बटन लागू किए जाते हैं, तो कर्नेल को बोर्ड प्रॉपर्टी के तौर पर virtualkeys.<devicename> नाम की वर्चुअल बटन मैप फ़ाइल एक्सपोर्ट करनी होगी. उदाहरण के लिए, अगर टच स्क्रीन डिवाइस के ड्राइवर अपना नाम "touchyfeely" बताते हैं, तो वर्चुअल बटन मैप फ़ाइल का पाथ /sys/board_properties/virtualkeys.touchyfeely होना चाहिए.

वर्चुअल बटन मैप फ़ाइल में, टच स्क्रीन पर वर्चुअल बटन के कोऑर्डिनेट और Linux बटन कोड की जानकारी होती है.

वर्चुअल बटन मैप फ़ाइल के अलावा, एक बटन लेआउट फ़ाइल और बटन वर्ण मैप फ़ाइल भी होनी चाहिए. इससे Linux बटन कोड को Android बटन कोड से मैप किया जा सकता है. साथ ही, कीबोर्ड डिवाइस के टाइप (आम तौर पर SPECIAL_FUNCTION) के बारे में बताया जा सकता है.

सिंटैक्स

वर्चुअल की मैप फ़ाइल, एक सादे टेक्स्ट वाली फ़ाइल होती है. इसमें वर्चुअल बटन के लेआउट की जानकारी का क्रम होता है. इसे नई लाइनों या कोलन से अलग किया जाता है.

टिप्पणी वाली लाइनें '#' से शुरू होती हैं और लाइन के आखिर तक जारी रहती हैं.

हर वर्चुअल पासकोड के बारे में, कोलन से अलग किए गए छह कॉम्पोनेंट से जानकारी दी जाती है:

  • 0x01: वर्शन कोड. हमेशा 0x01 होना चाहिए.
  • <Linux key code>: वर्चुअल बटन का Linux बटन कोड.
  • <centerX>: वर्चुअल बटन के बीच का X पिक्सल कोऑर्डिनेट.
  • <centerY>: वर्चुअल बटन के बीच का Y पिक्सल कोऑर्डिनेट.
  • <width>: पिक्सल में वर्चुअल बटन की चौड़ाई.
  • <height>: पिक्सल में वर्चुअल बटन की लंबाई.

सभी कोऑर्डिनेट और साइज़, डिसप्ले कोऑर्डिनेट सिस्टम के हिसाब से तय किए जाते हैं.

यहां वर्चुअल बटन मैप की एक फ़ाइल दी गई है, जिसे एक ही लाइन में लिखा गया है.

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

एक ही वर्चुअल बटन मैप फ़ाइल को कई लाइनों में भी लिखा जा सकता है.

# One key per line
0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

ऊपर दिए गए उदाहरण में, टच स्क्रीन का रिज़ॉल्यूशन 480x800 है. इसलिए, सभी वर्चुअल बटन का <centerY> कोऑर्डिनेट 835 होता है. यह टच स्क्रीन के दिखने वाले हिस्से से थोड़ा नीचे होता है.

पहली कुंजी का Linux स्कैन कोड 158 (KEY_BACK) है. इसका centerX 55, centerY 835, चौड़ाई 90, और ऊंचाई 55 है.

उदाहरण

वर्चुअल की मैप फ़ाइल: /sys/board_properties/virtualkeys.touchyfeely.

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

की लेआउट फ़ाइल: /system/usr/keylayout/touchyfeely.kl.

key 158 BACK
key 139 MENU
key 172 HOME
key 217 SEARCH

मुख्य वर्ण मैप फ़ाइल: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

इनडायरेक्ट मल्टी-टच पॉइंटर जेस्चर

पॉइंटर मोड में, सिस्टम इन जेस्चर को समझता है:

  • एक उंगली से टैप करना: क्लिक करना.
  • एक उंगली से स्वाइप करने पर: पॉइंटर की जगह बदलें.
  • एक उंगली से मोशन और बटन दबाने पर: पॉइंटर को खींचें और छोड़ें.
  • दो उंगलियों को एक ही दिशा में मूव करने पर: पॉइंटर के नीचे मौजूद हिस्से को उस दिशा में खींचें और छोड़ें. पॉइंटर खुद नहीं हिलता.
  • दो उंगलियों को एक-दूसरे की ओर या अलग-अलग दिशाओं में ले जाने पर: पॉइंटर के आस-पास के हिस्से को पैन/स्केल/रोटेट किया जा सकता है. पॉइंटर खुद नहीं हिलता.
  • एक से ज़्यादा उंगलियों से किया जाने वाला मोशन: फ़्रीफ़ॉर्म जेस्चर.

पाम रिजेक्शन

Android 13 से, सिस्टम में पहले से मौजूद फ़्रेमवर्क चालू होने पर, हथेली से होने वाले इनपुट को सिस्टम अपने-आप अस्वीकार कर सकता है. इन-हाउस, कस्टम-बिल्ट सलूशन अब भी काम करते हैं. हालांकि, हथेली का पता चलने पर TOOL_TYPE_PALM फ़्लैग दिखाने के लिए, उनमें बदलाव करना पड़ सकता है. पहले से मौजूद फ़्रेमवर्क, कस्टम समाधानों के साथ भी काम करता है.

असल मॉडल, जेस्चर डेटा के शुरुआती 90 मिलीसेकंड, मौजूदा पॉइंटर, और आस-पास के पॉइंटर को देखता है. इसके बाद, यह देखता है कि टच, डिसप्ले के किनारे से कितनी दूर हैं. इसके बाद, यह हर पॉइंटर के आधार पर तय करता है कि कौनसे पॉइंटर हथेलियां हैं. यह हर संपर्क के साइज़ को भी ध्यान में रखता है, जैसा कि touchMajor और touchMinor ने बताया है. इसके बाद, Android फ़्रेमवर्क, टच स्ट्रीम से उन पॉइंटर को हटा देता है जिन्हें हथेली के तौर पर मार्क किया गया है.

अगर ऐप्लिकेशन को पहले ही पॉइंटर भेजा जा चुका है, तो सिस्टम इनमें से कोई एक काम करता है:

  • (अगर अन्य पॉइंटर चालू हैं) ACTION_POINTER_UP और FLAG_CANCELED पर सेट किए गए पॉइंटर को रद्द करता है.
  • (अगर यह एकमात्र पॉइंटर है) ACTION_CANCEL के साथ पॉइंटर को रद्द करता है.

सार्वजनिक एपीआई, MotionEvent.FLAG_CANCELED से पता चलता है कि मौजूदा इवेंट से उपयोगकर्ता की कार्रवाई ट्रिगर नहीं होनी चाहिए. यह फ़्लैग, ACTION_CANCEL और ACTION_POINTER_UP, दोनों के लिए सेट किया गया है.

अगर हथेली के पॉइंटर को ऐप्लिकेशन पर नहीं भेजा गया, तो सिस्टम पॉइंटर को हटा देता है.

पाम रिजेक्शन की सुविधा चालू करना

  1. अपने टच ड्राइवर में, input_abs_set_res मैक्रो का इस्तेमाल करके, इन फ़ील्ड के लिए रिज़ॉल्यूशन सेट करें. इनकी इकाइयां पिक्सल प्रति मिलीमीटर में होती हैं:
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    ABS_MT_TOUCH_MINOR के लिए सहायता देना ज़रूरी नहीं है. हालांकि, अगर आपका डिवाइस इस सुविधा के साथ काम करता है, तो पक्का करें कि रिज़ॉल्यूशन सही तरीके से सेट किया गया हो.

  2. यह पुष्टि करने के लिए कि फ़ील्ड सही तरीके से सेट किए गए हैं, यह चलाएं:
        $ adb shell getevent -li
    
  3. रनटाइम के दौरान इस सुविधा को चालू करने के लिए, यह कमांड चलाएं:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. system_server की प्रोसेस को रीस्टार्ट करें.
         $ adb shell stop && adb shell start
        
  5. पुष्टि करें कि adb shell dumpsys input से यह पता चलता है कि UnwantedInteractionBlocker में पाम रिजेक्टर मौजूद हैं. अगर ऐसा नहीं होता है, तो इनपुट से जुड़े लॉग देखें. इससे आपको पता चलेगा कि क्या गलत कॉन्फ़िगर किया गया है.

    रेफ़रंस के लिए, यह उदाहरण देखें:

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. इस सुविधा को हमेशा के लिए चालू करने के लिए, अपनी init**rc फ़ाइल में sysprop कमांड जोड़ें:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

इस बारे में और पढ़ें