يدعم نظام التشغيل Android مجموعة متنوعة من شاشات اللمس ولوحات اللمس، بما في ذلك الأجهزة اللوحية الرقمية المعتمدة على القلم.
شاشات اللمس هي أجهزة تعمل باللمس مرتبطة بشاشة عرض بحيث يكون لدى المستخدم انطباع بالتعامل مباشرة مع العناصر الموجودة على الشاشة.
لوحات اللمس هي أجهزة تعمل باللمس غير مرتبطة بشاشة عرض، مثل الكمبيوتر اللوحي الخاص بالتحويل الرقمي. تُستخدم لوحات اللمس عادةً للإشارة أو لتحديد المواقع غير المباشرة المطلقة أو التحكم القائم على الإيماءات في واجهة المستخدم.
يمكن أن تحتوي الأجهزة التي تعمل باللمس على أزرار تشبه وظائفها أزرار الماوس.
يمكن أحيانًا التعامل مع أجهزة اللمس باستخدام مجموعة متنوعة من الأدوات المختلفة مثل الأصابع أو القلم اعتمادًا على تقنية مستشعر اللمس الأساسية.
تُستخدم أجهزة اللمس أحيانًا لتنفيذ المفاتيح الافتراضية. على سبيل المثال، في بعض أجهزة Android، تمتد منطقة مستشعر شاشة اللمس إلى ما هو أبعد من حافة الشاشة وتؤدي غرضًا مزدوجًا كجزء من لوحة المفاتيح الحساسة للمس.
نظرًا للتنوع الكبير في الأجهزة التي تعمل باللمس، يعتمد Android على عدد كبير من خصائص التكوين لوصف الخصائص والسلوك المرغوب لكل جهاز.
لمس تصنيف الجهاز
يتم تصنيف جهاز الإدخال كجهاز متعدد اللمس إذا توفرت الحالتان التاليتان:
- يُبلغ جهاز الإدخال عن وجود المحورين المطلقين
ABS_MT_POSITION_X
وABS_MT_POSITION_Y
. - لا يحتوي جهاز الإدخال على أي أزرار للوحة الألعاب. يحل هذا الشرط الغموض مع بعض لوحات الألعاب التي تُبلغ عن المحاور برموز تتداخل مع تلك الخاصة بمحاور MT.
يتم تصنيف جهاز الإدخال كجهاز يعمل بلمسة واحدة إذا توفرت الحالتان التاليتان:
- جهاز الإدخال غير مصنف كجهاز متعدد اللمس. يتم تصنيف جهاز الإدخال إما كجهاز يعمل بلمسة واحدة أو كجهاز متعدد اللمس، وليس كلاهما أبدًا.
- يُبلغ جهاز الإدخال عن وجود المحورين المطلقين
ABS_X
وABS_Y
، ووجود رمز مفتاحBTN_TOUCH
.
عندما يتم تصنيف جهاز إدخال كجهاز يعمل باللمس، يتم تحديد وجود المفاتيح الافتراضية من خلال محاولة تحميل ملف خريطة المفتاح الظاهري للجهاز. في حالة توفر خريطة مفاتيح افتراضية، فسيتم أيضًا تحميل ملف تخطيط المفتاح للجهاز. ارجع إلى [ملفات خريطة المفاتيح الافتراضية](#virtual-key-map-files) للحصول على معلومات حول موقع هذه الملفات وتنسيقها.
بعد ذلك، يقوم النظام بتحميل ملف تكوين جهاز الإدخال لجهاز اللمس.
يجب أن تحتوي جميع أجهزة اللمس المدمجة على ملفات تكوين جهاز الإدخال. في حالة عدم وجود ملف تكوين جهاز الإدخال، يختار النظام تكوينًا افتراضيًا مناسبًا للأجهزة الطرفية التي تعمل باللمس للأغراض العامة مثل شاشات اللمس الخارجية USB أو Bluetooth HID أو لوحات اللمس. لم يتم تصميم هذه الإعدادات الافتراضية لشاشات اللمس المدمجة ويمكن أن تؤدي إلى سلوك غير صحيح.
بعد تحميل تكوين جهاز الإدخال، يقوم النظام بتصنيف جهاز الإدخال على أنه شاشة تعمل باللمس ، أو لوحة لمس ، أو جهاز مؤشر .
- يتم استخدام جهاز بشاشة تعمل باللمس للتلاعب المباشر بالأشياء الموجودة على الشاشة. يلمس المستخدم الشاشة مباشرة، لذلك لا يتطلب النظام أي إمكانيات إضافية للإشارة إلى الكائنات التي يتم التلاعب بها.
- يتم استخدام جهاز لوحة اللمس لتوفير معلومات تحديد الموقع المطلقة لأحد التطبيقات حول اللمسات على منطقة مستشعر معينة. يمكن أن يكون مفيدًا لأقراص التحويل الرقمي.
- يتم استخدام جهاز المؤشر للتلاعب غير المباشر بالكائنات الموجودة على الشاشة باستخدام المؤشر. يتم تفسير الأصابع على أنها إيماءات مؤشر اللمس المتعدد. يتم تفسير الأدوات الأخرى، مثل الأقلام، باستخدام المواضع المطلقة. راجع إيماءات مؤشر اللمس المتعدد غير المباشرة لمزيد من المعلومات.
يتم استخدام القواعد التالية لتصنيف جهاز الإدخال كشاشة تعمل باللمس، أو لوحة اللمس، أو جهاز المؤشر.
- إذا تم تعيين الخاصية
touch.deviceType
، فسيتم تعيين نوع الجهاز كما هو محدد. - إذا أبلغ جهاز الإدخال عن وجود خاصية الإدخال
INPUT_PROP_DIRECT
(من خلالEVIOCGPROP
ioctl)، فسيتم تعيين نوع الجهاز على شاشة تعمل باللمس . يفترض هذا الشرط أن أجهزة اللمس ذات الإدخال المباشر متصلة بشاشة عرض متصلة أيضًا. - إذا أبلغ جهاز الإدخال عن وجود خاصية الإدخال
INPUT_PROP_POINTER
(من خلالEVIOCGPROP
ioctl)، فسيتم تعيين نوع الجهاز على المؤشر . - إذا أبلغ جهاز الإدخال عن وجود المحورين النسبيين
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
: (اختياري) يُبلغ عن إمالة الأداة من سطح جهاز اللمس على طول المحور Y. -
BTN_TOUCH
: (مطلوب) يشير إلى ما إذا كانت الأداة تلمس الجهاز. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (اختياري) حالات زر التقارير. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (اختياري) يُبلغ عن نوع الأداة .
-
- تستخدم أجهزة اللمس المتعدد أحداث إدخال Linux التالية:
-
ABS_MT_POSITION_X
: (مطلوب) يُبلغ عن الإحداثي X الخاص بالأداة. -
ABS_MT_POSITION_Y
: (مطلوب) يُبلغ عن الإحداثي Y للأداة. -
ABS_MT_PRESSURE
: (اختياري) يُبلغ عن الضغط الجسدي المطبق على طرف الأداة أو قوة إشارة جهة الاتصال التي تعمل باللمس. -
ABS_MT_TOUCH_MAJOR
: (اختياري) يُبلغ عن مساحة المقطع العرضي لجهة الاتصال التي تعمل باللمس، أو طول البعد الأطول لجهة الاتصال التي تعمل باللمس. -
ABS_MT_TOUCH_MINOR
: (اختياري) يُبلغ عن طول البعد الأقصر لجهة الاتصال التي تعمل باللمس. لا ينبغي استخدام هذا المحور إذا كانABS_MT_TOUCH_MAJOR
يقوم بالإبلاغ عن قياس المساحة. -
ABS_MT_WIDTH_MAJOR
: (اختياري) يُبلغ عن مساحة المقطع العرضي للأداة نفسها، أو طول البعد الأطول للأداة نفسها. لا تستخدم هذا المحور إلا إذا كنت تعرف أبعاد الأداة نفسها. -
ABS_MT_WIDTH_MINOR
: (اختياري) يُبلغ عن طول البعد الأقصر للأداة نفسها. لا ينبغي استخدام هذا المحور إذا كانABS_MT_WIDTH_MAJOR
يقوم بالإبلاغ عن قياس مساحة أو إذا كانت أبعاد الأداة نفسها غير معروفة. -
ABS_MT_ORIENTATION
: (اختياري) يُبلغ عن اتجاه الأداة. -
ABS_MT_DISTANCE
: (اختياري) يُبلغ عن مسافة الأداة من سطح جهاز اللمس. -
ABS_MT_TOOL_TYPE
: (اختياري) يُبلغ عن نوع الأداة كـMT_TOOL_FINGER
أوMT_TOOL_PEN
. -
ABS_MT_TRACKING_ID
: (اختياري) يُبلغ عن معرف التتبع الخاص بالأداة. معرف التتبع هو عدد صحيح غير سالب يتم استخدامه لتحديد وتتبع كل أداة بشكل مستقل عندما تكون أدوات متعددة نشطة. على سبيل المثال، عندما تلمس عدة أصابع الجهاز، يجب تعيين معرف تتبع مميز لكل إصبع يتم استخدامه طالما بقي الإصبع على اتصال. يمكن إعادة استخدام معرفات التتبع عندما تتحرك الأدوات المرتبطة بها خارج النطاق. -
ABS_MT_SLOT
: (اختياري) يُبلغ عن معرف الفتحة الخاصة بالأداة، عند استخدام بروتوكول Linux متعدد اللمس 'B'. راجع وثائق بروتوكول اللمس المتعدد لنظام التشغيل Linux للحصول على مزيد من التفاصيل. -
BTN_TOUCH
: (مطلوب) يشير إلى ما إذا كانت الأداة تلمس الجهاز. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (اختياري) حالات زر التقارير. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (اختياري) يُبلغ عن نوع الأداة .
-
- إذا تم تحديد محاور لكل من بروتوكول اللمس الواحد واللمس المتعدد، فسيتم استخدام محاور اللمس المتعدد فقط ويتم تجاهل محاور اللمس الواحد.
تحدد القيم الدنيا والقصوى للمحاور
ABS_X
وABS_Y
وABS_MT_POSITION_X
وABS_MT_POSITION_Y
حدود المنطقة النشطة للجهاز في الوحدات السطحية الخاصة بالجهاز. في حالة شاشة اللمس، تصف المنطقة النشطة الجزء من جهاز اللمس الذي يغطي الشاشة فعليًا.بالنسبة لشاشات اللمس، يقوم النظام تلقائيًا باستيفاء مواضع اللمس المبلغ عنها في الوحدات السطحية للحصول على مواضع اللمس في وحدات بكسل العرض وفقًا للحساب التالي:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
قد تقوم شاشة اللمس بالإبلاغ عن اللمسات خارج المنطقة النشطة المبلغ عنها.
لا يتم تسليم اللمسات التي تتم خارج المنطقة النشطة إلى التطبيقات ولكن يمكن استخدامها للمفاتيح الافتراضية.
يتم تسليم اللمسات التي تبدأ داخل المنطقة النشطة، أو التي تدخل وتخرج من منطقة العرض إلى التطبيقات. وبالتالي، إذا بدأت اللمسة ضمن حدود التطبيق ثم انتقلت خارج المنطقة النشطة، فقد يتلقى التطبيق أحداث لمس بإحداثيات عرض سلبية أو خارج حدود الشاشة. وهذا هو السلوك المتوقع.
يجب ألا يقوم جهاز اللمس مطلقًا بتثبيت إحداثيات اللمس على حدود المنطقة النشطة. إذا خرجت لمسة من المنطقة النشطة، فيجب الإبلاغ عنها على أنها خارج المنطقة النشطة، أو لا ينبغي الإبلاغ عنها على الإطلاق.
على سبيل المثال، إذا كان إصبع المستخدم يلمس بالقرب من الزاوية العلوية اليسرى من شاشة اللمس، فقد يُبلغ عن إحداثيات (minX، minY). إذا استمر الإصبع في التحرك خارج المنطقة النشطة، فيجب أن تبدأ شاشة اللمس إما في الإبلاغ عن الإحداثيات بمكونات أقل من minX وminY، مثل (minX - 2، minY - 3)، أو يجب أن تتوقف عن الإبلاغ عن اللمس تمامًا. بمعنى آخر، لا ينبغي لشاشة اللمس أن تقوم بالإبلاغ (minX، minY) عندما يلمس إصبع المستخدم فعليًا خارج المنطقة النشطة.
يؤدي تثبيت إحداثيات اللمس على حافة الشاشة إلى إنشاء حدود صلبة اصطناعية حول حافة الشاشة مما يمنع النظام من تتبع الحركات بسلاسة التي تدخل حدود منطقة العرض أو تخرج منها.
القيم التي تم الإبلاغ عنها بواسطة
ABS_PRESSURE
أوABS_MT_PRESSURE
، إذا تم الإبلاغ عنها على الإطلاق، يجب أن تكون غير صفرية عندما تلمس الأداة الجهاز وصفر بخلاف ذلك للإشارة إلى أن الأداة تحوم.يعد الإبلاغ عن معلومات الضغط أمرًا اختياريًا ولكن يوصى به بشدة. يمكن للتطبيقات استخدام معلومات الضغط لتنفيذ رسم حساس للضغط وتأثيرات أخرى.
يجب أن تكون القيم التي تم الإبلاغ عنها بواسطة
ABS_TOOL_WIDTH
أوABS_MT_TOUCH_MAJOR
أوABS_MT_TOUCH_MINOR
أوABS_MT_WIDTH_MAJOR
أوABS_MT_WIDTH_MINOR
غير صفرية عندما تلامس الأداة الجهاز وصفر بخلاف ذلك، ولكن هذا غير مطلوب. على سبيل المثال، قد يتمكن جهاز اللمس من قياس حجم جهات الاتصال التي تعمل باللمس بالإصبع وليس جهات الاتصال التي تعمل باللمس.تعد معلومات حجم التقارير اختيارية ولكن يوصى بها بشدة. يمكن للتطبيقات استخدام معلومات الضغط لتنفيذ رسم حساس للحجم وتأثيرات أخرى.
يجب أن تقترب القيم التي تم الإبلاغ عنها بواسطة
ABS_DISTANCE
أوABS_MT_DISTANCE
من الصفر عندما تلمس الأداة الجهاز. يمكن أن تظل المسافة غير صفرية حتى عندما تكون الأداة على اتصال مباشر. تعتمد القيم الدقيقة المبلغ عنها على الطريقة التي يقيس بها الجهاز المسافة.يعد الإبلاغ عن معلومات المسافة أمرًا اختياريًا ولكن يوصى به لأجهزة القلم.
يجب أن تكون القيم التي تم الإبلاغ عنها بواسطة
ABS_TILT_X
وABS_TILT_Y
صفرًا عندما تكون الأداة متعامدة مع الجهاز. يشير الميل غير الصفري إلى أن الأداة مثبتة في وضع مائل.من المفترض أن يتم تحديد زوايا الميل على طول المحورين X وY بالدرجات من العمودي. يتم إعطاء النقطة المركزية (المتعامدة تمامًا) بواسطة
(max + min) / 2
لكل محور. تمثل القيم الأصغر من نقطة المركز ميلًا لأعلى أو إلى اليسار، وتمثل القيم الأكبر من نقطة المركز ميلًا لأسفل أو إلى اليمين.يقوم
InputReader
بتحويل مكونات الميل X وY إلى زاوية إمالة عمودية تتراوح من 0 إلىPI / 2
راديان وزاوية اتجاه مستوية تتراوح من-PI
إلىPI
راديان. وينتج عن هذا التمثيل وصف للاتجاه يتوافق مع ما يستخدم لوصف لمسات الأصابع.يعد الإبلاغ عن معلومات الإمالة أمرًا اختياريًا ولكن يوصى به لأجهزة القلم.
إذا تم الإبلاغ عن نوع الأداة بواسطة
ABS_MT_TOOL_TYPE
، فإنها تحل محل أي معلومات عن نوع الأداة تم الإبلاغ عنها بواسطةBTN_TOOL_*
. إذا لم تتوفر أي معلومات عن نوع الأداة على الإطلاق، فسيتم تعيين نوع الأداة افتراضيًا علىMotionEvent.TOOL_TYPE_FINGER
.يتم تحديد الأداة لتكون نشطة بناءً على الشروط التالية:
عند استخدام بروتوكول اللمسة الواحدة، تكون الأداة نشطة إذا كانت قيمة
BTN_TOUCH
أوBTN_TOOL_*
تساوي 1.يشير هذا الشرط إلى أن
InputReader
يحتاج على الأقل إلى بعض المعلومات حول طبيعة الأداة، سواء كانت تعمل باللمس، أو على الأقل نوع الأداة الخاصة بها. إذا لم تتوفر أي معلومات، فمن المفترض أن تكون الأداة غير نشطة (خارج النطاق).- عند استخدام بروتوكول اللمس المتعدد 'A'، تكون الأداة نشطة عندما تظهر في تقرير المزامنة الأحدث. عندما تتوقف الأداة عن الظهور في تقارير المزامنة، فإنها تتوقف عن الوجود.
- عند استخدام بروتوكول اللمس المتعدد 'B'، تكون الأداة نشطة طالما أنها تحتوي على فتحة نشطة. عندما يتم مسح الفتحة، تتوقف الأداة عن الوجود.
- يتم تحديد الأداة ليتم تحريكها بناءً على الشروط التالية:
- إذا كانت الأداة
BTN_TOOL_MOUSE
أوBTN_TOOL_LENS
، فإن الأداة لا تتحرك، حتى لو تحقق أي من الشرطين التاليين. - إذا كانت الأداة نشطة وقام السائق بالإبلاغ عن معلومات الضغط، وكان الضغط المبلغ عنه صفرًا، فهذا يعني أن الأداة تتحرك.
- إذا كانت الأداة نشطة وكان برنامج التشغيل يدعم رمز مفتاح
BTN_TOUCH
وكانت قيمةBTN_TOUCH
صفرًا، فهذا يعني أن الأداة تتحرك.
- إذا كانت الأداة
- يدعم
InputReader
كلاً من بروتوكول اللمس المتعدد "A" و"B". يجب أن تستخدم برامج التشغيل الجديدة البروتوكول "B" ولكن أيًا منهما يعمل. اعتبارًا من Android 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.
- يقرأ
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
- دقة المحور الخام. على سبيل المثال. الزغب = 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
، فسيكتشف النظام تلقائيًا نوع الجهاز وفقًا لخوارزمية التصنيف.
راجع قسم التصنيف للحصول على مزيد من التفاصيل حول كيفية تأثير نوع الجهاز على سلوك جهاز اللمس.
في نظام Android 3 والإصدارات الأقدم، كان من المفترض أن تكون جميع الأجهزة التي تعمل باللمس عبارة عن شاشات تعمل باللمس.
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، حقول الحجم
يصف حقلا 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
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
.
عملية حسابية
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 can 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
.
عملية حسابية
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
.
عملية حسابية
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
مثال
# 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
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 might 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
.
مثال
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 display edge 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