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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

الأزرار

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

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

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

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

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

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

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

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

التحويم مقابل لمس الأدوات

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

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

يتم إبلاغ التطبيقات بأدوات اللمس كأحداث لمس باستخدام MotionEvent.ACTION_DOWN وMotionEvent.ACTION_MOVE وMotionEvent.ACTION_DOWN وMotionEvent.ACTION_POINTER_DOWN وMotionEvent.ACTION_POINTER_UP.

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

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

  • يجب أن تسجّل برامج تشغيل الأجهزة التي تعمل باللمس المحاور والرموز الرئيسية للمحاور والأزرار التي تتيحها فقط. قد يؤدي تسجيل المحاور أو رموز المفاتيح غير المتوافقة إلى إرباك خوارزمية تصنيف الجهاز أو يتسبب في رصد النظام لإمكانات الجهاز بشكل غير صحيح. على سبيل المثال، إذا أبلغ الجهاز عن رمز المفتاح BTN_TOUCH، يفترض النظام أنّه يتم استخدام BTN_TOUCH دائمًا للإشارة إلى ما إذا كانت الأداة تلمس الشاشة. لذلك، يجب عدم استخدام BTN_TOUCH للإشارة إلى أنّ الأداة تقع ضمن النطاق وتحوم فوقه.
  • تستخدم الأجهزة التي تعمل بلمسة واحدة أحداث الإدخال التالية في Linux:
    • ‫ABS_X: (مطلوبة) تُبلغ عن الإحداثي X للأداة.
    • ‫ABS_Y: (مطلوبة) تُبلغ عن الإحداثي Y للأداة.
    • ‫ABS_PRESSURE: (اختياري) يشير إلى الضغط المادي المطبَّق على طرف الأداة أو قوة إشارة اللمس.
    • ABS_TOOL_WIDTH: (اختياري) يعرض مساحة المقطع العرضي أو عرض نقطة التلامس أو الأداة نفسها.
    • ABS_DISTANCE: (اختيارية) تُبلغ عن المسافة بين الأداة وسطح الجهاز الذي يعمل باللمس.
    • ABS_TILT_X: (اختيارية) تشير إلى ميل الأداة من سطح الجهاز الذي يعمل باللمس على طول المحور X.
    • ‫ABS_TILT_Y: (اختيارية) تُبلغ عن ميل الأداة من سطح الجهاز الذي يعمل باللمس على طول المحور ص.
    • 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: (اختياري) يعرض رقم تعريف خانة الأداة عند استخدام بروتوكول اللمس المتعدّد "B" في نظام التشغيل 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 صفرًا عندما تكون الأداة متعامدة مع الجهاز. تشير قيمة الإمالة غير الصفرية إلى أنّ الأداة مائلة.

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

    • عند استخدام بروتوكول اللمس المتعدّد "أ"، تكون الأداة نشطة عندما تظهر في أحدث تقرير مزامنة. عندما تتوقف الأداة عن الظهور في تقارير المزامنة، فإنها تتوقف عن الوجود.
    • عند استخدام بروتوكول اللمس المتعدّد "B"، تكون الأداة نشطة طالما أنّها تحتوي على خانة نشطة. عندما يتم إخلاء الخانة، تتوقف الأداة عن الوجود.
  • يتم تحديد ما إذا كانت الأداة تحوم استنادًا إلى الشروط التالية:
    • إذا كانت الأداة BTN_TOOL_MOUSE أو BTN_TOOL_LENS، لن يتم تمرير الأداة، حتى إذا كان أي من الشرطين التاليين صحيحًا.
    • إذا كانت الأداة نشطة وأبلغ برنامج التشغيل عن معلومات الضغط، وكان الضغط الذي تم الإبلاغ عنه صفرًا، فإن الأداة تحوم.
    • إذا كانت الأداة نشطة وكان برنامج التشغيل يتيح استخدام رمز المفتاح BTN_TOUCH وكانت قيمة BTN_TOUCH تساوي صفرًا، يعني ذلك أنّ الأداة تحوم.
  • يتوافق InputReader مع بروتوكول اللمس المتعدّد "أ" و"ب". على برامج التشغيل الجديدة استخدام بروتوكول "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. By relying on the standard Linux input protocol, Android can support a wider variety of touch peripherals, such as external HID multi-touch touch screens, using unmodified drivers.

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

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

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

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

القيمة التلقائية هي 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< h4=""></touch.size.calibration<>

التعريف: touch.size.calibration = none | geometric | diameter | area | default

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

  • إذا كانت القيمة none، يتم ضبط الحجم على صفر.

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

  • إذا كانت القيمة diameter، يُفترض أنّ الحجم يتناسب مع قُطر (عرض) اللمسة أو الأداة.

  • إذا كانت القيمة area، يُفترض أنّ الحجم يتناسب مع مساحة اللمس أو الأداة.

  • إذا كانت القيمة default، يستخدم النظام معايرة geometric إذا كان المحور raw.touchMajor أو raw.toolMajor متاحًا، وإلا فإنه يستخدم معايرة none.

touch.size.scale

التعريف: touch.size.scale = <رقم نقطة عائمة غير سالب>

تحدّد هذه السمة عامل قياس ثابتًا يُستخدَم في المعايرة.

تكون القيمة التلقائية 1.0.

touch.size.bias

التعريف: touch.size.bias = <رقم نقطة عائمة غير سالب>

تحدّد قيمة انحياز ثابتة تُستخدَم في المعايرة.

تكون القيمة التلقائية 0.0.

touch.size.isSummed

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

تحدّد هذه السياسة ما إذا كان سيتم تسجيل الحجم كمجموع أحجام جميع جهات الاتصال النشطة، أو سيتم تسجيله بشكل فردي لكل جهة اتصال.

  • إذا كانت القيمة 1، يتم تقسيم الحجم المسجَّل على عدد جهات الاتصال قبل الاستخدام.

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

تكون القيمة التلقائية 0.

لا يمكن لبعض الأجهزة التي تعمل باللمس، لا سيما أجهزة "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 بالقيمة -PI/2 والقيمة الأولية raw.orientation.max بالقيمة PI/2. القيمة المركزية لـ (raw.orientation.min + raw.orientation.max) / 2 هي 0.
  • إذا كانت القيمة vector، يتم تفسير الاتجاه على أنّه متجه مجمّع يتألف من حقلَين موقّعَين من 4 بت. يُستخدم هذا التمثيل في أجزاء بروتوكول Atmel Object Based Protocol. عند فك ترميزه، ينتج عن المتجه زاوية اتجاه ومقدار ثقة. يتم استخدام مقدار الثقة لتحديد حجم المعلومات، ما لم تكن هندسية.
  • إذا كانت القيمة default، يستخدم النظام معايرة interpolated إذا كان محور الاتجاه متاحًا، وإلا فسيستخدم none.

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

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

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

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

        output.orientation = angle

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

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

حقل المسافة

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

touch.distance.calibration

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

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

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

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

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

touch.distance.scale

التعريف: touch.distance.scale = <رقم نقطة عائمة غير سالب>

تحدّد هذه السمة عامل قياس ثابتًا يُستخدَم في المعايرة.

تكون القيمة التلقائية 1.0.

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

يعتمد احتساب الحقل distance على مَعلمات المعايرة المحدّدة.

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

مثال

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

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

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

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

# Orientation
touch.orientation.calibration = vector

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

تغيّرت خصائص الإعدادات للأجهزة التي تعمل باللمس بشكل كبير في الإصدار 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
    

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