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

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

شاشات اللمس هي أجهزة تعمل باللمس ومرتبطة بشاشة عرض، ما يمنح المستخدم انطباعًا بأنّه يتفاعل مباشرةً مع العناصر الظاهرة على الشاشة.

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

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

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

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

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

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

يتم تصنيف جهاز الإدخال على أنّه جهاز متعدد اللمس إذا استوفى الشرطَين التاليَين:

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

يتم تصنيف جهاز الإدخال على أنّه جهاز لمس واحد إذا استوفى الشرطَين التاليَين:

  • لم يتم تصنيف جهاز الإدخال على أنّه جهاز يعمل باللمس المتعدد. يتم تصنيف جهاز الإدخال إما كجهاز يعمل باللمس الفردي أو كجهاز يعمل باللمس المتعدد، ولا يمكن تصنيفه كجهاز يعمل باللمس الفردي والمتعدد في الوقت نفسه.
  • يُبلغ جهاز الإدخال عن توفّر المحورَين المطلقَين 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)، سيتم ضبط نوع الجهاز على pointer.
  • إذا كان جهاز الإدخال يبلغ عن توفّر المحاور النسبية REL_X أو REL_Y، سيتم ضبط نوع الجهاز على لوحة لمس. يحلّ هذا الشرط غموضًا في أجهزة الإدخال التي تتضمّن كلاً من الماوس ولوحة اللمس. في هذه الحالة، لا يتم استخدام لوحة اللمس للتحكّم في المؤشر لأنّ الماوس يتحكّم فيه.
  • بخلاف ذلك، يتم ضبط نوع الجهاز على pointer. يضمن هذا الإعداد التلقائي أنّ لوحات اللمس التي لم يتم تحديد أي غرض خاص آخر لها تتحكّم في المؤشر.

الأزرار

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

تتوفّر الأزرار التالية:

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

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

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

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

تتوفّر أنواع الأدوات التالية:

  • BTN_TOOL_FINGER وMT_TOOL_FINGER: تم ربطهما بـ MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PEN وMT_TOOL_PEN: تم ربطهما بـ MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: تم ربطها بـ MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: تم ربطها بـ MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: تم ربطها بـ MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: تم ربطها بـ MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: تم ربطها بـ MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: تم ربطها بـ MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP وBTN_TOOL_TRIPLETAP وBTN_TOOL_QUADTAP: تم ربطها بـ MotionEvent.TOOL_TYPE_FINGER.

التمرير فوق الأدوات مقابل لمسها

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

يميز المكوّن InputReader بين أدوات اللمس وأدوات التمرير. وبالمثل، يتم إبلاغ التطبيقات بطرق مختلفة عند استخدام أدوات اللمس وأدوات التمرير فوق الشاشة.

يتم إرسال بيانات أدوات اللمس إلى التطبيقات على شكل أحداث لمس باستخدام MotionEvent.ACTION_DOWN وMotionEvent.ACTION_MOVE وMotionEvent.ACTION_DOWN وMotionEvent.ACTION_POINTER_DOWN وMotionEvent.ACTION_POINTER_UP.

يتم إرسال بيانات أدوات التمرير فوق الشاشة إلى التطبيقات كأحداث حركة عامة باستخدام MotionEvent.ACTION_HOVER_ENTER وMotionEvent.ACTION_HOVER_MOVE وMotionEvent.ACTION_HOVER_EXIT.

متطلبات برنامج تشغيل الأجهزة التي تعمل باللمس

  • يجب أن تسجّل برامج تشغيل أجهزة اللمس المحاور ورموز المفاتيح الخاصة بالمحاور والأزرار التي تتوافق معها فقط. قد يؤدي تسجيل محاور أو رموز مفاتيح غير متوافقة إلى إرباك خوارزمية تصنيف الأجهزة أو جعل النظام يرصد بشكل غير صحيح إمكانات الجهاز. على سبيل المثال، إذا أبلغ الجهاز عن رمز المفتاح BTN_TOUCH، سيفترض النظام أنّ BTN_TOUCH يُستخدَم دائمًا لتحديد ما إذا كانت الأداة تلمس الشاشة. لذلك، يجب عدم استخدام BTN_TOUCH للإشارة إلى أنّ الأداة ضمن النطاق وتحوم فقط.
  • تستخدم الأجهزة التي تعمل باللمسة الواحدة أحداث إدخال Linux التالية:
    • ABS_X: (مطلوبة) تعرض الإحداثي X للأداة.
    • ABS_Y: (مطلوب) تعرض هذه السمة إحداثي Y للأداة.
    • ABS_PRESSURE: (اختياري) تعرض هذه السمة الضغط المادي المطبَّق على طرف الأداة أو قوة إشارة اللمس.
    • ABS_TOOL_WIDTH: (اختيارية) تعرض المساحة المقطعية أو عرض التلامس باللمس أو الأداة نفسها.
    • ABS_DISTANCE: (اختياري) تعرض هذه السمة المسافة بين الأداة وسطح الجهاز الذي يعمل باللمس.
    • ABS_TILT_X: (اختياري) يعرض ميل الأداة عن سطح الجهاز الذي يعمل باللمس على طول المحور X.
    • ABS_TILT_Y: (اختياري) تعرض هذه السمة ميل الأداة عن سطح جهاز اللمس على طول المحور Y.
    • BTN_TOUCH: (مطلوب) يشير إلى ما إذا كانت الأداة تلامس الجهاز.
    • BTN_LEFT، وBTN_RIGHT، وBTN_MIDDLE، وBTN_BACK، وBTN_SIDE، وBTN_FORWARD، وBTN_EXTRA، وBTN_STYLUS، وBTN_STYLUS2: تعرض (اختياري) حالات الزر "إبلاغ".
    • BTN_TOOL_FINGER وBTN_TOOL_PEN وBTN_TOOL_RUBBER وBTN_TOOL_BRUSH وBTN_TOOL_PENCIL وBTN_TOOL_AIRBRUSH وBTN_TOOL_MOUSE وBTN_TOOL_LENS وBTN_TOOL_DOUBLETAP وBTN_TOOL_TRIPLETAP وBTN_TOOL_QUADTAP: (اختياري) تعرض نوع الأداة.
  • تستخدم الأجهزة المتوافقة مع اللمس المتعدد أحداث إدخال Linux التالية:
    • ABS_MT_POSITION_X: (مطلوبة) تعرض الإحداثي X للأداة.
    • ABS_MT_POSITION_Y: (مطلوب) تعرض هذه السمة إحداثي Y للأداة.
    • ABS_MT_PRESSURE: (اختيارية) تعرض هذه السمة مقدار الضغط المادي المطبَّق على طرف الأداة أو قوة إشارة اللمس.
    • ABS_MT_TOUCH_MAJOR: (اختياري) تعرض هذه السمة مساحة المقطع العرضي لنقطة اللمس أو طول البُعد الأطول لنقطة اللمس.
    • ABS_MT_TOUCH_MINOR: (اختياري) تعرض هذه السمة طول البُعد الأقصر لنقطة الاتصال التي تم لمسها. يجب عدم استخدام هذا المحور إذا كانت السمة ABS_MT_TOUCH_MAJOR تعرض قياسًا للمساحة.
    • ABS_MT_WIDTH_MAJOR: (اختيارية) تعرض هذه السمة مساحة المقطع العرضي للأداة نفسها أو طول البُعد الأطول للأداة نفسها. لا تستخدِم هذا المحور إلا إذا كنت تعرف أبعاد الأداة نفسها.
    • ABS_MT_WIDTH_MINOR: (اختياري) تعرض هذه السمة طول البُعد الأقصر للأداة نفسها. يجب عدم استخدام هذا المحور إذا كان ABS_MT_WIDTH_MAJOR يعرض قياسًا للمساحة أو إذا كانت أبعاد الأداة نفسها غير معروفة.
    • ABS_MT_ORIENTATION: (اختياري) تعرض هذه السمة اتجاه الأداة.
    • ABS_MT_DISTANCE: (اختياري) تعرض هذه السمة المسافة بين الأداة وسطح الجهاز الذي يعمل باللمس.
    • ABS_MT_TOOL_TYPE: (اختياري) يعرض نوع الأداة كـ MT_TOOL_FINGER أو MT_TOOL_PEN.
    • ABS_MT_TRACKING_ID: (اختياري) تعرض هذه السمة رقم تعريف التتبُّع الخاص بالأداة. معرّف التتبُّع هو عدد صحيح عشوائي غير سالب يُستخدَم لتحديد وتتبُّع كل أداة بشكل مستقل عندما تكون أدوات متعددة نشطة. على سبيل المثال، عندما تلمس عدة أصابع الجهاز، يجب أن يتم تعيين معرّف تتبُّع مميز لكل إصبع يتم استخدامه طالما ظل الإصبع ملامسًا للشاشة. يمكن إعادة استخدام أرقام التعريف الخاصة بأجهزة التتبُّع عندما تخرج الأدوات المرتبطة بها عن النطاق.
    • ABS_MT_SLOT: (اختياري) يعرض رقم تعريف فتحة الأداة عند استخدام بروتوكول اللمس المتعدد "ب" لنظام التشغيل Linux. يُرجى الرجوع إلى مستندات بروتوكول اللمس المتعدد في 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 يجب أن تتضمّن بعض المعلومات على الأقل حول طبيعة الأداة، سواء كانت تلامس الشاشة أو نوع الأداة على الأقل. في حال عدم توفّر أي معلومات، يُفترض أنّ الأداة غير نشطة (خارج النطاق).

    • عند استخدام بروتوكول اللمس المتعدد "أ"، تكون الأداة نشطة عندما تظهر في أحدث تقرير مزامنة. عندما تتوقف الأداة عن الظهور في تقارير المزامنة، يعني ذلك أنّها لم تعُد متوفّرة.
    • عند استخدام بروتوكول اللمس المتعدد "ب"، تظل الأداة نشطة طالما أنّ لديها خانة نشطة. وعندما تتم إزالة هذه المساحة، يتوقف التطبيق عن الوجود.
  • يتم تحديد ما إذا كانت الأداة في وضع التمرير استنادًا إلى الشروط التالية:
    • إذا كانت الأداة BTN_TOOL_MOUSE أو BTN_TOOL_LENS، لن تكون الأداة في وضع التمرير، حتى إذا كان أي من الشرطين التاليين صحيحًا.
    • إذا كانت الأداة نشطة وأبلغ برنامج التشغيل عن معلومات الضغط، وكان الضغط المُبلغ عنه صفرًا، يعني ذلك أنّ الأداة تحوم فوق الشاشة.
    • إذا كانت الأداة نشطة وكان برنامج التشغيل يتيح رمز المفتاح BTN_TOUCH وكانت قيمة BTN_TOUCH هي صفر، تكون الأداة في وضع التحليق.
  • تتوافق InputReader مع بروتوكولَي اللمس المتعدد "أ" و"ب". على السائقين الجدد استخدام بروتوكول "ب"، ولكن يمكن استخدام أي منهما.
  • اعتبارًا من الإصدار 4.0 من نظام التشغيل Android، قد يلزم تغيير برامج تشغيل شاشة اللمس للامتثال لمواصفات بروتوكول الإدخال في نظام التشغيل 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 توفير الدعم لمجموعة أكبر من الأجهزة الطرفية التي تعمل باللمس، مثل شاشات اللمس الخارجية HID المتعددة اللمس، وذلك باستخدام برامج التشغيل غير المعدَّلة.

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

في ما يلي ملخّص موجز عن طريقة عمل الأجهزة التي تعمل باللمس على Android.

  1. يقرأ EventHub الأحداث الأولية من برنامج التشغيل evdev.
  2. تستهلك InputReader الأحداث الأولية وتعدّل الحالة الداخلية بشأن موضع كل أداة وخصائصها الأخرى. ويتتبّع أيضًا حالات الأزرار.
  3. في حال الضغط على رجوع أو تقديم أو رفع الإصبع عنهما، يُرسِل InputReader إشعارًا إلى InputDispatcher بشأن الحدث الرئيسي.
  4. تحدِّد السمة InputReader ما إذا تم الضغط على مفتاح افتراضي. وفي حال حدوث ذلك، يتم إرسال إشعار إلى InputDispatcher بشأن الحدث الرئيسي.
  5. تحدّد InputReader ما إذا كان قد تم بدء اللمس ضمن حدود الشاشة. وفي هذه الحالة، يتم إرسال إشعار إلى InputDispatcher بشأن حدث اللمس.
  6. إذا لم تكن هناك أدوات لمس ولكن كانت هناك أداة واحدة على الأقل للتحويم، سيُرسل InputReader إشعارًا إلى InputDispatcher بشأن حدث التحويم.
  7. إذا كان نوع جهاز اللمس هو مؤشر، تنفّذ InputReader عملية رصد إيماءات المؤشر، وتحرّك المؤشر وتحدّد موقعه وفقًا لذلك، وتُعلم InputDispatcher بحدث المؤشر.
  8. تستخدِم InputDispatcher السمة WindowManagerPolicy لتحديد ما إذا كان يجب إرسال الأحداث وما إذا كان يجب تنبيه الجهاز. بعد ذلك، تنقل InputDispatcher الأحداث إلى التطبيقات المناسبة.

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

يتم تحديد سلوك جهاز اللمس من خلال محاور الجهاز وأزراره وخصائص الإدخال وإعدادات جهاز الإدخال وخريطة المفاتيح الافتراضية وتصميم المفاتيح.

راجِع الأقسام التالية لمعرفة المزيد من التفاصيل حول الملفات التي تشارك في إعداد لوحة المفاتيح:

الخصائص

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

أحد أسباب ذلك هو أنّ برامج تشغيل الأجهزة التي تعمل باللمس غالبًا ما تعرض خصائص اللمسات باستخدام وحدات خاصة بالجهاز.

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

يستخدم النظام مَعلمات المعايرة المرمّزة في ملفات إعدادات جهاز الإدخال لفك ترميز القيم التي يرسلها جهاز اللمس وتحويلها وتسويتها إلى تمثيل معياري أبسط يمكن للتطبيقات فهمه.

اصطلاحات المستندات

لأغراض التوثيق، نستخدم الاصطلاحات التالية لوصف القيم التي يستخدمها النظام أثناء عملية المعايرة.

قيم المحور الأساسية

تشير التعبيرات التالية إلى القيم الأولية التي يبلغ عنها برنامج تشغيل جهاز اللمس كأحداث EV_ABS.

raw.x
قيمة المحور ABS_X أو ABS_MT_POSITION_X
raw.y
قيمة المحور ABS_Y أو ABS_MT_POSITION_Y
raw.pressure
قيمة المحور ABS_PRESSURE أو ABS_MT_PRESSURE، أو 0 إذا لم تكن متاحة
raw.touchMajor
قيمة المحور ABS_MT_TOUCH_MAJOR، أو 0 إذا لم تكن متاحة
raw.touchMinor
قيمة المحور ABS_MT_TOUCH_MINOR، أو raw.touchMajor إذا لم تكن متاحة.
raw.toolMajor
قيمة المحور ABS_TOOL_WIDTH أو ABS_MT_WIDTH_MAJOR، أو 0 إذا لم تكن متاحة
raw.toolMinor
قيمة المحور ABS_MT_WIDTH_MINOR، أو raw.toolMajor إذا لم تكن متاحة.
raw.orientation
قيمة المحور ABS_MT_ORIENTATION، أو 0 إذا لم تكن متاحة
raw.distance
قيمة المحور ABS_DISTANCE أو ABS_MT_DISTANCE، أو 0 إذا لم تكن متاحة
raw.tiltX
قيمة المحور ABS_TILT_X، أو 0 إذا لم تكن متاحة
raw.tiltY
قيمة المحور ABS_TILT_Y، أو 0 إذا لم تكن متاحة.

نطاقات المحور الأولي

تشير التعبيرات التالية إلى حدود القيم الأولية. ويتم الحصول عليها من خلال استدعاء EVIOCGABS ioctl لكل محور.

raw.*.min
الحد الأدنى الشامل لقيمة المحور الأولي.
raw.*.max
الحد الأقصى الشامل لقيمة المحور الأولي.
raw.*.range
يعادل raw.*.max - raw.*.min
raw.*.fuzz
دقة المحور الأولي، مثلاً، fuzz = 1 يعني أنّ القيم دقيقة بمقدار +/- وحدة واحدة.
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، يرصد النظام تلقائيًا نوع الجهاز وفقًا لخوارزمية التصنيف.

راجِع قسم التصنيف لمزيد من التفاصيل حول كيفية تأثير نوع الجهاز في سلوك جهاز اللمس.

في الإصدار 3 من نظام التشغيل Android والإصدارات الأقدم، كان يُفترض أنّ جميع الأجهزة التي تعمل باللمس هي شاشات تعمل باللمس.

touch.orientationAware

التعريف: touch.orientationAware = 0 | 1

تحدِّد هذه السمة ما إذا كان يجب أن يستجيب الجهاز الذي يعمل باللمس لتغييرات اتجاه العرض.

  • إذا كانت القيمة 1، يتم تدوير مواضع اللمس التي يسجّلها جهاز اللمس كلما تغيّر اتجاه الشاشة.

  • إذا كانت القيمة 0، تكون مواضع اللمس التي يبلغ عنها جهاز اللمس محصّنة ضد التغييرات في اتجاه العرض.

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

يميز النظام بين شاشات اللمس والشاشات الداخلية والخارجية. يتم تدوير شاشة اللمس الداخلية التي تتوافق مع اتجاه الشاشة استنادًا إلى اتجاه الشاشة الداخلية. يتم تدوير شاشة اللمس الخارجية التي تتوافق مع اتجاه الشاشة استنادًا إلى اتجاه الشاشة الخارجية.

يتم استخدام ميزة "التعرّف على اتجاه الشاشة" لتفعيل تدوير شاشات اللمس على أجهزة مثل Nexus One. على سبيل المثال، عند تدوير الجهاز بمقدار 90 درجة في اتجاه عقارب الساعة من اتجاهه الطبيعي، تتم إعادة ربط المواضع المطلقة للمسات بطريقة تجعل اللمسة في الزاوية العلوية اليسرى لنظام الإحداثيات المطلق لشاشة اللمس تظهر على أنّها لمسة في الزاوية العلوية اليسرى لنظام الإحداثيات المدورة للشاشة. ويتم ذلك لكي يتم تسجيل اللمسات باستخدام نظام الإحداثيات نفسه الذي تستخدمه التطبيقات لرسم عناصرها المرئية.

قبل Honeycomb، كان يُفترض أنّ جميع الأجهزة التي تعمل باللمس يمكنها التعرّف على الاتجاه.

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 و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، يتم تقسيم الحجم المُبلغ عنه على عدد جهات الاتصال قبل الاستخدام.

  • إذا كانت القيمة 0، يتم استخدام الحجم المُبلغ عنه كما هو.

القيمة التلقائية هي 0.

لا يمكن لبعض الأجهزة التي تعمل باللمس، وخاصةً الأجهزة التي تعمل باللمس المتعدد المحدود، التمييز بين الأبعاد الفردية لعمليات اللمس المتعدد، لذا فإنّها تعرض قياسًا للحجم يمثّل المساحة الإجمالية أو العرض. يجب ضبط هذه السمة على 1 فقط لهذه الأجهزة. إذا كنت غير متأكّد، اضبط هذه القيمة على 0.

العملية الحسابية

يعتمد احتساب الحقول touchMajor وtouchMinor وtoolMajor وtoolMinor وsize على مَعلمات المعايرة المحدّدة.

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

size = avg(touchMajor, touchMinor)

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

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

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

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

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

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

output.size = size

مجال الضغط

يصف الحقل pressure الضغط المادي التقريبي المطبَّق على جهاز اللمس كقيمة عادية بين 0.0 (بدون لمس) و1.0 (ضغط عادي).

يشير الضغط الصفري إلى أنّ الأداة تحلّق في الهواء.

touch.pressure.calibration

التعريف: touch.pressure.calibration = none | physical | amplitude | default

تحدّد هذه السمة نوع القياس الذي يستخدمه برنامج تشغيل اللمس للإبلاغ عن الضغط.

  • إذا كانت القيمة none، يكون الضغط غير معروف، لذا يتم ضبطه على 1.0 عند اللمس و0.0 عند التمرير فوق الشاشة.

  • إذا كانت القيمة physical، يُفترض أنّ محور الضغط يقيس الشدة الفعلية للضغط المطبّق على لوحة اللمس.

  • إذا كانت القيمة amplitude، يُفترض أنّ محور الضغط يقيس سعة الإشارة، والتي ترتبط بحجم التلامس والضغط المطبَّق.

  • إذا كانت القيمة default، يستخدم النظام عملية المعايرة physical إذا كان محور الضغط متاحًا، وإلا سيستخدم none.

touch.pressure.scale

التعريف: touch.pressure.scale = <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 Object Based Protocol. عند فك ترميز المتّجه، ينتج عنه زاوية اتجاه ومقدار ثقة. يتم استخدام مقدار الثقة لتغيير حجم المعلومات، ما لم تكن هندسية.
  • إذا كانت القيمة default، يستخدم النظام عملية المعايرة interpolated إذا كان محور الاتجاه متاحًا، وإلا سيستخدم none.

العملية الحسابية

يعتمد احتساب الحقلَين orientation وtilt على معلَمات المعايرة المحدّدة والمدخلات المتاحة.

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

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

        output.orientation = angle

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

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

حقل المسافة

يوضّح الحقل distance المسافة بين الأداة وسطح جهاز اللمس. تشير القيمة 0.0 إلى الاتصال المباشر، وتشير القيم الأكبر إلى زيادة المسافة من السطح.

touch.distance.calibration

التعريف: touch.distance.calibration = none | scaled | default

تحدّد هذه السمة نوع القياس الذي يستخدمه برنامج تشغيل اللمس للإبلاغ عن المسافة.

  • إذا كانت القيمة none، تكون المسافة غير معروفة، لذا يتم ضبطها على 0.

  • إذا كانت القيمة scaled، يتم ضرب المسافة التي تم تسجيلها في عامل قياس ثابت.

  • إذا كانت القيمة default، يستخدم النظام عملية المعايرة scaled إذا كان محور المسافة متاحًا، وإلا سيستخدم none.

touch.distance.scale

التعريف: touch.distance.scale = <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

ملاحظات حول التوافق

تغيّرت خصائص الإعدادات لأجهزة اللمس بشكل كبير في الإصدار 4.0 من Android Ice Cream Sandwich. يجب تعديل جميع ملفات إعداد أجهزة الإدخال الخاصة بأجهزة اللمس لاستخدام خصائص الإعداد الجديدة.

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

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

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

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

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

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

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

بناء الجملة

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

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

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

  • 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

في المثال أعلاه، تبلغ دقة شاشة اللمس 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

إيماءات المؤشر غير المباشرة عبر اللمس بأكثر من إصبع

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

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

رفض لمس راحة اليد

اعتبارًا من الإصدار 13 من نظام التشغيل Android، يمكن للنظام رفض الإدخالات من راحة اليد تلقائيًا عند تفعيل إطار العمل المضمّن. ستظل الحلول المخصّصة والمصمّمة داخليًا متوافقة، مع أنّه قد يلزم تعديلها لعرض العلامة 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. لتفعيل الميزة بشكل دائم، أضِف أمر sysprop المناسب في ملف init**rc:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

محتوى إضافي للقراءة