يدعم نظام التشغيل 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
التعريف: 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
MAPS إلى-PI/2
وقيمة خام لـraw.orientation.max
إلىPI/2
. القيمة المركزية لـ(raw.orientation.min + raw.orientation.max) / 2
خرائط إلى0
. - إذا كانت القيمة
vector
، فسيتم تفسير الاتجاه على أنه متجه معبأ يمتد لحقلين موقّعين 4 بت. يتم استخدام هذا التمثيل على أجزاء البروتوكول القائم على كائن ATMEL. عندما يتم فك تشفيرها ، ينتج عن المتجه زاوية اتجاه وحجم الثقة. يتم استخدام حجم الثقة لتوسيع نطاق معلومات الحجم ، ما لم تكن هندسية. - إذا كانت القيمة
default
، فإن النظام يستخدم المعايرةinterpolated
إذا كان محور الاتجاه متاحًا ، وإلا لا يستخدمnone
.
عملية حسابية
يعتمد حساب حقول orientation
tilt
على معلمات المعايرة المحددة والمدخلات المتاحة.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
حقل المسافة
يصف حقل distance
المسافة بين الأداة وسطح اللمس. تشير قيمة 0.0 إلى التلامس المباشر والقيم الكبيرة تشير إلى زيادة المسافة من السطح.
touch.distance.calibration
التعريف: touch.distance.calibration
= none
| scaled
| default
يحدد نوع القياس الذي يستخدمه برنامج تشغيل اللمس للإبلاغ عن المسافة.
إذا كانت القيمة
none
، فإن المسافة غير معروفة بحيث يتم ضبطها على 0.إذا تم
scaled
القيمة ، يتم ضرب المسافة المبلغ عنها بعامل مقياس ثابت.إذا كانت القيمة
default
، فإن النظام يستخدم المعايرةscaled
إذا كان محور المسافة متاحًا ، وإلا لا يستخدمnone
.
touch.distance.scale
التعريف: touch.distance.scale
= <a رقم النقطة العائمة غير السلبية
يحدد عامل مقياس ثابت يستخدم في المعايرة.
القيمة الافتراضية هي 1.0
.
عملية حسابية
يعتمد حساب حقل distance
على معلمات المعايرة المحددة.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
مثال
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
ملاحظات التوافق
تغيرت خصائص التكوين لأجهزة اللمس بشكل كبير في Android Ice Cream Sandwich 4.0. يجب تحديث جميع ملفات تكوين جهاز الإدخال لأجهزة اللمس لاستخدام خصائص التكوين الجديدة.
قد تحتاج برامج تشغيل أجهزة اللمس الأقدم أيضًا إلى تحديثها.
ملفات خريطة المفاتيح الافتراضية
يمكن استخدام أجهزة اللمس لتنفيذ المفاتيح الافتراضية.
هناك عدة طرق للقيام بذلك ، اعتمادًا على قدرات وحدة تحكم اللمس. يمكن تكوين بعض وحدات التحكم التي تعمل باللمس مباشرة لتنفيذ مفاتيح ناعمة عن طريق تعيين سجلات البرامج الثابتة. في أوقات أخرى ، من المستحسن إجراء التعيين من إحداثيات اللمس إلى الرموز الرئيسية في البرامج.
عند تطبيق المفاتيح الافتراضية في البرنامج ، يجب على kernel تصدير ملف خريطة مفتاح افتراضي يسمى virtualkeys.<devicename>
كخاصية لوح. على سبيل المثال ، إذا أبلغت برامج تشغيل جهاز الشاشة التي تعمل باللمس عن اسمها باسم "Soundyfeely" ، فيجب أن يحتوي ملف خريطة المفتاح الافتراضي على path /sys/board_properties/virtualkeys.touchyfeely
.
يصف ملف خريطة مفتاح افتراضي الإحداثيات ورموز مفاتيح Linux للمفاتيح الافتراضية على شاشة اللمس.
بالإضافة إلى ملف خريطة المفاتيح الظاهرية ، يجب أن يكون هناك ملف تخطيط مفاتيح مقابل وملف خريطة حرف المفتاح لتعيين رموز مفتاح Linux إلى رموز مفاتيح Android ولتحديد نوع جهاز لوحة المفاتيح (عادةً SPECIAL_FUNCTION
).
بناء الجملة
ملف خريطة المفتاح الظاهري هو ملف نصي عادي يتكون من سلسلة من أوصاف تخطيط المفاتيح الظاهرية إما مفصولة بواسطة الخطوط الجديدة أو بواسطة colons.
تبدأ خطوط التعليق بـ "#" وتستمر حتى نهاية الخط.
يتم وصف كل مفتاح افتراضي من خلال 6 مكونات من القولون:
-
0x01
: رمز الإصدار. يجب أن يكون دائما0x01
. - <Linux Key Code>: رمز مفتاح Linux للمفتاح الظاهري.
- <CenterX>: إحداثيات X Pixel لمركز المفتاح الظاهري.
- <Centery>: إحداثي Y Pixel من مركز المفتاح الظاهري.
- <didth>: عرض المفتاح الظاهري بالبكسل.
- <Shight>: ارتفاع المفتاح الظاهري بالبكسل.
يتم تحديد جميع الإحداثيات والأحجام من حيث نظام إحداثيات العرض.
فيما يلي ملف خريطة مفتاح افتراضي كل مكتوبة على سطر واحد.
# 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
إيماءات مؤشر اللمسات غير المباشرة غير المباشرة
في وضع المؤشر ، يفسر النظام الإيماءات التالية:
- نقر إصبع واحد: انقر.
- حركة إصبع واحدة: حرك المؤشر.
- يضغط زر حركة الإصبع المفرد: اسحب المؤشر.
- حركة إصبعين يتحركان في نفس الاتجاه: اسحب المنطقة أسفل المؤشر في هذا الاتجاه. المؤشر نفسه لا يتحرك.
- حركة إصبعين يتجهان نحو بعضهما البعض أو بصرف النظر في اتجاهات مختلفة: المقلاة/المقياس/تدوير المنطقة المحيطة بالمؤشر. المؤشر نفسه لا يتحرك.
- حركة إصبع متعددة: لفتة freeform.
رفض النخيل
اعتبارًا من Android 13 ، يمكن للنظام رفض المدخلات تلقائيًا من النخيل عند تمكين الإطار المدمج. في المنزل ، لا تزال الحلول المصممة خصيصًا مدعومة ، على الرغم من أنها قد تحتاج إلى تعديلها لإرجاع علامة TOOL_TYPE_PALM
عند اكتشاف راحة يد. يعمل الإطار المدمج أيضًا بالتزامن مع الحلول المخصصة.
يبحث النموذج الفعلي في أول 90 مللي ثانية من بيانات الإيماءات ، في المؤشر الحالي ، وفي المؤشرات المحيطة ، ثم ينظر في مدى بقاء حافة الشاشة التي تمر بها اللمسات. ثم يحدد ، على أساس لكل مؤشر ، أي من المؤشرات هي النخيل. كما يأخذ في الاعتبار حجم كل جهة اتصال ، كما ذكرت من قبل touchMajor
و touchMinor
. ثم يقوم إطار Android بإزالة المؤشرات التي يتم تمييزها على النخيل من تيار اللمس.
إذا تم إرسال مؤشر بالفعل إلى التطبيقات ، فإن النظام أيضًا:
- (إذا كانت هناك مؤشرات نشطة أخرى) تلغي المؤشر باستخدام مجموعة
ACTION_POINTER_UP
وFLAG_CANCELED
. - (إذا كان هذا هو المؤشر الوحيد) يلغي المؤشر باستخدام
ACTION_CANCEL
.
تشير واجهة برمجة تطبيقات عامة ، MotionEvent.FLAG_CANCELED
، إلى أن الحدث الحالي لا ينبغي أن يؤدي إلى إجراء المستخدم. تم تعيين هذه العلامة لكل من ACTION_CANCEL
و ACTION_POINTER_UP
.
إذا لم يتم إرسال مؤشر النخيل إلى التطبيقات ، فإن النظام ببساطة يسقط المؤشر.
تمكين رفض النخيل
- في برنامج تشغيل اللمس الخاص بك ، استخدم الماكرو
input_abs_set_res
لتعيين قرارات الحقول التالية (الوحدات هي وحدات بكسل لكل مم ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
دعم
ABS_MT_TOUCH_MINOR
اختياري. ومع ذلك ، إذا كان جهازك يدعمه ، فتأكد من ضبط الدقة بشكل صحيح. -
- لتأكيد تم تعيين الحقول بشكل صحيح ، تشغيل:
$ adb shell getevent -li
- لتمكين الميزة أثناء وقت التشغيل ، Run:
$ 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