يدعم Android مجموعة متنوعة من الشاشات التي تعمل باللمس ولوحات اللمس ، بما في ذلك أجهزة التحويل الرقمي القائمة على القلم.
الشاشات التي تعمل باللمس هي أجهزة تعمل باللمس مرتبطة بشاشة بحيث يكون لدى المستخدم انطباع بأنه يعالج العناصر مباشرة على الشاشة.
لوحات اللمس هي أجهزة تعمل باللمس لا ترتبط بشاشة مثل جهاز التحويل الرقمي اللوحي. تُستخدم لوحات اللمس عادةً للإشارة أو لتحديد المواضع غير المباشر المطلق أو التحكم المستند إلى الإيماءات لواجهة المستخدم.
قد تحتوي الأجهزة التي تعمل باللمس على أزرار تشبه وظائفها أزرار الماوس.
يمكن أحيانًا التلاعب بالأجهزة التي تعمل باللمس باستخدام مجموعة متنوعة من الأدوات المختلفة مثل الأصابع أو القلم اعتمادًا على تقنية مستشعر اللمس الأساسية.
تستخدم أجهزة اللمس أحيانًا لتنفيذ المفاتيح الافتراضية. على سبيل المثال ، في بعض أجهزة Android ، تمتد منطقة مستشعر الشاشة التي تعمل باللمس إلى ما وراء حافة الشاشة وتخدم غرضًا مزدوجًا كجزء من لوحة مفاتيح حساسة للمس.
نظرًا للتنوع الكبير في أجهزة اللمس ، يعتمد Android على عدد كبير من خصائص التكوين لوصف الخصائص والسلوك المطلوب لكل جهاز.
لمس تصنيف الجهاز
يتم تصنيف جهاز الإدخال كجهاز متعدد اللمس إذا استمر كلا الشرطين التاليين:
يقوم جهاز الإدخال بالإبلاغ عن وجود المحاور المطلقة
ABS_MT_POSITION_X
وABS_MT_POSITION_Y
.لا يحتوي جهاز الإدخال على أي أزرار لوحة ألعاب. يحل هذا الشرط الغموض مع بعض لوحات الألعاب التي تُبلغ عن محاور برموز تتداخل مع محاور MT.
يتم تصنيف جهاز الإدخال كجهاز يعمل بلمسة واحدة إذا استمر كلا الشرطين التاليين:
جهاز الإدخال غير مصنف كجهاز متعدد اللمس. يتم تصنيف جهاز الإدخال على أنه جهاز يعمل بلمسة واحدة أو جهاز متعدد اللمس ، وليس كلاهما على الإطلاق.
يقوم جهاز الإدخال بالإبلاغ عن وجود
ABS_X
وABS_Y
، ووجود رمز المفتاحBTN_TOUCH
.
بمجرد تصنيف جهاز الإدخال كجهاز يعمل باللمس ، يتم تحديد وجود المفاتيح الافتراضية من خلال محاولة تحميل ملف خريطة المفاتيح الافتراضية للجهاز. إذا كانت خريطة المفاتيح الافتراضية متاحة ، فسيتم أيضًا تحميل ملف تخطيط المفتاح للجهاز.
راجع القسم أدناه حول موقع وتنسيق ملفات خريطة المفاتيح الافتراضية.
بعد ذلك ، يقوم النظام بتحميل ملف تكوين جهاز الإدخال لجهاز اللمس.
يجب أن تحتوي جميع أجهزة اللمس المدمجة على ملفات تكوين جهاز الإدخال. في حالة عدم وجود ملف تكوين جهاز الإدخال ، سيختار النظام التكوين الافتراضي المناسب للأجهزة الطرفية التي تعمل باللمس النموذجية للأغراض العامة مثل شاشات اللمس الخارجية USB أو Bluetooth HID أو لوحات اللمس. لم يتم تصميم هذه الإعدادات الافتراضية لشاشات اللمس المدمجة وستؤدي على الأرجح إلى سلوك غير صحيح.
بعد تحميل تكوين جهاز الإدخال ، سيقوم النظام بتصنيف جهاز الإدخال كشاشة تعمل باللمس أو لوحة اللمس أو جهاز المؤشر .
يتم استخدام جهاز بشاشة تعمل باللمس للمعالجة المباشرة للأشياء الموجودة على الشاشة. نظرًا لأن المستخدم يلمس الشاشة مباشرة ، فإن النظام لا يتطلب أي تكاليف إضافية للإشارة إلى الكائنات التي يتم التلاعب بها.
يستخدم جهاز لوحة اللمس لتوفير معلومات تحديد الموقع المطلقة لتطبيق حول اللمسات على منطقة مستشعر معينة. قد يكون مفيدًا لأقراص التحويل الرقمي.
يتم استخدام جهاز المؤشر للمعالجة غير المباشرة للكائنات على الشاشة باستخدام المؤشر. يتم تفسير الأصابع على أنها إيماءات مؤشر اللمس المتعدد. يتم تفسير الأدوات الأخرى ، مثل الأقلام ، باستخدام المواضع المطلقة.
راجع إيماءات مؤشر اللمس المتعدد غير المباشر لمزيد من المعلومات.
تُستخدم القواعد التالية لتصنيف جهاز الإدخال كشاشة تعمل باللمس أو لوحة لمس أو جهاز مؤشر .
إذا تم تعيين الخاصية
touch.deviceType
، فسيتم تعيين نوع الجهاز كما هو محدد.إذا أبلغ جهاز الإدخال عن وجود خاصية الإدخال
INPUT_PROP_DIRECT
(عبرEVIOCGPROP
ioctl) ، فسيتم تعيين نوع الجهاز على شاشة اللمس . يفترض هذا الشرط أن أجهزة اللمس ذات الإدخال المباشر متصلة بشاشة متصلة أيضًا.إذا أبلغ جهاز الإدخال عن وجود خاصية الإدخال
INPUT_PROP_POINTER
(عبرEVIOCGPROP
ioctl) ، فسيتم تعيين نوع الجهاز على المؤشر .إذا أبلغ جهاز الإدخال عن وجود المحاور النسبية
REL_X
أوREL_Y
، فسيتم تعيين نوع الجهاز على لوحة اللمس . تعمل هذه الحالة على حل مشكلة الغموض في أجهزة الإدخال التي تتكون من الماوس ولوحة اللمس. في هذه الحالة ، لن يتم استخدام لوحة اللمس للتحكم في المؤشر لأن الماوس يتحكم فيه بالفعل.خلاف ذلك ، سيتم تعيين نوع الجهاز على المؤشر . يضمن هذا الإعداد الافتراضي أن وسادات اللمس التي لم يتم تعيينها لأي غرض خاص آخر ستعمل على التحكم في المؤشر.
أزرار
الأزرار هي عناصر تحكم اختيارية يمكن أن تستخدمها التطبيقات لأداء وظائف إضافية. تعمل الأزرار الموجودة على الأجهزة التي تعمل باللمس بشكل مشابه لأزرار الماوس وهي تستخدم بشكل أساسي مع أجهزة اللمس من نوع المؤشر أو باستخدام قلم.
الأزرار التالية مدعومة:
BTN_LEFT
: معين إلىMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: معين إلىMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: معين إلىMotionEvent.BUTTON_MIDDLE
.BTN_BACK
وBTN_SIDE
: معين إلىMotionEvent.BUTTON_BACK
. يؤدي الضغط على هذا الزر أيضًا إلى توليف الضغط على مفتاح باستخدام رمز المفتاحKeyEvent.KEYCODE_BACK
.BTN_FORWARD
وBTN_EXTRA
: معين إلىMotionEvent.BUTTON_FORWARD
. يؤدي الضغط على هذا الزر أيضًا إلى توليف الضغط على مفتاح باستخدام رمز المفتاحKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: معين إلىMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: معين إلىMotionEvent.BUTTON_TERTIARY
.
الأدوات وأنواع الأدوات
الأداة عبارة عن إصبع أو قلم أو أي جهاز آخر يستخدم للتفاعل مع جهاز اللمس. يمكن لبعض أجهزة اللمس التمييز بين أنواع مختلفة من الأدوات.
في مكان آخر في Android ، كما هو الحال في MotionEvent
API ، غالبًا ما يشار إلى الأداة على أنها مؤشر .
أنواع الأدوات التالية مدعومة:
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_QUADTAP
BTN_TOOL_DOUBLETAP
BTN_TOOL_TRIPLETAP
تستخدم أجهزة اللمس المتعدد أحداث إدخال Linux التالية:
ABS_MT_POSITION_X
: (مطلوب) يُبلغ عن إحداثيات X للأداة.ABS_MT_POSITION_Y
: (مطلوب) يُبلغ عن إحداثيات Y للأداة.ABS_MT_PRESSURE
: (اختياري) يبين الضغط المادي المطبق على طرف الأداة أو قوة إشارة جهة الاتصال اللمسية.ABS_MT_TOUCH_MAJOR
: (اختياري) يبين منطقة المقطع العرضي لجهة الاتصال التي تعمل باللمس ، أو طول البعد الأطول لجهة الاتصال اللمسية.ABS_MT_TOUCH_MINOR
: (اختياري) يبين طول البعد الأقصر لجهة الاتصال اللمسية. لا ينبغي استخدام هذا المحور إذا كانABS_MT_TOUCH_MAJOR
يبلغ عن قياس المنطقة.ABS_MT_WIDTH_MAJOR
: (اختياري) يبين منطقة المقطع العرضي للأداة نفسها ، أو طول البعد الأطول للأداة نفسها. لا يجب استخدام هذا المحور إذا كانت أبعاد الأداة نفسها غير معروفة.ABS_MT_WIDTH_MINOR
: (اختياري) يبين طول البعد الأقصر للأداة نفسها. لا يجب استخدام هذا المحور إذا كانABS_MT_WIDTH_MAJOR
يبلغ عن قياس مساحة أو إذا كانت أبعاد الأداة نفسها غير معروفة.ABS_MT_ORIENTATION
: (اختياري) يبين اتجاه الأداة.ABS_MT_DISTANCE
: (اختياري) يبين مسافة الأداة من سطح جهاز اللمس.ABS_MT_TOOL_TYPE
: (اختياري) يُبلغ عن نوع الأداة كـMT_TOOL_FINGER
أوMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (اختياري) يُبلغ عن معرف التتبع الخاص بالأداة. معرف التتبع هو عدد صحيح عشوائي غير سالب يستخدم لتحديد كل أداة وتتبعها بشكل مستقل عندما تكون أدوات متعددة نشطة. على سبيل المثال ، عندما تلمس عدة أصابع الجهاز ، يجب تعيين معرف تتبع مميز لكل إصبع يتم استخدامه طالما ظل الإصبع ملامسًا. يمكن إعادة استخدام معرفات التتبع عندما تتحرك الأدوات المرتبطة بها خارج النطاق.ABS_MT_SLOT
: (اختياري) يعلن عن معرف الفتحة للأداة ، عند استخدام بروتوكول Linux متعدد اللمس "B". راجع وثائق بروتوكول Linux متعدد اللمس لمزيد من التفاصيل.BTN_TOUCH
: (مطلوب) يشير إلى ما إذا كانت الأداة تلمس الجهاز.BTN_LEFT
،BTN_RIGHT
،BTN_MIDDLE
،BTN_BACK
،BTN_SIDE
،BTN_FORWARD
،BTN_EXTRA
،BTN_STYLUS
،BTN_STYLUS2
: (اختياري) حالات زر التقارير.BTN_TOOL_FINGER
،BTN_TOOL_PEN
،BTN_TOOL_RUBBER
،BTN_TOOL_BRUSH
،BTN_TOOL_PENCIL
،BTN_TOOL_AIRBRUSH
،BTN_TOOL_MOUSE
،BTN_TOOL_LENS
BTN_TOOL_QUADTAP
BTN_TOOL_DOUBLETAP
BTN_TOOL_TRIPLETAP
إذا تم تحديد محاور لكل من بروتوكول اللمسة الواحدة وبروتوكول اللمس المتعدد ، فسيتم استخدام محاور اللمس المتعدد فقط وسيتم تجاهل محاور اللمسة الواحدة.
تحدد القيم الدنيا والحد الأقصى
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
يحتاج إلى بعض المعلومات على الأقل حول طبيعة الأداة ، سواء كانت تلامس أو على الأقل نوع الأداة. في حالة عدم توفر أي معلومات ، يُفترض أن الأداة غير نشطة (خارج النطاق).عند استخدام بروتوكول اللمس المتعدد "أ" ، تكون الأداة نشطة متى ظهرت في أحدث تقرير مزامنة. عندما تتوقف الأداة عن الظهور في تقارير المزامنة ، فإنها تتوقف عن الوجود.
عند استخدام بروتوكول اللمس المتعدد "B" ، تكون الأداة نشطة طالما أنها تحتوي على فتحة نشطة. عندما تم مسح الفتحة ، لم تعد الأداة موجودة.
تم تحديد أداة لتحوم بناءً على الشروط التالية:
إذا كانت الأداة
BTN_TOOL_MOUSE
أوBTN_TOOL_LENS
، فإن الأداة لا تحوم ، حتى إذا تحققت أي من الشروط التالية.إذا كانت الأداة نشطة وأبلغ السائق عن معلومات الضغط ، وكان الضغط المبلغ عنه صفرًا ، فهذا يعني أن الأداة تحوم.
إذا كانت الأداة نشطة وكان برنامج التشغيل يدعم رمز المفتاح
BTN_TOUCH
وكانت قيمةBTN_TOUCH
صفر ، فإن الأداة تحوم.
يدعم
InputReader
كلاً من بروتوكول اللمس المتعدد "أ" و "ب". يجب أن تستخدم برامج التشغيل الجديدة بروتوكول "B" ولكن كلاهما سيعمل.اعتبارًا من Android Ice Cream Sandwich 4.0 ، قد تحتاج إلى تغيير برامج تشغيل الشاشات التي تعمل باللمس لتتوافق مع مواصفات بروتوكول إدخال Linux.
قد تكون التغييرات التالية مطلوبة:
عندما تصبح الأداة غير نشطة (يرتفع الإصبع "لأعلى") ، يجب أن تتوقف عن الظهور في تقارير مزامنة اللمس المتعدد اللاحقة. عندما تصبح جميع الأدوات غير نشطة (كل الأصابع تذهب "لأعلى") ، يجب أن يرسل برنامج التشغيل حزمة تقرير مزامنة فارغة ، مثل
SYN_MT_REPORT
متبوعًا بـSYN_REPORT
.توقعت الإصدارات السابقة من Android الإبلاغ عن أحداث "up" بإرسال قيمة ضغط بقيمة 0. كان السلوك القديم غير متوافق مع مواصفات بروتوكول إدخال Linux ولم يعد مدعومًا.
يجب الإبلاغ عن معلومات الضغط المادي أو قوة الإشارة باستخدام
ABS_MT_PRESSURE
.استردت الإصدارات السابقة من Android معلومات الضغط من
ABS_MT_TOUCH_MAJOR
. كان السلوك القديم غير متوافق مع مواصفات بروتوكول إدخال Linux ولم يعد مدعومًا.يجب الإبلاغ عن معلومات حجم اللمس باستخدام
ABS_MT_TOUCH_MAJOR
.استردت الإصدارات السابقة من Android معلومات الحجم من
ABS_MT_TOOL_MAJOR
. كان السلوك القديم غير متوافق مع مواصفات بروتوكول إدخال Linux ولم يعد مدعومًا.
لم تعد برامج تشغيل الأجهزة التي تعمل باللمس بحاجة إلى تخصيصات خاصة بنظام Android. من خلال الاعتماد على بروتوكول إدخال Linux القياسي ، يمكن لنظام Android دعم مجموعة متنوعة من الأجهزة الطرفية التي تعمل باللمس ، مثل شاشات اللمس المتعددة HID الخارجية ، باستخدام برامج تشغيل غير معدلة.
لمس تشغيل الجهاز
فيما يلي ملخص موجز لتشغيل الجهاز الذي يعمل باللمس على Android.
يقرأ
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 يعني أن القيم دقيقة حتى +/- 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
، يكتشف النظام تلقائيًا نوع الجهاز وفقًا لخوارزمية التصنيف.
راجع قسم التصنيف للحصول على مزيد من التفاصيل حول كيفية تأثير نوع الجهاز على سلوك جهاز اللمس.
قبل Honeycomb ، كان من المفترض أن تكون جميع أجهزة اللمس عبارة عن شاشات تعمل باللمس.
touch.orientationAware
التعريف: touch.orientationAware
= 0
| 1
يحدد ما إذا كان يجب أن يتفاعل الجهاز الذي يعمل باللمس لعرض تغييرات الاتجاه.
إذا كانت القيمة
1
، فسيتم تدوير مواضع اللمس التي أبلغ عنها الجهاز الذي يعمل باللمس كلما تغير اتجاه الشاشة.إذا كانت القيمة
0
، فإن مواضع اللمس التي تم الإبلاغ عنها بواسطة جهاز اللمس تكون محصنة لعرض تغييرات الاتجاه.
القيمة الافتراضية هي 1
إذا كان الجهاز بشاشة تعمل باللمس ، 0
بخلاف ذلك.
يميز النظام بين شاشات اللمس الداخلية والخارجية وشاشات العرض. يتم تدوير شاشة اللمس الداخلية التي تدرك الاتجاه بناءً على اتجاه الشاشة الداخلية. يتم تدوير شاشة اللمس الخارجية التي تدرك الاتجاه بناءً على اتجاه الشاشة الخارجية.
يستخدم الوعي بالتوجيه لدعم تدوير الشاشات التي تعمل باللمس على أجهزة مثل Nexus One. على سبيل المثال ، عندما يتم تدوير الجهاز في اتجاه عقارب الساعة 90 درجة من اتجاهه الطبيعي ، يتم إعادة تعيين المواضع المطلقة لللمسات بحيث يتم الإبلاغ عن اللمسة في الزاوية العلوية اليسرى من نظام الإحداثيات المطلق للشاشة التي تعمل باللمس على أنها لمسة في أعلى اليسار زاوية نظام الإحداثيات المستدير للشاشة. يتم ذلك بحيث يتم الإبلاغ عن اللمسات بنفس نظام الإحداثيات الذي تستخدمه التطبيقات لرسم عناصرها المرئية.
قبل قرص العسل ، كان من المفترض أن تكون جميع الأجهزة التي تعمل باللمس على دراية بالتوجيه.
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
التعريف: 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 رقم الفاصلة العائمة غير السالب>
يحدد عامل التدرج الثابت المستخدم في المعايرة.
القيمة الافتراضية هي 1.0
.
touch.size.bias
التعريف: touch.size.bias
= <a رقم الفاصلة العائمة غير السالب>
يحدد قيمة انحياز ثابتة مستخدمة في المعايرة.
القيمة الافتراضية هي 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
يصف حقل Pressure
المادي التقريبي المطبق على جهاز اللمس كقيمة طبيعية بين 0.0 (بدون لمس) و 1.0 (القوة الكاملة).
يشير الضغط الصفري إلى أن الأداة تحوم.
touch.pressure.calibration
التعريف: touch.pressure.calibration
= none
| physical
| amplitude
| default
يحدد نوع القياس الذي يستخدمه برنامج التشغيل باللمس للإبلاغ عن الضغط.
إذا كانت القيمة
none
، فإن الضغط غير معروف لذلك يتم ضبطه على 1.0 عند اللمس و 0.0 عند التمرير.إذا كانت القيمة
physical
، فمن المفترض أن يقيس محور الضغط الكثافة الفيزيائية الفعلية للضغط المطبق على لوحة اللمس.If the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses thephysical
calibration if the pressure axis available, otherwise usesnone
.
touch.pressure.scale
Definition: touch.pressure.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0 / raw.pressure.max
.
Calculation
The calculation of the Pressure
field depends on the specified calibration parameters.
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
and Tilt
Fields
The Orientation
field describes the orientation of the touch and tool as an angular measurement. An orientation of 0
indicates that the major axis is oriented vertically, -PI/2
indicates that the major axis is oriented to the left, PI/2
indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI
or PI
.
The Tilt
field describes the inclination of the tool as an angular measurement. A tilt of 0
indicates that the tool is perpendicular to the surface. A tilt of PI/2
indicates that the tool is flat on the surface.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifies the kind of measurement used by the touch driver to report the orientation.
If the value is
none
, the orientation is unknown so it is set to 0.If the value is
interpolated
, the orientation is linearly interpolated such that a raw value ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
.If the value is
vector
, the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.If the value is
default
, the system uses theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Calculation
The calculation of the Orientation
and Tilt
fields depends on the specified calibration parameters and available input.
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
Field
The Distance
field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Specifies the kind of measurement used by the touch driver to report the distance.
If the value is
none
, the distance is unknown so it is set to 0.If the value is
scaled
, the reported distance is multiplied by a constant scale factor.If the value is
default
, the system uses thescaled
calibration if the distance axis available, otherwise usesnone
.
touch.distance.scale
Definition: touch.distance.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
Calculation
The calculation of the Distance
field depends on the specified calibration parameters.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Example
# 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 will 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
Compatibility Notes
The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.
Older touch device drivers may also need to be updated.
Virtual Key Map Files
Touch devices are often used to implement virtual keys.
There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.
When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename>
as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely
.
A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.
In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION
).
Syntax
A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.
Comment lines begin with '#' and continue to the end of the line.
Each virtual key is described by 6 colon-delimited components:
-
0x01
: A version code. Must always be0x01
. - <Linux key code>: The Linux key code of the virtual key.
- <centerX>: The X pixel coordinate of the center of the virtual key.
- <centerY>: The Y pixel coordinate of the center of the virtual key.
- <width>: The width of the virtual key in pixels.
- <height>: The height of the virtual key in pixels.
All coordinates and sizes are specified in terms of the display coordinate system.
Here is a virtual key map file all written on one line.
# 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
The same virtual key map file can also be written on multiple lines.
# 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
In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.
The first key has a Linux scan code of 158
( KEY_BACK
), centerX of 55
, centerY of 835
, width of 90
and height of 55
.
Example
Virtual key map file: /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
Key layout file: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key character map file: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirect Multi-touch Pointer Gestures
In pointer mode, the system interprets the following gestures:
Single finger tap: click.
Single finger motion: move the pointer.
Single finger motion plus button presses: drag the pointer.
Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
Multiple finger motion: freeform gesture.
Palm rejection
As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM
flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.
The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the edge of the display the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by TouchMajor
and TouchMinor
. The Android framework then removes the pointers that are marked as palms from the touch stream.
If a pointer was already sent to the apps, then the system either:
- (If there are other active pointers) Cancels the pointer with
ACTION_POINTER_UP
andFLAG_CANCELED
set. - (If this is the only pointer) Cancels the pointer with
ACTION_CANCEL
.
A public API, MotionEvent.FLAG_CANCELED
, indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL
and ACTION_POINTER_UP
.
If the palm pointer wasn't sent to apps, then the system simply drops the pointer.
Enable palm rejection
- In your touch driver, use the
input_abs_set_res
macro to set the resolutions for the following fields (units are pixels per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Support for
ABS_MT_TOUCH_MINOR
is optional. However, if your device does support it, make sure the resolution is set correctly. -
- To confirm the fields are set correctly, run:
$ adb shell getevent -li
- To enable the feature during runtime, run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Restart the
system_server
process.$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys input
shows that there are palm rejectors insideUnwantedInteractionBlocker
. If it doesn't, check the input-related logs to find clues on what might be misconfigured.See the following example for reference:
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: {} - To permanently enable the feature, add the corresponding sysprop command in your
init**rc
file:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1