يتوافق نظام التشغيل 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.
- يقرأ
EventHub
الأحداث الأولية من برنامج التشغيلevdev
. - تستهلك
InputReader
الأحداث الأولية وتعدّل الحالة الداخلية بشأن موضع كل أداة وخصائصها الأخرى. ويتتبّع أيضًا حالات الأزرار. - في حال الضغط على رجوع أو تقديم أو رفع الإصبع عنهما،
يُرسِل
InputReader
إشعارًا إلىInputDispatcher
بشأن الحدث الرئيسي. - تحدِّد السمة
InputReader
ما إذا تم الضغط على مفتاح افتراضي. وفي حال حدوث ذلك، يتم إرسال إشعار إلىInputDispatcher
بشأن الحدث الرئيسي. - تحدّد
InputReader
ما إذا كان قد تم بدء اللمس ضمن حدود الشاشة. وفي هذه الحالة، يتم إرسال إشعار إلىInputDispatcher
بشأن حدث اللمس. - إذا لم تكن هناك أدوات لمس ولكن كانت هناك أداة واحدة على الأقل للتحويم، سيُرسل
InputReader
إشعارًا إلىInputDispatcher
بشأن حدث التحويم. - إذا كان نوع جهاز اللمس هو مؤشر، تنفّذ
InputReader
عملية رصد إيماءات المؤشر، وتحرّك المؤشر وتحدّد موقعه وفقًا لذلك، وتُعلمInputDispatcher
بحدث المؤشر. - تستخدِم
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
.
إذا لم يتم إرسال مؤشر راحة اليد إلى التطبيقات، سيتجاهل النظام المؤشر ببساطة.
تفعيل ميزة "رفض لمس راحة اليد"
- في برنامج تشغيل شاشة اللمس، استخدِم الماكرو
input_abs_set_res
لضبط درجات الدقة للحقول التالية (الوحدات هي بكسل لكل ملم):ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
تكون إمكانية استخدام
ABS_MT_TOUCH_MINOR
اختيارية. ومع ذلك، إذا كان جهازك يتيح هذه الميزة، تأكَّد من ضبط دقة الشاشة بشكل صحيح. - للتأكّد من ضبط الحقول بشكلٍ صحيح، نفِّذ الأمر التالي:
$ adb shell getevent -li
- لتفعيل الميزة أثناء وقت التشغيل، نفِّذ ما يلي:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- أعِد تشغيل عملية
system_server
.$ adb shell stop && adb shell start
- تأكَّد من أنّ
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: {} - لتفعيل الميزة بشكل دائم، أضِف أمر sysprop المناسب في ملف
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1