الأجهزة التي تعمل باللمس

يدعم نظام التشغيل Android مجموعة متنوعة من شاشات اللمس ولوحات اللمس، بما في ذلك الأجهزة اللوحية الرقمية المعتمدة على القلم.

شاشات اللمس هي أجهزة تعمل باللمس مرتبطة بشاشة عرض بحيث يكون لدى المستخدم انطباع بالتعامل مباشرة مع العناصر الموجودة على الشاشة.

لوحات اللمس هي أجهزة تعمل باللمس غير مرتبطة بشاشة عرض، مثل الكمبيوتر اللوحي الخاص بالتحويل الرقمي. تُستخدم لوحات اللمس عادةً للإشارة أو لتحديد المواقع غير المباشرة المطلقة أو التحكم القائم على الإيماءات في واجهة المستخدم.

يمكن أن تحتوي الأجهزة التي تعمل باللمس على أزرار تشبه وظائفها أزرار الماوس.

يمكن أحيانًا التعامل مع أجهزة اللمس باستخدام مجموعة متنوعة من الأدوات المختلفة مثل الأصابع أو القلم اعتمادًا على تقنية مستشعر اللمس الأساسية.

تُستخدم أجهزة اللمس أحيانًا لتنفيذ المفاتيح الافتراضية. على سبيل المثال، في بعض أجهزة Android، تمتد منطقة مستشعر شاشة اللمس إلى ما هو أبعد من حافة الشاشة وتؤدي غرضًا مزدوجًا كجزء من لوحة المفاتيح الحساسة للمس.

نظرًا للتنوع الكبير في الأجهزة التي تعمل باللمس، يعتمد Android على عدد كبير من خصائص التكوين لوصف الخصائص والسلوك المرغوب لكل جهاز.

لمس تصنيف الجهاز

يتم تصنيف جهاز الإدخال كجهاز متعدد اللمس إذا توفرت الحالتان التاليتان:

  • يُبلغ جهاز الإدخال عن وجود المحورين المطلقين ABS_MT_POSITION_X و ABS_MT_POSITION_Y .
  • لا يحتوي جهاز الإدخال على أي أزرار للوحة الألعاب. يحل هذا الشرط الغموض مع بعض لوحات الألعاب التي تُبلغ عن المحاور برموز تتداخل مع تلك الخاصة بمحاور MT.

يتم تصنيف جهاز الإدخال كجهاز يعمل بلمسة واحدة إذا توفرت الحالتان التاليتان:

  • جهاز الإدخال غير مصنف كجهاز متعدد اللمس. يتم تصنيف جهاز الإدخال إما كجهاز يعمل بلمسة واحدة أو كجهاز متعدد اللمس، وليس كلاهما أبدًا.
  • يُبلغ جهاز الإدخال عن وجود المحورين المطلقين ABS_X و ABS_Y ، ووجود رمز مفتاح BTN_TOUCH .

عندما يتم تصنيف جهاز إدخال كجهاز يعمل باللمس، يتم تحديد وجود المفاتيح الافتراضية من خلال محاولة تحميل ملف خريطة المفتاح الظاهري للجهاز. في حالة توفر خريطة مفاتيح افتراضية، فسيتم أيضًا تحميل ملف تخطيط المفتاح للجهاز. ارجع إلى [ملفات خريطة المفاتيح الافتراضية](#virtual-key-map-files) للحصول على معلومات حول موقع هذه الملفات وتنسيقها.

بعد ذلك، يقوم النظام بتحميل ملف تكوين جهاز الإدخال لجهاز اللمس.

يجب أن تحتوي جميع أجهزة اللمس المدمجة على ملفات تكوين جهاز الإدخال. في حالة عدم وجود ملف تكوين جهاز الإدخال، يختار النظام تكوينًا افتراضيًا مناسبًا للأجهزة الطرفية التي تعمل باللمس للأغراض العامة مثل شاشات اللمس الخارجية USB أو Bluetooth HID أو لوحات اللمس. لم يتم تصميم هذه الإعدادات الافتراضية لشاشات اللمس المدمجة ويمكن أن تؤدي إلى سلوك غير صحيح.

بعد تحميل تكوين جهاز الإدخال، يقوم النظام بتصنيف جهاز الإدخال على أنه شاشة تعمل باللمس ، أو لوحة لمس ، أو جهاز مؤشر .

  • يتم استخدام جهاز بشاشة تعمل باللمس للتلاعب المباشر بالأشياء الموجودة على الشاشة. يلمس المستخدم الشاشة مباشرة، لذلك لا يتطلب النظام أي إمكانيات إضافية للإشارة إلى الكائنات التي يتم التلاعب بها.
  • يتم استخدام جهاز لوحة اللمس لتوفير معلومات تحديد الموقع المطلقة لأحد التطبيقات حول اللمسات على منطقة مستشعر معينة. يمكن أن يكون مفيدًا لأقراص التحويل الرقمي.
  • يتم استخدام جهاز المؤشر للتلاعب غير المباشر بالكائنات الموجودة على الشاشة باستخدام المؤشر. يتم تفسير الأصابع على أنها إيماءات مؤشر اللمس المتعدد. يتم تفسير الأدوات الأخرى، مثل الأقلام، باستخدام المواضع المطلقة. راجع إيماءات مؤشر اللمس المتعدد غير المباشرة لمزيد من المعلومات.

يتم استخدام القواعد التالية لتصنيف جهاز الإدخال كشاشة تعمل باللمس، أو لوحة اللمس، أو جهاز المؤشر.

  • إذا تم تعيين الخاصية touch.deviceType ، فسيتم تعيين نوع الجهاز كما هو محدد.
  • إذا أبلغ جهاز الإدخال عن وجود خاصية الإدخال INPUT_PROP_DIRECT (من خلال EVIOCGPROP ioctl)، فسيتم تعيين نوع الجهاز على شاشة تعمل باللمس . يفترض هذا الشرط أن أجهزة اللمس ذات الإدخال المباشر متصلة بشاشة عرض متصلة أيضًا.
  • إذا أبلغ جهاز الإدخال عن وجود خاصية الإدخال INPUT_PROP_POINTER (من خلال EVIOCGPROP ioctl)، فسيتم تعيين نوع الجهاز على المؤشر .
  • إذا أبلغ جهاز الإدخال عن وجود المحورين النسبيين REL_X أو REL_Y ، فسيتم تعيين نوع الجهاز على لوحة اللمس . يحل هذا الشرط غموض أجهزة الإدخال التي تتكون من الماوس ولوحة اللمس. في هذه الحالة، لا يتم استخدام لوحة اللمس للتحكم في المؤشر لأن الماوس يتحكم فيه بالفعل.
  • وبخلاف ذلك، يتم ضبط نوع الجهاز على المؤشر . يضمن هذا الإعداد الافتراضي أن لوحات اللمس التي لم يتم تخصيصها لأي غرض خاص آخر تتحكم في المؤشر.

أزرار

الأزرار عبارة عن عناصر تحكم اختيارية يمكن للتطبيقات استخدامها لأداء وظائف إضافية. تعمل الأزرار الموجودة على الأجهزة التي تعمل باللمس بشكل مشابه لأزرار الماوس ويتم استخدامها بشكل أساسي مع أجهزة اللمس من نوع المؤشر أو مع القلم.

الأزرار التالية مدعومة:

  • BTN_LEFT : تم تعيينه إلى MotionEvent.BUTTON_PRIMARY .
  • BTN_RIGHT : تم تعيينه إلى MotionEvent.BUTTON_SECONDARY .
  • BTN_MIDDLE : تم تعيينه إلى MotionEvent.BUTTON_MIDDLE .
  • BTN_BACK و BTN_SIDE : تم تعيينهما إلى MotionEvent.BUTTON_BACK . يؤدي الضغط على هذا الزر أيضًا إلى إنشاء ضغطة مفتاح باستخدام رمز المفتاح KeyEvent.KEYCODE_BACK .
  • BTN_FORWARD و BTN_EXTRA : تم تعيينهما إلى MotionEvent.BUTTON_FORWARD . يؤدي الضغط على هذا الزر أيضًا إلى تجميع الضغط على مفتاح باستخدام رمز المفتاح KeyEvent.KEYCODE_FORWARD .
  • BTN_STYLUS : تم تعيينه إلى MotionEvent.BUTTON_SECONDARY .
  • BTN_STYLUS2 : تم تعيينه إلى MotionEvent.BUTTON_TERTIARY .

الأدوات وأنواع الأدوات

الأداة عبارة عن إصبع أو قلم أو أي جهاز آخر يُستخدم للتفاعل مع جهاز اللمس. يمكن لبعض الأجهزة التي تعمل باللمس التمييز بين أنواع مختلفة من الأدوات.

في أماكن أخرى من Android، كما هو الحال في MotionEvent API، غالبًا ما يُشار إلى الأداة على أنها مؤشر .

يتم دعم أنواع الأدوات التالية:

  • 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 دعم مجموعة واسعة من الأجهزة الطرفية التي تعمل باللمس، مثل شاشات اللمس الخارجية HID متعددة اللمس، وذلك باستخدام برامج تشغيل غير معدلة.

تشغيل الجهاز باللمس

فيما يلي ملخص موجز لعملية تشغيل الجهاز الذي يعمل باللمس على نظام 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 درجة من اتجاهه الطبيعي، تتم إعادة تعيين المواضع المطلقة لعمليات اللمس بحيث يتم الإبلاغ عن اللمسة الموجودة في الزاوية العلوية اليسرى من نظام الإحداثيات المطلق لشاشة اللمس على أنها لمسة في الزاوية العلوية اليسرى زاوية نظام الإحداثيات المدورة للشاشة. ويتم ذلك بحيث يتم الإبلاغ عن اللمسات بنفس نظام الإحداثيات الذي تستخدمه التطبيقات لرسم عناصرها المرئية.

قبل ظهور قرص العسل، كان من المفترض أن تكون جميع أجهزة اللمس على علم بالاتجاه.

touch.gestureMode

التعريف: touch.gestureMode = pointer | spots | default

يحدد وضع العرض التقديمي لإيماءات المؤشر. تكون خاصية التكوين هذه ذات صلة فقط عندما يكون جهاز اللمس من النوع المؤشر .

  • إذا كانت القيمة عبارة عن pointer ، فسيتم عرض إيماءات لوحة اللمس عن طريق مؤشر مشابه لمؤشر الماوس.

  • إذا كانت القيمة عبارة عن spots ، فسيتم تقديم إيماءات لوحة اللمس بواسطة مرساة تمثل المركز الأوسط للإيماءة ومجموعة من النقاط الدائرية التي تمثل موضع الأصابع الفردية.

القيمة الافتراضية هي pointer عند تعيين خاصية الإدخال INPUT_PROP_SEMI_MT أو 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، حقول الحجم

يصف حقلا 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 .

لا تستطيع بعض الأجهزة التي تعمل باللمس، وخاصة الأجهزة "Semi-MT" التمييز بين الأبعاد الفردية لجهات اتصال متعددة، لذا فهي تقوم بالإبلاغ عن قياس الحجم الذي يمثل المساحة الإجمالية أو العرض. يجب تعيين هذه الخاصية على 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 MAPS إلى -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 رقم النقطة العائمة غير السلبية

يحدد عامل مقياس ثابت يستخدم في المعايرة.

القيمة الافتراضية هي 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. يجب تحديث جميع ملفات تكوين جهاز الإدخال لأجهزة اللمس لاستخدام خصائص التكوين الجديدة.

قد تحتاج برامج تشغيل أجهزة اللمس الأقدم أيضًا إلى تحديثها.

ملفات خريطة المفاتيح الافتراضية

غالبًا ما تستخدم أجهزة اللمس لتنفيذ المفاتيح الافتراضية.

هناك عدة طرق للقيام بذلك ، اعتمادًا على قدرات وحدة تحكم اللمس. يمكن تكوين بعض وحدات التحكم التي تعمل باللمس مباشرة لتنفيذ مفاتيح ناعمة عن طريق تعيين سجلات البرامج الثابتة. في أوقات أخرى ، من المستحسن إجراء التعيين من إحداثيات اللمس إلى الرموز الرئيسية في البرامج.

عند تطبيق المفاتيح الافتراضية في البرنامج ، يجب على kernel تصدير ملف خريطة مفتاح افتراضي يسمى virtualkeys.<devicename> كخاصية لوح. على سبيل المثال ، إذا أبلغت برامج تشغيل جهاز الشاشة التي تعمل باللمس عن اسمها باسم "Soundyfeely" ، فيجب أن يحتوي ملف خريطة المفتاح الافتراضي على path /sys/board_properties/virtualkeys.touchyfeely .

يصف ملف خريطة مفتاح افتراضي الإحداثيات ورموز مفاتيح Linux للمفاتيح الافتراضية على شاشة اللمس.

بالإضافة إلى ملف خريطة المفاتيح الظاهرية ، يجب أن يكون هناك ملف تخطيط مفاتيح مقابل وملف خريطة حرف المفتاح لتعيين رموز مفتاح Linux إلى رموز مفاتيح Android ولتحديد نوع جهاز لوحة المفاتيح (عادةً ما SPECIAL_FUNCTION ).

بناء الجملة

ملف خريطة المفتاح الظاهري هو ملف نصي عادي يتكون من سلسلة من أوصاف تخطيط المفاتيح الظاهرية إما مفصولة بواسطة الخطوط الجديدة أو بواسطة colons.

تبدأ خطوط التعليق بـ "#" وتستمر حتى نهاية الخط.

يتم وصف كل مفتاح افتراضي من خلال 6 مكونات من القولون:

  • 0x01 : رمز الإصدار. يجب أن يكون دائما 0x01 .
  • <Linux Key Code>: رمز مفتاح Linux للمفتاح الظاهري.
  • <CenterX>: إحداثيات X Pixel لمركز المفتاح الظاهري.
  • <Centery>: إحداثي Y Pixel من مركز المفتاح الظاهري.
  • <didth>: عرض المفتاح الظاهري بالبكسل.
  • <Shight>: ارتفاع المفتاح الظاهري بالبكسل.

يتم تحديد جميع الإحداثيات والأحجام من حيث نظام إحداثيات العرض.

فيما يلي ملف خريطة مفتاح افتراضي كل مكتوبة على سطر واحد.

# 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

في المثال أعلاه ، فإن شاشة اللمس لها دقة 480 × 800. وفقًا لذلك ، تحتوي جميع المفاتيح الافتراضية على إحداثيات <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

إيماءات مؤشر اللمسات غير المباشرة غير المباشرة

في وضع المؤشر ، يفسر النظام الإيماءات التالية:

  • نقر إصبع واحد: انقر.
  • حركة إصبع واحدة: حرك المؤشر.
  • يضغط زر حركة الإصبع المفرد: اسحب المؤشر.
  • حركة إصبعين يتحركان في نفس الاتجاه: اسحب المنطقة أسفل المؤشر في هذا الاتجاه. المؤشر نفسه لا يتحرك.
  • حركة إصبعين يتجهان نحو بعضهما البعض أو بصرف النظر في اتجاهات مختلفة: المقلاة/المقياس/تدوير المنطقة المحيطة بالمؤشر. المؤشر نفسه لا يتحرك.
  • حركة إصبع متعددة: لفتة freeform.

رفض النخيل

اعتبارًا من 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. لتمكين الميزة أثناء وقت التشغيل ، Run:
        $ 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. لتمكين الميزة بشكل دائم ، أضف الأمر sysprop المقابل في ملف init**rc الخاص بك:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

قراءة متعمقة