يتوافق Android مع مجموعة متنوعة من شاشات اللمس ولوحات اللمس، بما في ذلك الأجهزة اللوحية التي تعمل بالقلم الإلكتروني.
شاشات اللمس هي أجهزة تعمل باللمس ومرتبطة بشاشة عرض بحيث يتكوّن لدى المستخدم انطباع بأنّه يتلاعب بالعناصر على الشاشة مباشرةً.
لوحات اللمس هي أجهزة تعمل باللمس غير مرتبطة بشاشة، مثل لوح التحويل الرقمي. تُستخدم لوحات اللمس عادةً للإشارة أو لتحديد المواضع غير المباشرة المطلقة أو للتحكّم في واجهة المستخدم من خلال الإيماءات.
يمكن أن تحتوي الأجهزة التي تعمل باللمس على أزرار تشبه وظائفها أزرار الماوس.
يمكن أحيانًا التعامل مع الأجهزة التي تعمل باللمس باستخدام مجموعة متنوعة من الأدوات المختلفة مثل الأصابع أو القلم حسب تقنية مستشعر اللمس الأساسية.
تُستخدم الأجهزة التي تعمل باللمس أحيانًا لتنفيذ المفاتيح الافتراضية. على سبيل المثال، في بعض أجهزة Android، تمتد منطقة أداة استشعار شاشة اللمس إلى ما وراء حافة الشاشة وتخدم غرضًا مزدوجًا كجزء من لوحة مفاتيح حساسة للمس.
نظرًا إلى التنوع الكبير في الأجهزة التي تعمل باللمس، يعتمد Android على عدد كبير من خصائص الضبط لوصف خصائص كل جهاز وسلوكه المطلوب.
تصنيف الأجهزة التي تعمل باللمس
يتم تصنيف جهاز الإدخال على أنّه جهاز متعدّد اللمس إذا كان يستوفي الشرطَين التاليَين:
- يُبلغ جهاز الإدخال عن توفّر المحورَين المطلقَين
ABS_MT_POSITION_XوABS_MT_POSITION_Y. - لا يحتوي جهاز الإدخال على أي أزرار لجهاز التحكّم في الألعاب. يحلّ هذا الشرط مشكلة الالتباس في بعض أجهزة التحكّم في الألعاب التي تُبلغ عن المحاور باستخدام رموز تتداخل مع رموز محاور اللمس المتعدّد.
يتم تصنيف جهاز الإدخال على أنّه جهاز لمس أحادي إذا كان يستوفي الشرطَين التاليَين:
- لم يتم تصنيف جهاز الإدخال كجهاز متعدّد اللمس. يتم تصنيف جهاز الإدخال إما كجهاز يعمل بلمسة واحدة أو كجهاز يعمل باللمس المتعدد، وليس كلاهما.
- يُبلغ جهاز الإدخال عن توفّر المحورَين المطلقَين
ABS_XوABS_Y، وتوفّر رمز المفتاحBTN_TOUCH.
عند تصنيف جهاز إدخال كجهاز يعمل باللمس، يتم تحديد وجود المفاتيح الافتراضية من خلال محاولة تحميل ملف خريطة المفاتيح الافتراضية للجهاز. إذا كانت خريطة المفاتيح الافتراضية متاحة، يتم أيضًا تحميل ملف تخطيط المفاتيح للجهاز. يُرجى الرجوع إلى [ملفات خريطة المفاتيح الافتراضية](#virtual-key-map-files) للحصول على معلومات حول موقع هذه الملفات وتنسيقها.
بعد ذلك، يحمّل النظام ملف إعداد جهاز الإدخال لجهاز اللمس.
يجب أن تحتوي جميع الأجهزة المدمجة التي تعمل باللمس على ملفات إعداد أجهزة الإدخال. إذا لم يتوفّر ملف إعداد لجهاز الإدخال، يختار النظام إعدادًا تلقائيًا مناسبًا للأجهزة الملحقة التي تعمل باللمس للأغراض العامة، مثل شاشات اللمس أو لوحات اللمس الخارجية التي تعمل عبر USB أو بلوتوث. هذه الإعدادات التلقائية غير مصمَّمة لشاشات اللمس المضمّنة، ويمكن أن تؤدي إلى سلوك غير صحيح.
بعد تحميل إعدادات جهاز الإدخال، يصنّف النظام جهاز الإدخال على أنّه شاشة لمس أو لوحة لمس أو جهاز مؤشر.
- يُستخدَم جهاز شاشة اللمس للتعامل المباشر مع العناصر على الشاشة. يلمس المستخدم الشاشة مباشرةً، لذا لا يتطلب النظام أي إمكانيات إضافية للإشارة إلى العناصر التي يتم التعامل معها.
- يُستخدم جهاز لوحة اللمس لتوفير معلومات عن الموضع المطلق للتطبيق حول اللمسات على منطقة معيّنة من أداة الاستشعار. ويمكن أن يكون مفيدًا للأجهزة اللوحية التي تعمل باللمس.
- يُستخدم جهاز المؤشر للتلاعب غير المباشر بالعناصر على الشاشة باستخدام المؤشر. ويتم تفسير الأصابع على أنّها إيماءات مؤشر اللمس المتعدد. ويتم تفسير الأدوات الأخرى، مثل أقلام الشاشة، باستخدام المواضع المطلقة. لمزيد من المعلومات، يُرجى الاطّلاع على إيماءات المؤشر غير المباشرة المتعددة اللمس.
يتم استخدام القواعد التالية لتصنيف جهاز الإدخال كشاشة لمس أو لوحة لمس أو جهاز تأشير.
- في حال ضبط السمة
touch.deviceType، يتم ضبط نوع الجهاز على النحو الموضّح. - إذا أشار جهاز الإدخال إلى توفّر سمة الإدخال
INPUT_PROP_DIRECT(من خلالEVIOCGPROPioctl)، يتم ضبط نوع الجهاز على شاشة لمس. يفترض هذا الشرط أنّ أجهزة الإدخال المباشر التي تعمل باللمس متصلة بشاشة متصلة أيضًا. - إذا أشار جهاز الإدخال إلى توفّر سمة الإدخال
INPUT_PROP_POINTER(من خلالEVIOCGPROPioctl)، يتم ضبط نوع الجهاز على مؤشر. - إذا أبلغ جهاز الإدخال عن توفّر المحورين النسبيين
REL_XأوREL_Y، يتم ضبط نوع الجهاز على لوحة لمس. يحلّ هذا الشرط الغموض في أجهزة الإدخال التي تتكوّن من ماوس ولوحة لمس. وفي هذه الحالة، لا يتم استخدام لوحة اللمس للتحكّم في المؤشر لأنّ الماوس يتحكّم فيه حاليًا. - وإلا، يتم ضبط نوع الجهاز على مؤشر. يضمن هذا الإعداد التلقائي أنّ لوحات اللمس التي لم يتم تحديد أي غرض خاص آخر لها تتحكّم في المؤشر.
الأزرار
الأزرار هي عناصر تحكّم اختيارية يمكن للتطبيقات استخدامها لتنفيذ وظائف إضافية. تعمل الأزرار على الأجهزة التي تعمل باللمس بشكل مشابه لأزرار الماوس، وتُستخدم بشكل أساسي مع الأجهزة التي تعمل باللمس من نوع المؤشر أو مع قلم الشاشة.
تتوفّر الأزرار التالية:
-
BTN_LEFT: تم ربطها بـ "MotionEvent.BUTTON_PRIMARY". -
BTN_RIGHT: تم ربطها بـ "MotionEvent.BUTTON_SECONDARY". -
BTN_MIDDLE: تم ربطها بـ "MotionEvent.BUTTON_MIDDLE". -
BTN_BACKوBTN_SIDE: تم ربطهما بـMotionEvent.BUTTON_BACK. يؤدي الضغط على هذا الزر أيضًا إلى إنشاء ضغطة مفتاح باستخدام رمز المفتاحKeyEvent.KEYCODE_BACK. -
BTN_FORWARDوBTN_EXTRA: يتم ربطهما بـMotionEvent.BUTTON_FORWARD. يؤدي الضغط على هذا الزر أيضًا إلى إنشاء ضغطة مفتاح باستخدام رمز المفتاحKeyEvent.KEYCODE_FORWARD. -
BTN_STYLUS: تم ربطها بـ "MotionEvent.BUTTON_SECONDARY". -
BTN_STYLUS2: تم ربطها بـ "MotionEvent.BUTTON_TERTIARY".
الأدوات وأنواعها
الأداة هي إصبع أو قلم أو أي جهاز آخر يُستخدم للتفاعل مع جهاز اللمس. يمكن لبعض الأجهزة التي تعمل باللمس التمييز بين أنواع مختلفة من الأدوات.
في أماكن أخرى في Android، كما هو الحال في واجهة برمجة التطبيقات MotionEvent، غالبًا ما يُشار إلى الأداة باسم مؤشر.
تتوفّر أنواع الأدوات التالية:
-
BTN_TOOL_FINGERوMT_TOOL_FINGER: يتم ربطهما بـMotionEvent.TOOL_TYPE_FINGER. -
BTN_TOOL_PENوMT_TOOL_PEN: يتم ربطهما بـMotionEvent.TOOL_TYPE_STYLUS. -
BTN_TOOL_RUBBER: تم ربطها بـ "MotionEvent.TOOL_TYPE_ERASER". -
BTN_TOOL_BRUSH: تم ربطها بـ "MotionEvent.TOOL_TYPE_STYLUS". -
BTN_TOOL_PENCIL: تم ربطها بـ "MotionEvent.TOOL_TYPE_STYLUS". -
BTN_TOOL_AIRBRUSH: تم ربطها بـ "MotionEvent.TOOL_TYPE_STYLUS". -
BTN_TOOL_MOUSE: تم ربطها بـ "MotionEvent.TOOL_TYPE_MOUSE". -
BTN_TOOL_LENS: تم ربطها بـ "MotionEvent.TOOL_TYPE_MOUSE". -
BTN_TOOL_DOUBLETAPوBTN_TOOL_TRIPLETAPوBTN_TOOL_QUADTAP: يتم ربطها بـMotionEvent.TOOL_TYPE_FINGER.
التحويم مقابل لمس الأدوات
يمكن أن تكون الأدوات ملامسة للجهاز الذي يعمل باللمس أو في نطاقه وتحوم فوقه. لا يمكن لجميع الأجهزة التي تعمل باللمس استشعار وجود أداة تحوم فوق الجهاز الذي يعمل باللمس. أما الأجهزة التي تتيح ذلك، مثل أجهزة التحويل الرقمي لقلم الشاشة المستندة إلى الترددات اللاسلكية، فيمكنها غالبًا رصد وجود الأداة ضمن نطاق محدود من جهاز التحويل الرقمي.
يميّز المكوّن InputReader بين أدوات اللمس وأدوات التمرير. وبالمثل، يتم إبلاغ التطبيقات بأدوات اللمس وأدوات التمرير
بطرق مختلفة.
يتم إبلاغ التطبيقات بأدوات اللمس كأحداث لمس
باستخدام MotionEvent.ACTION_DOWN وMotionEvent.ACTION_MOVE
وMotionEvent.ACTION_DOWN
وMotionEvent.ACTION_POINTER_DOWN وMotionEvent.ACTION_POINTER_UP.
يتم إبلاغ التطبيقات بأدوات التمرير كأحداث حركة عامة باستخدام
MotionEvent.ACTION_HOVER_ENTER وMotionEvent.ACTION_HOVER_MOVE
وMotionEvent.ACTION_HOVER_EXIT.
متطلبات برامج تشغيل الأجهزة التي تعمل باللمس
- يجب أن تسجّل برامج تشغيل الأجهزة التي تعمل باللمس المحاور والرموز الرئيسية للمحاور
والأزرار التي تتيحها فقط. قد يؤدي تسجيل المحاور أو رموز المفاتيح غير المتوافقة إلى إرباك خوارزمية تصنيف الجهاز أو يتسبب في رصد النظام لإمكانات الجهاز بشكل غير صحيح. على سبيل المثال، إذا أبلغ الجهاز عن رمز المفتاح
BTN_TOUCH، يفترض النظام أنّه يتم استخدامBTN_TOUCHدائمًا للإشارة إلى ما إذا كانت الأداة تلمس الشاشة. لذلك، يجب عدم استخدامBTN_TOUCHللإشارة إلى أنّ الأداة تقع ضمن النطاق وتحوم فوقه. - تستخدم الأجهزة التي تعمل بلمسة واحدة أحداث الإدخال التالية في Linux:
-
ABS_X: (مطلوبة) تُبلغ عن الإحداثي X للأداة. -
ABS_Y: (مطلوبة) تُبلغ عن الإحداثي Y للأداة. -
ABS_PRESSURE: (اختياري) يشير إلى الضغط المادي المطبَّق على طرف الأداة أو قوة إشارة اللمس. ABS_TOOL_WIDTH: (اختياري) يعرض مساحة المقطع العرضي أو عرض نقطة التلامس أو الأداة نفسها.ABS_DISTANCE: (اختيارية) تُبلغ عن المسافة بين الأداة وسطح الجهاز الذي يعمل باللمس.ABS_TILT_X: (اختيارية) تشير إلى ميل الأداة من سطح الجهاز الذي يعمل باللمس على طول المحور X.-
ABS_TILT_Y: (اختيارية) تُبلغ عن ميل الأداة من سطح الجهاز الذي يعمل باللمس على طول المحور ص. BTN_TOUCH: (مطلوبة) تشير إلى ما إذا كانت الأداة تلمس الجهاز.-
BTN_LEFTوBTN_RIGHTوBTN_MIDDLEوBTN_BACKوBTN_SIDEوBTN_FORWARDوBTN_EXTRAوBTN_STYLUSوBTN_STYLUS2: (اختياري) للإبلاغ عن حالات الزر. -
BTN_TOOL_FINGERوBTN_TOOL_PENوBTN_TOOL_RUBBERوBTN_TOOL_BRUSHوBTN_TOOL_PENCILوBTN_TOOL_AIRBRUSHوBTN_TOOL_MOUSEوBTN_TOOL_LENSوBTN_TOOL_DOUBLETAPوBTN_TOOL_TRIPLETAPوBTN_TOOL_QUADTAP: (اختيارية) تتيح هذه السمات تحديد نوع الأداة.
-
- تستخدم الأجهزة التي تعمل باللمس المتعدّد أحداث الإدخال التالية في Linux:
-
ABS_MT_POSITION_X: (مطلوبة) تُبلغ عن الإحداثي X للأداة. -
ABS_MT_POSITION_Y: (مطلوبة) تُبلغ عن الإحداثي Y للأداة. -
ABS_MT_PRESSURE: (اختياري) يشير إلى الضغط المادي المطبَّق على طرف الأداة أو قوة إشارة اللمس. ABS_MT_TOUCH_MAJOR: (اختيارية) تُبلغ عن مساحة المقطع العرضي لنقطة اللمس أو طول البُعد الأطول لنقطة اللمس.ABS_MT_TOUCH_MINOR: (اختيارية) تشير إلى طول البُعد الأقصر لنقطة اللمس. يجب عدم استخدام هذا المحور إذا كانABS_MT_TOUCH_MAJORيعرض قياسًا للمساحة.-
ABS_MT_WIDTH_MAJOR: (اختيارية) تشير إلى مساحة المقطع العرضي للأداة نفسها أو طول البُعد الأطول للأداة نفسها. لا تستخدِم هذا المحور إلا إذا كنت تعرف أبعاد الأداة نفسها. -
ABS_MT_WIDTH_MINOR: (اختيارية) تشير إلى طول البُعد الأقصر للأداة نفسها. يجب عدم استخدام هذا المحور إذا كانABS_MT_WIDTH_MAJORيعرض قياسًا للمساحة أو إذا كانت أبعاد الأداة نفسها غير معروفة. -
ABS_MT_ORIENTATION: (اختياري) يشير إلى اتجاه الأداة. ABS_MT_DISTANCE: (اختياري) يمثّل المسافة بين الأداة وسطح الجهاز الذي يعمل باللمس.ABS_MT_TOOL_TYPE: (اختياري) يبلّغ عن نوع الأداة على أنّهMT_TOOL_FINGERأوMT_TOOL_PEN.-
ABS_MT_TRACKING_ID: (اختياري) يعرض رقم تعريف التتبُّع الخاص بالأداة. رقم تعريف التتبُّع هو عدد صحيح عشوائي غير سالب يُستخدَم لتحديد كل أداة وتتبُّعها بشكل مستقل عندما تكون هناك أدوات متعددة نشطة. على سبيل المثال، عندما تلمس أصابع متعددة الجهاز، يجب تخصيص رقم تعريف تتبُّع مميز لكل إصبع يتم استخدامه طالما ظل الإصبع ملامسًا للشاشة. ويمكن إعادة استخدام أرقام تعريف التتبُّع عندما تخرج الأدوات المرتبطة بها عن النطاق. -
ABS_MT_SLOT: (اختياري) يعرض رقم تعريف خانة الأداة عند استخدام بروتوكول اللمس المتعدّد "B" في نظام التشغيل Linux. لمزيد من التفاصيل، يُرجى الرجوع إلى مستندات بروتوكول اللمس المتعدّد في Linux. BTN_TOUCH: (مطلوبة) تشير إلى ما إذا كانت الأداة تلمس الجهاز.-
BTN_LEFTوBTN_RIGHTوBTN_MIDDLEوBTN_BACKوBTN_SIDEوBTN_FORWARDوBTN_EXTRAوBTN_STYLUSوBTN_STYLUS2: (اختياري) للإبلاغ عن حالات الزر. -
BTN_TOOL_FINGERوBTN_TOOL_PENوBTN_TOOL_RUBBERوBTN_TOOL_BRUSHوBTN_TOOL_PENCILوBTN_TOOL_AIRBRUSHوBTN_TOOL_MOUSEوBTN_TOOL_LENSوBTN_TOOL_DOUBLETAPوBTN_TOOL_TRIPLETAPوBTN_TOOL_QUADTAP: (اختيارية) تُبلغ عن نوع الأداة.
-
- إذا تم تحديد محاور لكل من بروتوكول اللمسة الواحدة واللمس المتعدد، يتم استخدام محاور اللمس المتعدد فقط ويتم تجاهل محاور اللمسة الواحدة.
تحدّد القيمتان الدنيا والقصوى للمحاور
ABS_XوABS_YوABS_MT_POSITION_XوABS_MT_POSITION_Yحدود المنطقة النشطة للجهاز بوحدات سطحية خاصة بالجهاز. في حالة شاشة اللمس، تصف المنطقة النشطة جزء جهاز اللمس الذي يغطي الشاشة فعليًا.بالنسبة إلى شاشة اللمس، يستكمل النظام تلقائيًا مواضع اللمس التي تم الإبلاغ عنها في وحدات السطح للحصول على مواضع اللمس في وحدات بكسل العرض وفقًا للحساب التالي:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)قد تسجّل شاشة اللمس لمسات خارج المنطقة النشطة المسجّلة.
لا يتم إرسال اللمسات التي تبدأ خارج المنطقة النشطة إلى التطبيقات، ولكن يمكن استخدامها للمفاتيح الافتراضية.
يتم إرسال النقرات التي تبدأ داخل المنطقة النشطة أو التي تدخل وتخرج من منطقة العرض إلى التطبيقات. وبالتالي، إذا بدأت لمسة داخل حدود التطبيق ثم انتقلت خارج المنطقة النشطة، قد يتلقّى التطبيق أحداث لمس بإحداثيات عرض سالبة أو خارج حدود العرض. هذا السلوك متوقَّع.
يجب ألا يثبّت جهاز اللمس إحداثيات اللمس على حدود المنطقة النشطة. إذا خرجت اللمسة من المنطقة النشطة، يجب الإبلاغ عنها على أنّها خارج المنطقة النشطة، أو يجب عدم الإبلاغ عنها على الإطلاق.
على سبيل المثال، إذا كان إصبع المستخدم يلمس بالقرب من أعلى يمين شاشة اللمس، قد يتم الإبلاغ عن إحداثي (minX, minY). إذا استمر الإصبع في التحرك خارج المنطقة النشطة، يجب أن تبدأ شاشة اللمس في الإبلاغ عن الإحداثيات بمكونات أقل من minX وminY، مثل (minX - 2, minY - 3)، أو يجب أن تتوقف عن الإبلاغ عن اللمس تمامًا. بمعنى آخر، يجب ألا تُبلغ شاشة اللمس عن (minX, minY) عندما يلمس إصبع المستخدم خارج المنطقة النشطة.
يؤدي تثبيت إحداثيات اللمس على حافة الشاشة إلى إنشاء حدود صلبة اصطناعية حول حافة الشاشة، ما يمنع النظام من تتبُّع الحركات التي تدخل حدود منطقة العرض أو تخرج منها بسلاسة.
يجب أن تكون القيم التي يتم الإبلاغ عنها من خلال
ABS_PRESSUREأوABS_MT_PRESSURE، في حال الإبلاغ عنها، غير صفرية عندما تلمس الأداة الجهاز، وصفرية في الحالات الأخرى للإشارة إلى أنّ الأداة تحوم فوق الجهاز.يُعدّ الإبلاغ عن معلومات الضغط اختياريًا ولكن يُنصح به بشدة. يمكن للتطبيقات استخدام معلومات الضغط لتنفيذ الرسم الحسّاس للضغط وغيره من التأثيرات.
يجب ألا تكون القيم التي تم الإبلاغ عنها من خلال
ABS_TOOL_WIDTHأوABS_MT_TOUCH_MAJORأوABS_MT_TOUCH_MINORأوABS_MT_WIDTH_MAJORأوABS_MT_WIDTH_MINORصفرية عندما تلمس الأداة الجهاز، وتكون صفرية في الحالات الأخرى، ولكن هذا ليس مطلوبًا. على سبيل المثال، قد يتمكّن الجهاز الذي يعمل باللمس من قياس حجم نقاط اللمس بالإصبع، ولكن ليس نقاط اللمس بقلم الشاشة.يُعدّ تقديم معلومات عن المقاس اختياريًا، ولكننا ننصح به بشدة. يمكن للتطبيقات استخدام معلومات الضغط لتنفيذ الرسم الحساس للحجم وتأثيرات أخرى.
يجب أن تقترب القيم التي يسجّلها
ABS_DISTANCEأوABS_MT_DISTANCEمن الصفر عندما تلامس الأداة الجهاز. ويمكن أن تظل المسافة غير صفرية حتى عندما تكون الأداة على اتصال مباشر. وتعتمد القيم الدقيقة التي يتم تسجيلها على الطريقة التي تقيس بها الأجهزة المسافة.يُعدّ الإبلاغ عن معلومات المسافة اختياريًا، ولكن يُنصح به للأجهزة التي تستخدم قلم الشاشة.
يجب أن تكون القيم التي تم الإبلاغ عنها من خلال
ABS_TILT_XوABS_TILT_Yصفرًا عندما تكون الأداة متعامدة مع الجهاز. تشير قيمة الإمالة غير الصفرية إلى أنّ الأداة مائلة.يُفترض أن يتم تحديد زوايا الإمالة على طول المحورين "س" و"ص" بالدرجات من الوضع العمودي. يتم تحديد النقطة المركزية (المتعامدة تمامًا) من خلال
(max + min) / 2لكل محور. تشير القيم الأصغر من نقطة المركز إلى إمالة للأعلى أو لليسار، بينما تشير القيم الأكبر من نقطة المركز إلى إمالة للأسفل أو لليمين.يحوّل
InputReaderمكوّنات الإمالة X وY إلى زاوية إمالة عمودية تتراوح بين 0 وPI / 2راديان وزاوية اتجاه مستوٍ تتراوح بين-PIوPIراديان. وينتج عن هذا التمثيل وصف للاتجاه يتوافق مع ما يتم استخدامه لوصف لمسات الأصابع.يُعدّ إرسال معلومات الإمالة اختياريًا، ولكن يُنصح به للأجهزة التي تستخدم قلم الشاشة.
إذا تم الإبلاغ عن نوع الأداة من خلال
ABS_MT_TOOL_TYPE، سيحلّ محل أي معلومات عن نوع الأداة تم الإبلاغ عنها من خلالBTN_TOOL_*. إذا لم تتوفّر أي معلومات عن نوع الأداة على الإطلاق، يتم ضبط نوع الأداة تلقائيًا علىMotionEvent.TOOL_TYPE_FINGER.يتم تحديد ما إذا كانت الأداة نشطة استنادًا إلى الشروط التالية:
عند استخدام بروتوكول اللمسة الواحدة، تكون الأداة نشطة إذا كانت قيمة
BTN_TOUCHأوBTN_TOOL_*تساوي 1.يعني هذا الشرط أنّ
InputReaderيجب أن تتوفّر لديه بعض المعلومات على الأقل عن طبيعة الأداة، سواء كانت تلمس أو نوع الأداة على الأقل. وإذا لم تتوفّر أي معلومات، يُفترض أنّ الأداة غير نشطة (خارج النطاق).- عند استخدام بروتوكول اللمس المتعدّد "أ"، تكون الأداة نشطة عندما تظهر في أحدث تقرير مزامنة. عندما تتوقف الأداة عن الظهور في تقارير المزامنة، فإنها تتوقف عن الوجود.
- عند استخدام بروتوكول اللمس المتعدّد "B"، تكون الأداة نشطة طالما أنّها تحتوي على خانة نشطة. عندما يتم إخلاء الخانة، تتوقف الأداة عن الوجود.
- يتم تحديد ما إذا كانت الأداة تحوم استنادًا إلى الشروط التالية:
- إذا كانت الأداة
BTN_TOOL_MOUSEأوBTN_TOOL_LENS، لن يتم تمرير الأداة، حتى إذا كان أي من الشرطين التاليين صحيحًا. - إذا كانت الأداة نشطة وأبلغ برنامج التشغيل عن معلومات الضغط، وكان الضغط الذي تم الإبلاغ عنه صفرًا، فإن الأداة تحوم.
- إذا كانت الأداة نشطة وكان برنامج التشغيل يتيح استخدام رمز المفتاح
BTN_TOUCHوكانت قيمةBTN_TOUCHتساوي صفرًا، يعني ذلك أنّ الأداة تحوم.
- إذا كانت الأداة
- يتوافق
InputReaderمع بروتوكول اللمس المتعدّد "أ" و"ب". على برامج التشغيل الجديدة استخدام بروتوكول "B"، ولكن يمكن استخدام أي منهما. اعتبارًا من الإصدار Android 4.0، قد يلزم تغيير برامج تشغيل شاشة اللمس لتتوافق مع مواصفات بروتوكول الإدخال في Linux.
قد تكون التغييرات التالية مطلوبة:
عندما تصبح الأداة غير نشطة (يتم رفع الإصبع)، يجب أن تتوقف عن الظهور في تقارير المزامنة اللاحقة للمس المتعدد. عندما تصبح جميع الأدوات غير نشطة (أي عندما تكون جميع الأصابع "مرفوعة")، يجب أن يرسل برنامج التشغيل حزمة تقرير مزامنة فارغة، مثل
SYN_MT_REPORTمتبوعة بـSYN_REPORT.في الإصدارات السابقة من Android، كان من المتوقّع أن يتم الإبلاغ عن أحداث "الرفع" من خلال إرسال قيمة ضغط تساوي 0. كان السلوك القديم غير متوافق مع مواصفات بروتوكول الإدخال في Linux ولم يعد متاحًا.
يجب الإبلاغ عن معلومات الضغط الجسدي أو قوة الإشارة باستخدام
ABS_MT_PRESSURE.في الإصدارات السابقة من Android، كان يتم استرداد معلومات الضغط من
ABS_MT_TOUCH_MAJOR. كان السلوك القديم غير متوافق مع مواصفات بروتوكول الإدخال في Linux ولم يعد متاحًا.- يجب الإبلاغ عن معلومات حجم اللمس باستخدام
ABS_MT_TOUCH_MAJOR.كانت الإصدارات السابقة من Android تسترد معلومات الحجم من
ABS_MT_TOOL_MAJOR. كان السلوك القديم غير متوافق مع مواصفات بروتوكول الإدخال في Linux ولم يعُد متاحًا.
تشغيل الجهاز الذي يعمل باللمس
في ما يلي ملخّص موجز عن تشغيل الأجهزة التي تعمل باللمس على Android.
- يقرأ
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، يرصد النظام نوع الجهاز تلقائيًا وفقًا لخوارزمية التصنيف.
يُرجى الرجوع إلى قسم التصنيف لمزيد من التفاصيل حول كيفية تأثير نوع الجهاز في سلوك جهاز اللمس.
في الإصدار Android 3 والإصدارات الأقدم، كان يُفترض أنّ جميع الأجهزة التي تعمل باللمس هي أجهزة ذات شاشات لمس.
touch.orientationAware
التعريف: touch.orientationAware = 0 | 1
يحدّد هذا الإعداد ما إذا كان يجب أن يتفاعل الجهاز الذي يعمل باللمس مع تغييرات اتجاه الشاشة.
-
إذا كانت القيمة
1، يتم تدوير مواضع اللمس التي يسجّلها جهاز اللمس كلما تغيّر اتجاه الشاشة. -
إذا كانت القيمة
0، تكون مواضع اللمس التي يسجّلها جهاز اللمس محصّنة ضد تغييرات اتجاه العرض.
القيمة التلقائية هي 1 إذا كان الجهاز مزوّدًا بشاشة لمس، و0
في الحالات الأخرى.
يميّز النظام بين شاشات اللمس وشاشات العرض الداخلية والخارجية. يتم تدوير شاشة اللمس الداخلية التي تراعي الاتجاه استنادًا إلى اتجاه الشاشة الداخلية. يتم تدوير شاشة اللمس الخارجية التي تراعي الاتجاه بناءً على اتجاه شاشة العرض الخارجية.
يتم استخدام ميزة "التعرّف على الاتجاه" لإتاحة تدوير شاشات اللمس على أجهزة مثل Nexus One. على سبيل المثال، عند تدوير الجهاز في اتجاه عقارب الساعة بمقدار 90 درجة من اتجاهه الطبيعي، تتم إعادة تعيين المواضع المطلقة للمسات بحيث يتم الإبلاغ عن لمسة في الزاوية العلوية اليسرى من نظام الإحداثيات المطلق لشاشة اللمس كلمسة في الزاوية العلوية اليسرى من نظام الإحداثيات الذي تم تدويره للشاشة. يتم ذلك حتى يتم الإبلاغ عن اللمسات باستخدام نظام الإحداثيات نفسه الذي تستخدمه التطبيقات لرسم عناصرها المرئية.
قبل إصدار Honeycomb، كان من المفترض أن تكون جميع الأجهزة التي تعمل باللمس قادرة على التعرّف على الاتجاه.
touch.gestureMode
التعريف: touch.gestureMode = pointer | spots |
default
يحدّد هذا الإعداد وضع العرض التقديمي لإيماءات المؤشر. لا تكون سمة الإعداد هذه ذات صلة إلا عندما يكون جهاز اللمس من نوع المؤشر.
-
إذا كانت القيمة
pointer، يتم عرض إيماءات لوحة اللمس من خلال مؤشر مشابه لمؤشر الماوس. -
إذا كانت القيمة
spots، يتم عرض إيماءات لوحة اللمس من خلال علامة ارتساء تمثّل مركز الإيماءة ومجموعة من النقاط الدائرية التي تمثّل موضع كل إصبع.
القيمة التلقائية هي pointer عند ضبط السمة INPUT_PROP_SEMI_MT، أو spots في الحالات الأخرى.
الحقلان X وY
يوفّر الحقلان X وY معلومات عن موضع مركز منطقة اللمس.
العملية الحسابية
تكون العملية الحسابية واضحة: يتم استيفاء معلومات الموضع من برنامج تشغيل اللمس خطيًا إلى نظام إحداثيات الإخراج.
xScale = output.width / raw.width
yScale = output.height / raw.height
If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
output.x = (raw.y - raw.y.min) * yScale
output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
output.x = (raw.x.max - raw.x) * xScale
output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
output.x = (raw.y.max - raw.y) * yScale
output.y = (raw.x - raw.x.min) * xScale
End If
حقول touchMajor وtouchMinor وtoolMajor وtoolMinor وsize
يصف الحقلان touchMajor وtouchMinor الأبعاد التقريبية
لمنطقة اللمس بوحدات الإخراج (وحدات البكسل).
يصف الحقلان toolMajor وtoolMinor الأبعاد التقريبية
للأداة نفسها بوحدات الإخراج (بكسل).
يصف الحقل size الحجم العادي للمسة بالنسبة إلى
أكبر لمسة ممكنة يمكن لجهاز اللمس استشعارها. أصغر حجم موحّد ممكن هو 0.0 (لا يوجد تلامس أو لا يمكن قياسه)، وأكبر حجم موحّد ممكن هو 1.0 (منطقة أداة الاستشعار مشبعة).
عندما يكون من الممكن قياس الطول والعرض التقريبيين، يحدّد الحقل touchMajor البُعد الأطول ويحدّد الحقل touchMinor البُعد الأقصر لمنطقة اللمس. عندما يكون من الممكن قياس القطر التقريبي لمنطقة التلامس فقط،
يكون الحقلان touchMajor وtouchMinor متساويين.
وبالمثل، يحدّد الحقل toolMajor البُعد الأطول، بينما يحدّد الحقل toolMinor البُعد الأقصر لمساحة المقطع العرضي للأداة.
إذا كان حجم اللمس غير متاح ولكن حجم الأداة متاح، يتم ضبط حجم الأداة ليساوي حجم اللمس. وعلى العكس، إذا كان حجم الأداة غير متاح ولكن حجم اللمس متاح، يتم ضبط حجم اللمس على أنّه يساوي حجم الأداة.
تقيس الأجهزة التي تعمل باللمس حجم اللمس وحجم الأداة أو تبلّغ عنهما بطرق مختلفة. يتيح التنفيذ الحالي ثلاثة أنواع مختلفة من القياسات: القطر والمساحة والمربع المحيط الهندسي في وحدات السطح.
<touch.size.calibration< h4=""></touch.size.calibration<>
التعريف: touch.size.calibration = none |
geometric | diameter
| area | default
تحدّد نوع القياس الذي يستخدمه برنامج تشغيل اللمس لإعداد تقرير عن حجم اللمس وحجم الأداة.
-
إذا كانت القيمة
none، يتم ضبط الحجم على صفر. -
إذا كانت القيمة
geometric، يُفترض أن يكون الحجم محدّدًا بوحدات السطح نفسها التي تم تحديد الموضع بها، وبالتالي يتم تغيير حجمه بالطريقة نفسها. -
إذا كانت القيمة
diameter، يُفترض أنّ الحجم يتناسب مع قُطر (عرض) اللمسة أو الأداة. -
إذا كانت القيمة
area، يُفترض أنّ الحجم يتناسب مع مساحة اللمس أو الأداة. -
إذا كانت القيمة
default، يستخدم النظام معايرةgeometricإذا كان المحورraw.touchMajorأوraw.toolMajorمتاحًا، وإلا فإنه يستخدم معايرةnone.
touch.size.scale
التعريف: touch.size.scale = <رقم نقطة عائمة غير سالب>
تحدّد هذه السمة عامل قياس ثابتًا يُستخدَم في المعايرة.
تكون القيمة التلقائية 1.0.
touch.size.bias
التعريف: touch.size.bias = <رقم نقطة عائمة غير سالب>
تحدّد قيمة انحياز ثابتة تُستخدَم في المعايرة.
تكون القيمة التلقائية 0.0.
touch.size.isSummed
التعريف: touch.size.isSummed = 0 | 1
تحدّد هذه السياسة ما إذا كان سيتم تسجيل الحجم كمجموع أحجام جميع جهات الاتصال النشطة، أو سيتم تسجيله بشكل فردي لكل جهة اتصال.
-
إذا كانت القيمة
1، يتم تقسيم الحجم المسجَّل على عدد جهات الاتصال قبل الاستخدام. -
إذا كانت القيمة
0، يتم استخدام الحجم الذي تم الإبلاغ عنه كما هو.
تكون القيمة التلقائية 0.
لا يمكن لبعض الأجهزة التي تعمل باللمس، لا سيما أجهزة "Semi-MT"، التمييز بين
الأبعاد الفردية لجهات الاتصال المتعددة، لذا فإنها تبلّغ عن قياس حجم
يمثل المساحة الإجمالية أو العرض الإجمالي. يجب ضبط هذه السمة على 1 فقط لهذه الأجهزة. إذا لم تكن متأكدًا، اضبط هذه القيمة على 0.
العملية الحسابية
يعتمد احتساب الحقول touchMajor وtouchMinor وtoolMajor وtoolMinor وsize على مَعلمات المعايرة المحدّدة.
If raw.touchMajor and raw.toolMajor are available:
touchMajor = raw.touchMajor
touchMinor = raw.touchMinor
toolMajor = raw.toolMajor
toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
toolMajor = touchMajor = raw.touchMajor
toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
touchMajor = toolMajor = raw.toolMajor
touchMinor = toolMinor = raw.toolMinor
Else
touchMajor = toolMajor = 0
touchMinor = toolMinor = 0
size = 0
End If
size = avg(touchMajor, touchMinor)
If touch.size.isSummed == 1:
touchMajor = touchMajor / numberOfActiveContacts
touchMinor = touchMinor / numberOfActiveContacts
toolMajor = toolMajor / numberOfActiveContacts
toolMinor = toolMinor / numberOfActiveContacts
size = size / numberOfActiveContacts
End If
If touch.size.calibration == "none":
touchMajor = toolMajor = 0
touchMinor = toolMinor = 0
size = 0
Else If touch.size.calibration == "geometric":
outputScale = average(output.width / raw.width, output.height / raw.height)
touchMajor = touchMajor * outputScale
touchMinor = touchMinor * outputScale
toolMajor = toolMajor * outputScale
toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
touchMajor = sqrt(touchMajor)
touchMinor = touchMajor
toolMajor = sqrt(toolMajor)
toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
touchMinor = touchMajor
toolMinor = toolMajor
End If
If touchMajor != 0:
output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
output.touchMajor = 0
End If
If touchMinor != 0:
output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
output.touchMinor = 0
End If
If toolMajor != 0:
output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
output.toolMajor = 0
End If
If toolMinor != 0:
output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
output.toolMinor = 0
End If
output.size = size
حقل الضغط
يصف الحقل pressure الضغط المادي التقريبي المطبَّق على الجهاز الذي يعمل باللمس كقيمة عادية بين 0.0 (بدون لمس) و1.0 (ضغط عادي).
يشير الضغط الصفري إلى أنّ الأداة تحوم فوق الشاشة.
touch.pressure.calibration
التعريف: touch.pressure.calibration = none |
physical | amplitude | default
تحدّد هذه السمة نوع القياس الذي يستخدمه برنامج تشغيل اللمس للإبلاغ عن الضغط.
-
إذا كانت القيمة
none، يكون الضغط غير معروف، لذا يتم ضبطه على 1.0 عند اللمس و0.0 عند التمرير. -
إذا كانت القيمة
physical، يُفترض أنّ محور الضغط يقيس مستوى الجهد الفعلي للضغط على لوحة اللمس. -
إذا كانت القيمة
amplitude، يُفترض أنّ محور الضغط يقيس سعة الإشارة، وهي مرتبطة بحجم نقطة اللمس والضغط المطبَّق. -
إذا كانت القيمة
default، يستخدم النظام معايرةphysicalإذا كان محور الضغط متاحًا، وإلا يستخدمnone.
touch.pressure.scale
التعريف: touch.pressure.scale = <رقم نقطة عائمة غير سالب>
تحدّد هذه السمة عامل قياس ثابتًا يُستخدَم في المعايرة.
تكون القيمة التلقائية 1.0 / raw.pressure.max.
العملية الحسابية
يعتمد احتساب حقل pressure على مَعلمات المعايرة المحدّدة.
If touch.pressure.calibration == "physical" or "amplitude":
output.pressure = raw.pressure * touch.pressure.scale
Else
If hovering:
output.pressure = 0
Else
output.pressure = 1
End If
End If
حقلي الاتجاه والإمالة
يصف الحقل orientation اتجاه اللمس والأداة كقياس
زاوي. تشير القيمة 0 إلى أنّ المحور الرئيسي
عمودي، وتشير القيمة -PI/2 إلى أنّ المحور الرئيسي
موجَّه إلى اليسار، وتشير القيمة PI/2 إلى أنّ المحور الرئيسي موجَّه إلى اليمين. عند استخدام قلم، يمكن وصف نطاق الاتجاه في نطاق دائرة كاملة من -PI أو PI.
يصف الحقل tilt ميل الأداة كقياس زاوي.
تشير درجة الإمالة 0 إلى أنّ الأداة متعامدة على السطح.
تشير قيمة الإمالة PI/2 إلى أنّ الأداة موضوعة بشكل مسطّح على السطح.
touch.orientation.calibration
التعريف: touch.orientation.calibration = none |
interpolated | vector | default
تحدّد هذه السمة نوع القياس الذي يستخدمه برنامج تشغيل اللمس للإبلاغ عن الاتجاه.
- إذا كانت القيمة
none، يكون الاتجاه غير معروف، لذا يتم ضبطه على 0. - إذا كانت القيمة
interpolated، يتم احتساب معدّل التغيّر في الاتجاه بشكل خطي بحيث يتم ربط القيمة الأوليةraw.orientation.minبالقيمة-PI/2والقيمة الأوليةraw.orientation.maxبالقيمةPI/2. القيمة المركزية لـ(raw.orientation.min + raw.orientation.max) / 2هي0. - إذا كانت القيمة
vector، يتم تفسير الاتجاه على أنّه متجه مجمّع يتألف من حقلَين موقّعَين من 4 بت. يُستخدم هذا التمثيل في أجزاء بروتوكول Atmel Object Based Protocol. عند فك ترميزه، ينتج عن المتجه زاوية اتجاه ومقدار ثقة. يتم استخدام مقدار الثقة لتحديد حجم المعلومات، ما لم تكن هندسية. - إذا كانت القيمة
default، يستخدم النظام معايرةinterpolatedإذا كان محور الاتجاه متاحًا، وإلا فسيستخدمnone.
العملية الحسابية
يعتمد احتساب الحقلَين orientation وtilt على مَعلمات المعايرة المحدّدة والبيانات المتاحة.
If touch.tiltX and touch.tiltY are available:
tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
center = average(raw.orientation.min, raw.orientation.max)
output.orientation = PI / (raw.orientation.max - raw.orientation.min)
output.tilt = 0
Else If touch.orientation.calibration == "vector":
c1 = (raw.orientation & 0xF0) >> 4
c2 = raw.orientation & 0x0F
If c1 != 0 or c2 != 0:
If c1 >= 8 Then c1 = c1 - 16
If c2 >= 8 Then c2 = c2 - 16
angle = atan2(c1, c2) / 2
confidence = sqrt(c1*c1 + c2*c2)
output.orientation = angle
If touch.size.calibration == "diameter" or "area":
scale = 1.0 + confidence / 16
output.touchMajor *= scale
output.touchMinor /= scale
output.toolMajor *= scale
output.toolMinor /= scale
End If
Else
output.orientation = 0
End If
output.tilt = 0
Else
output.orientation = 0
output.tilt = 0
End If
If orientation aware:
If screen rotation is 90 degrees:
output.orientation = output.orientation - PI / 2
Else If screen rotation is 270 degrees:
output.orientation = output.orientation + PI / 2
End If
End If
حقل المسافة
يصف الحقل distance المسافة بين الأداة وسطح الجهاز الذي يعمل باللمس. تشير القيمة 0.0 إلى التلامس المباشر، بينما تشير القيم الأكبر إلى
زيادة المسافة عن السطح.
touch.distance.calibration
التعريف: touch.distance.calibration = none |
scaled | default
تحدّد هذه السمة نوع القياس الذي يستخدمه برنامج تشغيل اللمس للإبلاغ عن المسافة.
-
إذا كانت القيمة
none، تكون المسافة غير معروفة، لذا يتم ضبطها على 0. -
إذا كانت القيمة
scaled، يتم ضرب المسافة التي تم الإبلاغ عنها في عامل قياس ثابت. -
إذا كانت القيمة
default، يستخدم النظام معايرةscaledإذا كان محور المسافة متاحًا، وإلا يستخدمnone.
touch.distance.scale
التعريف: touch.distance.scale = <رقم نقطة عائمة غير سالب>
تحدّد هذه السمة عامل قياس ثابتًا يُستخدَم في المعايرة.
تكون القيمة التلقائية 1.0.
العملية الحسابية
يعتمد احتساب الحقل distance على مَعلمات المعايرة المحدّدة.
If touch.distance.calibration == "scaled":
output.distance = raw.distance * touch.distance.scale
Else
output.distance = 0
End If
مثال
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
ملاحظات حول التوافق
تغيّرت خصائص الإعدادات للأجهزة التي تعمل باللمس بشكل كبير في الإصدار 4.0 من نظام التشغيل Android Ice Cream Sandwich. يجب تعديل جميع ملفات إعداد أجهزة الإدخال للأجهزة التي تعمل باللمس لاستخدام خصائص الإعداد الجديدة.
قد تحتاج أيضًا برامج تشغيل أجهزة اللمس القديمة إلى التحديث.
ملفات ربط المفاتيح الافتراضية
يمكن استخدام الأجهزة التي تعمل باللمس لتنفيذ المفاتيح الافتراضية.
هناك عدة طرق للقيام بذلك، اعتمادًا على إمكانيات وحدة التحكم باللمس. يمكن ضبط بعض وحدات التحكّم باللمس مباشرةً لتنفيذ المفاتيح البرمجية من خلال ضبط سجلات البرامج الثابتة. في أحيان أخرى، يكون من المستحسن إجراء عملية الربط من إحداثيات اللمس إلى رموز المفاتيح في البرنامج.
عند تنفيذ المفاتيح الافتراضية في البرنامج، يجب أن تصدِّر النواة ملف خريطة المفاتيح الافتراضية باسم virtualkeys.<devicename> كسمة للوحة. على سبيل المثال،
إذا كانت برامج تشغيل جهاز شاشة اللمس تبلّغ عن اسمها على أنّه "touchyfeely"،
يجب أن يتضمّن ملف خريطة المفاتيح الافتراضية المسار
/sys/board_properties/virtualkeys.touchyfeely.
يصف ملف خريطة المفاتيح الافتراضية الإحداثيات ورموز مفاتيح Linux للمفاتيح الافتراضية على شاشة اللمس.
بالإضافة إلى ملف خريطة المفاتيح الافتراضية، يجب أن يكون هناك ملف تخطيط مفاتيح وملف خريطة أحرف مفاتيح مطابقَين لربط رموز مفاتيح Linux برموز مفاتيح Android وتحديد نوع جهاز لوحة المفاتيح (عادةً SPECIAL_FUNCTION).
البنية
ملف خريطة المفاتيح الافتراضية هو ملف نص عادي يتكون من سلسلة من أوصاف تخطيط المفاتيح الافتراضية إما مفصولة بأسطر جديدة أو بنقطتين.
تبدأ أسطر التعليقات بالرمز '#' وتستمر حتى نهاية السطر.
يتم وصف كل مفتاح افتراضي من خلال 6 مكوّنات تفصل بينها نقطتان:
-
0x01: رمز الإصدار يجب أن تكون القيمة دائمًا0x01. - <Linux key code>: رمز مفتاح Linux للمفتاح الافتراضي.
- <centerX>: إحداثيات البكسل X لمركز المفتاح الافتراضي
- <centerY>: إحداثيات البكسل Y لمركز المفتاح الافتراضي
- <width>: عرض المفتاح الافتراضي بالبكسل
- <height>: ارتفاع المفتاح الافتراضي بالبكسل
يتم تحديد جميع الإحداثيات والأحجام وفقًا لنظام إحداثيات العرض.
في ما يلي ملف خريطة مفاتيح افتراضية مكتوب بالكامل في سطر واحد.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
يمكن أيضًا كتابة ملف خريطة المفاتيح الافتراضية نفسه على أسطر متعددة.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
في المثال أعلاه، تبلغ دقة شاشة اللمس 480×800. وبناءً على ذلك، فإن جميع المفاتيح الافتراضية لها إحداثي <centerY> بقيمة 835، وهو أقل قليلاً من المنطقة المرئية من شاشة اللمس.
يحتوي المفتاح الأول على رمز مسح ضوئي لنظام التشغيل Linux بقيمة 158 (KEY_BACK)، وcenterX بقيمة
55، وcenterY بقيمة 835، وعرض بقيمة 90، وارتفاع بقيمة
55.
مثال
ملف خريطة المفاتيح الافتراضية: /sys/board_properties/virtualkeys.touchyfeely
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
ملف تنسيق المفاتيح: /system/usr/keylayout/touchyfeely.kl
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
ملف خريطة الأحرف الرئيسية: /system/usr/keychars/touchyfeely.kcm
type SPECIAL_FUNCTION
إيماءات المؤشر غير المباشرة التي تستخدم اللمس المتعدد
في وضع المؤشر، يفسّر النظام الإيماءات التالية:
- النقر بإصبع واحد: النقر
- حركة بإصبع واحد: تحريك المؤشر
- حركة إصبع واحد مع الضغط على الأزرار: سحب مؤشر الماوس
- حركة الإصبعين في الاتجاه نفسه: سحب المنطقة أسفل المؤشر في ذلك الاتجاه لا يتحرّك المؤشر نفسه.
- حركة الإصبعين: يتحرك كلا الإصبعين تجاه بعضهما البعض أو بعيدًا عن بعضهما البعض في اتجاهات مختلفة: تحريك/تغيير حجم/تدوير المنطقة المحيطة بالمؤشر. لا يتحرّك المؤشر نفسه.
- حركة الأصابع المتعددة: إيماءة حرة
تجاهُل لمس راحة اليد
اعتبارًا من الإصدار 13 من نظام التشغيل Android، يمكن للنظام رفض الإدخالات من راحة اليد تلقائيًا
عند تفعيل إطار العمل المضمّن. لا تزال الحلول المخصّصة والمصمّمة داخليًا متاحة،
على الرغم من أنّه قد يلزم تعديلها لعرض العلامة TOOL_TYPE_PALM عند رصد
راحة اليد. يعمل إطار العمل المضمّن أيضًا مع الحلول المخصّصة.
يحلّل النموذج الفعلي أول 90 ملي ثانية من بيانات الإيماءات، عند المؤشر الحالي والمؤشرات المحيطة، ثم يحدّد مدى بُعد اللمسات عن حافة الشاشة.
بعد ذلك، يحدّد النظام المؤشرات التي تمثّل راحة اليد، وذلك على أساس كل مؤشر. ويأخذ في الاعتبار أيضًا حجم كل جهة اتصال، كما هو موضّح في touchMajor وtouchMinor. بعد ذلك، يزيل إطار عمل Android المؤشرات التي تم وضع علامة عليها على أنّها
راحة اليد من سلسلة اللمس.
إذا سبق أن تم إرسال مؤشر إلى التطبيقات، فسيقوم النظام بأحد الإجراءين التاليين:
- (في حال توفّر مؤشرات نشطة أخرى) يتم إلغاء المؤشر الذي تم ضبطه على
ACTION_POINTER_UPوFLAG_CANCELED. - (إذا كان هذا هو المؤشر الوحيد) يتم إلغاء المؤشر باستخدام
ACTION_CANCEL.
تشير واجهة برمجة التطبيقات العامة MotionEvent.FLAG_CANCELED إلى أنّ الحدث الحالي لا يجب أن يؤدي إلى اتخاذ إجراء من قِبل المستخدم. يتم ضبط هذه العلامة لكل من ACTION_CANCEL وACTION_POINTER_UP.
إذا لم يتم إرسال مؤشر راحة اليد إلى التطبيقات، سيتجاهل النظام المؤشر ببساطة.
تفعيل ميزة "تجاهُل لمس راحة اليد"
- في برنامج تشغيل اللمس، استخدِم
وحدات ماكرو
input_abs_set_resلضبط درجات الدقة للحقول التالية (الوحدات هي بكسل لكل ملم):ABS_MT_POSITION_XABS_MT_POSITION_YABS_MT_TOUCH_MAJORABS_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