टच डिवाइस

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

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

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

टच डिवाइसों में ऐसे बटन हो सकते हैं जिनके फ़ंक्शन, माउस के बटन के फ़ंक्शन से मिलते-जुलते हों.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

बटन

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

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

  • 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 के पिछले वर्शन में, "up" इवेंट की रिपोर्ट भेजने के लिए, दबाव की वैल्यू 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. अगर टच डिवाइस का टाइप pointer है, तो 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 हो.

  • अगर वैल्यू 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 = 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 Object Based Protocol के पार्ट पर किया जाता है. डिकोड करने पर, वेक्टर से ओरिएंटेशन ऐंगल और कॉन्फ़िडेंस मैग्नीट्यूड मिलता है. कॉन्फ़िडेंस मैग्नीट्यूड का इस्तेमाल, साइज़ की जानकारी को स्केल करने के लिए किया जाता है. हालांकि, ऐसा तब तक किया जाता है, जब तक कि वह जानकारी ज्यामितीय न हो.
  • अगर वैल्यू 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
    

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