टच डिवाइस

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 इनपुट प्रॉपर्टी की मौजूदगी की जानकारी देता है, तो डिवाइस टाइप को पॉइंटर पर सेट किया जाता है.
  • अगर इनपुट डिवाइस, 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: (ज़रूरी नहीं) टूल के झुकाव की जानकारी देता है. यह जानकारी, टच डिवाइस के सतह से, एक्स ऐक्सिस के साथ मिलकर मिलती है.
    • ABS_TILT_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
रॉ ऐक्सिस की सटीकता. उदाहरण के लिए, फ़ज़ = 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 = none | geometric | diameter | area | default

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

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

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

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

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

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

touch.size.scale

परिभाषा: touch.size.scale = <a non-negative floating point number>

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

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

touch.size.bias

परिभाषा: touch.size.bias = <a non-negative floating point number>

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

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

touch.size.isSummed

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

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

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

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

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

कुछ टच डिवाइस, खास तौर पर "सेमी-एमटी" डिवाइस, कई संपर्कों के अलग-अलग डाइमेंशन के बीच अंतर नहीं कर सकते. इसलिए, वे साइज़ का ऐसा मेज़रमेंट दिखाते हैं जो उनके कुल क्षेत्र या चौड़ाई को दिखाता है. इस प्रॉपर्टी को सिर्फ़ ऐसे डिवाइसों के लिए 1 पर सेट किया जाना चाहिए. अगर आपको नहीं पता कि GTIN सही है या नहीं, तो इस एट्रिब्यूट की वैल्यू 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 है, तो माना जाता है कि प्रेशर ऐक्सिस, सिग्नल के ऐम्प्लitude को मेज़र करता है. यह ऐम्प्लitude, संपर्क के साइज़ और लागू किए गए प्रेशर से जुड़ा होता है.

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

touch.pressure.scale

परिभाषा: touch.pressure.scale = <a non-negative floating point number>

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

डिफ़ॉल्ट वैल्यू 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 = <a non-negative floating point number>

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

डिफ़ॉल्ट वैल्यू 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 होता है. यह टच स्क्रीन के दिखने वाले हिस्से से थोड़ा नीचे होता है.

पहली कुंजी में, 158 (KEY_BACK) का Linux स्कैन कोड, 55 का centerX, 835 का centerY, 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
    

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