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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • عند استخدام بروتوكول اللمس المتعدّد "أ"، تكون الأداة نشطة كلما ظهر في تقرير المزامنة الأخير. عندما تتوقف الأداة عن الظهور في تقارير المزامنة، يعني ذلك أنّها لم تعُد متوفّرة.
    • عند استخدام بروتوكول اللمس المتعدّد "ب"، تكون الأداة نشطة ما دامت لديها خانة نشطة. عند إزالة العنصر من الفتحة، تصبح الأداة غير متوفّرة.
  • يتم تحديد أنّ الأداة معلّقة استنادًا إلى الشروط التالية:
    • إذا كانت الأداة هي BTN_TOOL_MOUSE أو BTN_TOOL_LENS، لن تكون الأداة مركّزة، حتى إذا كان أيّ من الشرطَين التاليَين صحيحًا.
    • إذا كانت الأداة نشطة وأبلغ السائق عن معلومات الضغط، وكان الضغط المسجَّل هو صفر، يعني ذلك أنّ الأداة تطفو.
    • إذا كانت الأداة نشطة وكان برنامج تشغيل الجهاز يتيح استخدام رمز المفتاح BTN_TOUCH وكانت قيمة BTN_TOUCH هي صفر، يعني ذلك أنّ الأداة تحوم فوق الشاشة.
  • يتوافق InputReader مع بروتوكول اللمس المتعدّد "أ" و"ب". يجب أن يستخدم السائقون الجدد بروتوكول B، ولكن يمكن استخدام أي منهما.
  • بدءًا من الإصدار 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. في حال الضغط على مفتاح BACK أو FORWARD أو تحريره، يُرسِل InputReader إشعارًا إلى InputDispatcher بشأن الحدث الرئيسي.
  4. يحدِّد InputReader ما إذا حدث ضغط على مفتاح افتراضي. إذا كان الأمر كذلك، يُرسِل إشعارًا إلى InputDispatcher بشأن الحدث الرئيسي.
  5. InputReader يحدِّد ما إذا كانت اللمسة قد بدأت ضمن حدود الشاشة وفي هذه الحالة، يتم إرسال إشعار إلى InputDispatcher بشأن حدث اللمس.
  6. إذا لم تكن هناك أدوات لمس ولكن كانت هناك أداة واحدة على الأقل للمرور فوق العنصر، يُرسِل InputReader إشعارًا إلى InputDispatcher بشأن حدث التمرير فوق العنصر.
  7. إذا كان نوع جهاز اللمس هو مؤشر، ينفِّذ InputReader رصدًا للإيماءات باستخدام المؤشر، ويحرِّك المؤشر ويرصد النقاط وفقًا لذلك، ويُرسِل إشعارًا InputDispatcher بشأن حدث المؤشر.
  8. يستخدم InputDispatcher WindowManagerPolicy لتحديد ما إذا كان ينبغي إرسال الأحداث وما إذا كان يجب تنشيط الجهاز. بعد ذلك، توفّر InputDispatcher الأحداث للتطبيقات المناسبة.

ضبط إعدادات الجهاز الذي يعمل باللمس

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

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

الخصائص

يعتمد النظام على العديد من سمات إعدادات جهاز الإدخال لضبط وتعيير سلوك الجهاز الذي يعمل باللمس.

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

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

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

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

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

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

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

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

تكون القيمة التلقائية 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 المستنِد إلى الكائنات. عند فك ترميزه، يعرِض المتجه زاوية الاتجاه ومقدار الثقة. يتم استخدام حجم الثقة لتوسيع نطاق معلومات الحجم، ما لم تكن هندسية.
  • إذا كانت القيمة هي default، يستخدم النظام عملية المعايرة interpolated إذا كان محور التوجيه متاحًا، وإلا يستخدم none.

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

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

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

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

        output.orientation = angle

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

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

حقل المسافة

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

touch.distance.calibration

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

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

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

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

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

touch.distance.scale

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

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

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

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

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

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

مثال

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

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

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

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

# Orientation
touch.orientation.calibration = vector

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

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

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

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

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

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

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

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

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

بناء الجملة

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

تبدأ أسطر التعليق بعلامة الهاشتاغ (#) وتستمر إلى نهاية السطر.

يتم وصف كل مفتاح افتراضي من خلال 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)، ومركز X‏ 55، ومركز Y‏ 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
    

مراجع إضافية