يتوافق 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
(من خلال ioctlEVIOCGPROP
)، يتم ضبط نوع الجهاز على شاشة تعمل باللمس. يفترض هذا الشرط أنّ أجهزة الإدخال المباشر التي تعمل باللمس تكون متصلة بشاشة متّصلة أيضًا. - إذا أبلغ جهاز الإدخال عن توفُّر سمة الإدخال
INPUT_PROP_POINTER
(من خلال ioctlEVIOCGPROP
)، يتم ضبط نوع الجهاز على المؤشر. - إذا أبلغ جهاز الإدخال عن توفّر محورَي
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
: (REQUIRED) يشير إلى ما إذا كانت الأداة تلمس الجهاز.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
: (REQUIRED) يشير إلى ما إذا كانت الأداة تلمس الجهاز.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
بعضًا على الأقل من المعلومات عن طبيعة الأداة، سواء كانت تلامس سطحًا، أو نوع الأداة على الأقل. في حال عدم توفّر أي معلومات، يُفترض أنّ الأداة غير نشطة (خارج النطاق).- عند استخدام بروتوكول اللمس المتعدّد "أ"، تكون الأداة نشطة كلما تم إدراجها في تقرير المزامنة الأخير. تتوقف الأداة عن الظهور في تقارير المزامنة،
- عند استخدام بروتوكول اللمس المتعدّد "ب"، تكون الأداة نشطة ما دامت لديها خانة نشطة. عند إزالة المحتوى من الفتحة، تصبح الأداة غير متوفّرة.
- يتم تحديد أنّ الأداة معلّقة استنادًا إلى الشروط التالية:
- إذا كانت الأداة هي
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.
- يقرأ
EventHub
الأحداث الأوّلية من برنامج تشغيلevdev
. - يستخدِم
InputReader
الأحداث الأوّلية ويُعدِّل الحالة الداخلية المتعلّقة بالموقع والخصائص الأخرى لكلّ أداة. وتتتبّع أيضًا حالات الأزرار. - في حال الضغط على مفتاح BACK أو FORWARD أو تحريره،
يُرسِل
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
، ما يشير إلى عدم تنفيذ 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
)، والمركز س من 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
.
إذا لم يتم إرسال مؤشر راحة اليد إلى التطبيقات، سيُسقط النظام المؤشر ببساطة.
تفعيل ميزة "رفض راحة اليد"
- في برنامج تشغيل الشاشة التي تعمل باللمس، استخدِم
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