Android از انواع صفحههای لمسی و پدهای لمسی، ازجمله رایانههای لوحی دیجیتالیساز مبتنی بر قلم، پشتیبانی میکند.
صفحههای لمسی دستگاههای لمسی هستند که با نمایشگری مرتبط هستند که کاربر احساس میکند مستقیماً موارد روی صفحه را دستکاری میکند.
صفحه لمسی دستگاهی لمسی است که با نمایشگر مرتبط نیست، مثل رایانه لوحی رقمیساز. صفحه لمسی معمولاً برای اشاره کردن یا برای موقعیتیابی غیرمستقیم مطلق یا کنترل مبتنی بر اشاره واسط کاربر استفاده میشود.
دستگاههای لمسی میتوانند دکمههایی داشته باشند که عملکردشان مشابه دکمههای موشواره است.
دستگاههای لمسی را گاهی میتوان بااستفاده از ابزارهای مختلفی مثل انگشت یا قلم لمسی دستکاری کرد که این امر به فناوری حسگر لمسی زیرین بستگی دارد.
دستگاههای لمسی گاهی برای پیادهسازی کلیدهای مجازی استفاده میشوند. برای مثال، در برخیاز دستگاههای Android، ناحیه حسگر صفحه لمسی فراتر از لبه نمایشگر گسترش مییابد و بهعنوان بخشی از صفحهکلید حساس به لمس، هدف دوگانهای را دنبال میکند.
بهدلیل تنوع زیاد دستگاههای لمسی، Android به تعداد زیادی از ویژگیهای پیکربندی برای توصیف مشخصات و رفتار مطلوب هر دستگاه متکی است.
طبقهبندی دستگاه لمسی
دستگاه ورودی بهعنوان دستگاه چندلمسی طبقهبندی میشود اگر هر دو شرط زیر برقرار باشد:
- دستگاه ورودی وجود محورهای مطلق
ABS_MT_POSITION_XوABS_MT_POSITION_Yرا گزارش میکند. - دستگاه ورودی هیچ دکمه دسته بازیای ندارد. این شرط ابهام مربوط به برخیاز دستههای بازی را که محورها را با کدهایی گزارش میکنند که با کدهای محورهای MT همپوشانی دارند برطرف میکند.
دستگاه ورودی بهعنوان دستگاه تکلمسی طبقهبندی میشود اگر هر دو شرط زیر برقرار باشد:
- دستگاه ورودی بهعنوان دستگاه چندلمسی طبقهبندی نشده است. دستگاه ورودی یا بهعنوان دستگاه تکلمسی یا بهعنوان دستگاه چندلمسی طبقهبندی میشود، هرگز هر دو نیست.
- دستگاه ورودی وجود محورهای مطلق
ABS_XوABS_Yو وجود کد کلیدBTN_TOUCHرا گزارش میکند.
وقتی دستگاه ورودی بهعنوان دستگاه لمسی طبقهبندی میشود، وجود کلیدهای مجازی با تلاش برای بار کردن فایل نقشه کلید مجازی برای دستگاه تعیین میشود. اگر نگاشت کلید مجازی دردسترس باشد، فایل چیدمان کلید برای دستگاه نیز بار میشود. برای کسب اطلاعات درباره مکان و قالب این فایلها، به [فایلهای نقشه کلید مجازی](#virtual-key-map-files) مراجعه کنید.
سپس، سیستم فایل پیکربندی دستگاه ورودی را برای دستگاه لمسی بار میکند.
همه دستگاههای لمسی داخلی باید فایلهای پیکربندی دستگاه ورودی داشته باشند. اگر فایل پیکربندی دستگاه ورودی وجود نداشته باشد، سیستم پیکربندی پیشفرضی را انتخاب میکند که برای دستگاههای جانبی لمسی با کاربرد عمومی مناسب است، مثل صفحههای لمسی HID بلوتوث یا USB خارجی یا پدهای لمسی. این پیشفرضها برای صفحههای لمسی داخلی طراحی نشدهاند و میتوانند منجر به رفتار نادرست شوند.
پساز بار شدن پیکربندی دستگاه ورودی، سیستم دستگاه ورودی را بهعنوان دستگاه صفحه لمسی، پد لمسی، یا اشارهگر طبقهبندی میکند.
- از دستگاه دارای صفحه لمسی برای دستکاری مستقیم اشیاء روی صفحه استفاده میشود. کاربر مستقیماً صفحه را لمس میکند، بنابراین سیستم به هیچ امکانات اضافی برای نشان دادن اشیایی که دستکاری میشوند نیاز ندارد.
- از دستگاه صفحه لمسی برای ارائه اطلاعات موقعیتیابی مطلق به برنامه درباره لمسهای انجامشده در ناحیه حسگر مشخصی استفاده میشود. این ویژگی میتواند برای تبلتهای دیجیتالی مفید باشد.
- از دستگاه اشارهگر برای دستکاری غیرمستقیم اشیاء روی صفحه بااستفاده از مکاننما استفاده میشود. انگشتان بهعنوان اشارههای اشارهگر چندلمسی تفسیر میشوند. ابزارهای دیگر، مانند قلمها، بااستفاده از موقعیتهای مطلق تفسیر میشوند. برای اطلاعات بیشتر، اشارههای اشارهگر چندلمسی غیرمستقیم را ببینید.
از قوانین زیر برای طبقهبندی دستگاه ورودی بهعنوان صفحه لمسی، پد لمسی، یا دستگاه اشارهگر استفاده میشود.
- اگر ویژگی
touch.deviceTypeتنظیم شده باشد، نوع دستگاه همانطور که نشان داده شده است تنظیم میشود. - اگر دستگاه ورودی وجود ویژگی ورودی
INPUT_PROP_DIRECTرا (ازطریقEVIOCGPROPioctl) گزارش کند، نوع دستگاه روی صفحه لمسی تنظیم میشود. این شرط فرض میکند که دستگاههای لمسی ورودی مستقیم به نمایشگری متصل هستند که آن هم متصل است. - اگر دستگاه ورودی وجود ویژگی ورودی
INPUT_PROP_POINTERرا (ازطریقEVIOCGPROPioctl) گزارش کند، نوع دستگاه روی اشارهگر تنظیم میشود. - اگر دستگاه ورودی وجود محورهای نسبی
REL_XیاREL_Yرا گزارش کند، نوع دستگاه روی صفحه لمسی تنظیم میشود. این شرط ابهام را برای دستگاههای ورودی که هم موشواره و هم صفحه لمسی دارند برطرف میکند. در این حالت، از صفحه لمسی برای کنترل اشارهگر استفاده نمیشود زیرا موشواره ازقبل آن را کنترل میکند. - درغیراینصورت، نوع دستگاه روی اشارهگر تنظیم میشود. این پیشفرض تضمین میکند که صفحههای لمسی که هیچ هدف خاص دیگری برای آنها تعیین نشده است نشانگر را کنترل کنند.
دکمهها
دکمهها کنترلهای اختیاری هستند که برنامهها میتوانند برای انجام عملکردهای اضافی از آنها استفاده کنند. دکمهها در دستگاههای لمسی رفتاری مشابه دکمههای موشواره دارند و عمدتاً در دستگاههای لمسی از نوع اشارهگر یا با قلم استفاده میشوند.
دکمههای زیر پشتیبانی میشود:
BTN_LEFT: بهMotionEvent.BUTTON_PRIMARYنگاشت شد.BTN_RIGHT: بهMotionEvent.BUTTON_SECONDARYنگاشت شد.BTN_MIDDLE: بهMotionEvent.BUTTON_MIDDLEنگاشت شد.-
BTN_BACKوBTN_SIDE: بهMotionEvent.BUTTON_BACKنگاشت شد. فشار دادن این دکمه همچنین فشار دادن کلید را با کد کلیدKeyEvent.KEYCODE_BACKترکیب میکند. BTN_FORWARDوBTN_EXTRA: بهMotionEvent.BUTTON_FORWARDنگاشت شد. فشار دادن این دکمه همچنین فشار دادن کلید را با کد کلیدKeyEvent.KEYCODE_FORWARDترکیب میکند.BTN_STYLUS: بهMotionEvent.BUTTON_SECONDARYنگاشت شد.BTN_STYLUS2: بهMotionEvent.BUTTON_TERTIARYنگاشت شد.
ابزارها و انواع ابزار
ابزار عبارت است از انگشت، قلم، یا دستگاه دیگری که برای تعامل با دستگاه لمسی استفاده میشود. برخیاز دستگاههای لمسی میتوانند انواع مختلف ابزارها را از هم تشخیص دهند.
در جاهای دیگر Android، مانند میانای برنامهسازی کاربردی MotionEvent، اغلب به ابزار
اشارهگر گفته میشود.
انواع ابزارهای زیر پشتیبانی میشوند:
BTN_TOOL_FINGERوMT_TOOL_FINGER: بهMotionEvent.TOOL_TYPE_FINGERنگاشت شد.BTN_TOOL_PENوMT_TOOL_PEN: بهMotionEvent.TOOL_TYPE_STYLUSنگاشت شد.BTN_TOOL_RUBBER: بهMotionEvent.TOOL_TYPE_ERASERنگاشت شد.BTN_TOOL_BRUSH: بهMotionEvent.TOOL_TYPE_STYLUSنگاشت شد.BTN_TOOL_PENCIL: بهMotionEvent.TOOL_TYPE_STYLUSنگاشت شد.BTN_TOOL_AIRBRUSH: بهMotionEvent.TOOL_TYPE_STYLUSنگاشت شد.BTN_TOOL_MOUSE: بهMotionEvent.TOOL_TYPE_MOUSEنگاشت شد.BTN_TOOL_LENS: بهMotionEvent.TOOL_TYPE_MOUSEنگاشت شد.-
BTN_TOOL_DOUBLETAP،BTN_TOOL_TRIPLETAP، وBTN_TOOL_QUADTAP: بهMotionEvent.TOOL_TYPE_FINGERنگاشت شده است.
ابزارهای نگه داشتن درمقابل لمس کردن
ابزارها میتوانند با دستگاه لمسی در تماس باشند یا در محدوده آن باشند و بالای آن شناور باشند. همه دستگاههای لمسی نمیتوانند وجود ابزاری را که بالای دستگاه لمسی نگه داشته شده است حس کنند. آنهایی که این کار را انجام میدهند، مانند دیجیتایزرهای قلم نوری مبتنی بر RF، اغلب میتوانند تشخیص دهند که ابزار در محدوده محدودی از دیجیتایزر قرار دارد.
مؤلفه 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 «ب» گزارش میکند. برای جزئیات بیشتر، به مستندات پروتکل چندلمسی 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 را به زاویه کجی عمودی در محدوده ۰ تاPI / 2رادیان و زاویه جهتگیری مسطح در محدوده-PIتاPIرادیان تبدیل میکند. این نمایش منجر به توصیفی از جهتیابی میشود که با آنچه برای توصیف لمس انگشت استفاده میشود سازگار است.گزارش کردن اطلاعات کج کردن اختیاری است اما برای دستگاههای قلم توصیه میشود.
اگر نوع ابزار توسط
ABS_MT_TOOL_TYPEگزارش شده باشد، جایگزین هرگونه اطلاعات نوع ابزار گزارششده توسطBTN_TOOL_*میشود. اگر هیچ اطلاعاتی درباره نوع ابزار دردسترس نباشد، نوع ابزار بهطور پیشفرض رویMotionEvent.TOOL_TYPE_FINGERتنظیم میشود.ابزار براساس شرایط زیر فعال درنظر گرفته میشود:
هنگام استفاده از پروتکل تکلمسی، اگر
BTN_TOUCH، یاBTN_TOOL_*برابر با ۱ باشد، ابزار فعال است.این شرط به این معنی است که
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 انتظار داشتند رویدادهای «بالا» با ارسال مقدار فشار ۰ گزارش شوند. رفتار قدیمی با مشخصات پروتکل ورودی Linux ناسازگار بود و دیگر پشتیبانی نمیشود.
اطلاعات فشار فیزیکی یا قدرت سیگنال باید بااستفاده از
ABS_MT_PRESSUREگزارش شود.نسخههای قبلی Android اطلاعات فشار را از
ABS_MT_TOUCH_MAJORبازیابی میکردند. رفتار قدیمی با مشخصات پروتکل ورودی Linux ناسازگار بود و دیگر پشتیبانی نمیشود.- اطلاعات اندازه لمس باید بااستفاده از
ABS_MT_TOUCH_MAJORگزارش شود.نسخههای قبلی Android اطلاعات اندازه را از
ABS_MT_TOOL_MAJORبازیابی میکردند. رفتار قدیمی با مشخصات پروتکل ورودی Linux ناسازگار بود و دیگر پشتیبانی نمیشود.
عملکرد دستگاه لمسی
در زیر خلاصه کوتاهی از عملکرد دستگاه لمسی در Android آورده شده است.
EventHubرویدادهای خام را از درایورevdevمیخواند.InputReaderرویدادهای خام را مصرف میکند و وضعیت داخلی را درباره موقعیت و سایر ویژگیهای هر ابزار بهروز میکند. همچنین وضعیت دکمهها را ردیابی میکند.- اگر عقب یا جلو فشار داده یا رها شده باشد،
InputReaderدرباره رویداد کلیدی بهInputDispatcherاطلاع میدهد. InputReaderتعیین میکند که آیا فشار کلید مجازی رخ داده است یا نه. اگر اینطور باشد، بهInputDispatcherدرباره رویداد کلیدی اطلاع میدهد.InputReaderتعیین میکند که آیا لمس در محدوده نمایشگر شروع شده است یا نه. اگر اینطور باشد، بهInputDispatcherدرباره رویداد لمسی اطلاع میدهد.- اگر ابزار لمسی وجود نداشته باشد اما حداقل یک ابزار شناور وجود داشته باشد،
InputReaderدرباره رویداد شناور بهInputDispatcherاطلاع میدهد. - اگر نوع دستگاه لمسی اشارهگر باشد،
InputReaderاشاره اشارهگر را تشخیص میدهد، اشارهگر را حرکت میدهد و نقاط را مطابق با آن مشخص میکند و رویداد اشارهگر را بهInputDispatcherاطلاع میدهد. InputDispatcherازWindowManagerPolicyاستفاده میکند تا تعیین کند آیا رویدادها باید ارسال شوند و آیا باید دستگاه را بیدار کنند یا نه. سپس،InputDispatcherرویدادها را به برنامههای مناسب تحویل میدهد.
پیکربندی دستگاه لمسی
رفتار دستگاه لمسی با محورها، دکمهها، ویژگیهای ورودی، پیکربندی دستگاه ورودی، نقشه کلید مجازی، و چیدمان کلید دستگاه تعیین میشود.
برای جزئیات بیشتر درباره فایلهایی که در پیکربندی صفحهکلید مشارکت دارند، به بخشهای زیر مراجعه کنید:
مشخصات
سیستم برای پیکربندی و کالیبره کردن رفتار دستگاه لمسی به ویژگیهای پیکربندی دستگاه ورودی متعددی متکی است.
یکی از دلایل این امر این است که درایورهای دستگاه برای دستگاههای لمسی اغلب ویژگیهای لمس را بااستفاده از واحدهای مختص دستگاه گزارش میکنند.
برای مثال، بسیاری از دستگاههای لمسی ناحیه تماس لمسی را بااستفاده از مقیاس داخلی مختص دستگاه اندازهگیری میکنند، مانند تعداد کل گرههای حسگر که با لمس فعال شدهاند. این مقدار اندازه خام برای برنامهها معنیدار نخواهد بود زیرا آنها باید از اندازه فیزیکی و سایر ویژگیهای گرههای حسگر دستگاه لمسی مطلع باشند.
سیستم از پارامترهای کالیبراسیون کدگذاریشده در فایلهای پیکربندی دستگاه ورودی استفاده میکند تا مقادیر گزارششده توسط دستگاه لمسی را رمزگشایی، تبدیل، و عادیسازی کند و آنها را به نمایش استاندارد سادهتری تبدیل کند که برنامهها بتوانند درک کنند.
قراردادهای مستندسازی
برای اهداف مستندسازی، از قراردادهای زیر برای توصیف مقادیر استفادهشده توسط سیستم درطول فرایند واسنجی استفاده میکنیم.
مقادیر خام محور
عبارتهای زیر مقادیر خامی را نشان میدهند که توسط درایور دستگاه لمسی بهعنوان رویدادهای EV_ABS گزارش شدهاند.
raw.x- مقدار محور
ABS_XیاABS_MT_POSITION_X. raw.y- مقدار محور
ABS_YیاABS_MT_POSITION_Y. raw.pressure- مقدار محور
ABS_PRESSUREیاABS_MT_PRESSURE، یا 0 اگر دردسترس نباشد. raw.touchMajor- مقدار محور
ABS_MT_TOUCH_MAJOR، یا ۰ اگر دردسترس نباشد. raw.touchMinor- مقدار محور
ABS_MT_TOUCH_MINOR، یاraw.touchMajorاگر دردسترس نباشد. raw.toolMajor- مقدار محور
ABS_TOOL_WIDTHیاABS_MT_WIDTH_MAJOR، یا ۰ اگر دردسترس نباشد. raw.toolMinor- مقدار محور
ABS_MT_WIDTH_MINOR، یاraw.toolMajorاگر دردسترس نباشد. raw.orientation- مقدار محور
ABS_MT_ORIENTATION، یا ۰ اگر دردسترس نباشد. raw.distance- مقدار محور
ABS_DISTANCEیاABS_MT_DISTANCE، یا 0 اگر دردسترس نباشد. raw.tiltX- مقدار محور
ABS_TILT_X، یا ۰ اگر دردسترس نباشد. raw.tiltY- مقدار محور
ABS_TILT_Y، یا ۰ اگر دردسترس نباشد.
محدودههای محور خام
عبارتهای زیر نشاندهنده حدود مقادیر خام هستند. این مقادیر با فراخوانی EVIOCGABS ioctl برای هر محور بهدست میآیند.
raw.*.min- حداقل مقدار فراگیر محور خام.
raw.*.max- حداکثر مقدار فراگیر محور خام.
raw.*.range- معادل
raw.*.max - raw.*.min. raw.*.fuzz- دقت محور خام. برای مثال، fuzz = 1 یعنی مقادیر با دقت +/- ۱ واحد هستند.
raw.width- عرض فراگیر ناحیه لمس، معادل
raw.x.range + 1. raw.height- ارتفاع فراگیر ناحیه لمس، معادل
raw.y.range + 1.
محدودههای برونداد
عبارتهای زیر نشاندهنده ویژگیهای سیستم مختصات خروجی است. سیستم از درونیابی خطی برای ترجمه اطلاعات موقعیت لمس از واحدهای سطحی استفادهشده توسط دستگاه لمسی به واحدهای خروجی که به برنامهها گزارش میشوند، مانند پیکسلهای نمایشگر، استفاده میکند.
output.width- عرض برونداد. برای صفحههای لمسی (مرتبط با نمایشگر)، این
عرض نمایشگر برحسب پیکسل است. برای صفحههای لمسی (که با نمایشگر مرتبط نیستند)،
عرض خروجی برابر با
raw.widthاست، که نشان میدهد هیچ درونیابیای انجام نشده است. output.height- ارتفاع برونداد. برای صفحههای لمسی (مرتبط با نمایشگر)، این
ارتفاع نمایشگر به پیکسل است. برای پدهای لمسی (که با نمایشگر مرتبط نیستند)،
ارتفاع خروجی برابر با
raw.heightاست، که نشان میدهد هیچ درونیابیای انجام نشده است. output.diag- طول قطری سیستم مختصات خروجی، معادل
sqrt(output.width ^2 + output.height ^2).
پیکربندی پایه
نگاشتگر ورودی لمسی از ویژگیهای پیکربندی زیادی در فایل پیکربندی دستگاه ورودی برای مشخص کردن مقادیر واسنجی استفاده میکند. جدول زیر برخیاز ویژگیهای پیکربندی با هدف کلی را شرح میدهد. همه ویژگیهای دیگر در بخشهای زیر بههمراه فیلدهایی که برای کالیبره کردن آنها استفاده میشود شرح داده شدهاند.
touch.deviceType
تعریف: touch.deviceType = touchScreen |
touchPad | pointer | default
نوع دستگاه لمسی را مشخص میکند.
-
اگر مقدار
touchScreenباشد، دستگاه لمسی یک صفحه لمسی مرتبط با نمایشگر است. -
اگر مقدار
touchPadباشد، دستگاه لمسی یک صفحه لمسی است که با نمایشگر مرتبط نیست. -
اگر مقدار
pointerباشد، دستگاه لمسی یک پد لمسی است که با نمایشگر مرتبط نیست و از حرکات آن برای اشارههای چندلمسی غیرمستقیم اشارهگر استفاده میشود. -
اگر مقدار
defaultباشد، سیستم بهطور خودکار نوع دستگاه را براساس الگوریتم طبقهبندی تشخیص میدهد.
برای جزئیات بیشتر درباره اینکه نوع دستگاه چگونه بر رفتار دستگاه لمسی تأثیر میگذارد، به بخش طبقهبندی مراجعه کنید.
در Android 3 و نسخههای پایینتر، فرض بر این بود که همه دستگاههای لمسی صفحهنمایش لمسی هستند.
touch.orientationAware
تعریف: touch.orientationAware = 0 | 1
مشخص میکند که آیا دستگاه لمسی باید به تغییرات جهت نمایشگر واکنش نشان دهد یا نه.
-
اگر مقدار
1باشد، هرگاه جهت نمایشگر تغییر کند، موقعیتهای لمس گزارششده توسط دستگاه لمسی چرخانده میشود. -
اگر مقدار
0باشد، موقعیتهای لمسی گزارششده توسط دستگاه لمسی دربرابر تغییرات جهت نمایشگر مصون هستند.
اگر دستگاه صفحه لمسی باشد، مقدار پیشفرض 1 است،
درغیراینصورت 0 است.
سیستم بین صفحهنمایشها و نمایشگرهای لمسی داخلی و خارجی تمایز قائل میشود. صفحه لمسی داخلی حساس به جهت براساس جهت نمایشگر داخلی میچرخد. صفحه لمسی خارجی حساس به جهت براساس جهت نمایشگر خارجی چرخانده میشود.
آگاهی از جهت برای پشتیبانی از چرخش صفحههای لمسی در دستگاههایی مانند Nexus One استفاده میشود. برای مثال، وقتی دستگاه ۹۰ درجه در جهت عقربههای ساعت از جهت طبیعی خود چرخانده میشود، موقعیتهای مطلق لمسها بهگونهای بازنگاشت میشوند که لمس در گوشه بالا سمت چپ سیستم مختصات مطلق صفحهنمایش لمسی بهعنوان لمس در گوشه بالا سمت چپ سیستم مختصات چرخاندهشده نمایشگر گزارش میشود. این کار برای این انجام میشود که لمسها با همان سیستم مختصاتی گزارش شوند که برنامهها برای ترسیم عناصر دیداریشان استفاده میکنند.
پیشاز Honeycomb، فرض بر این بود که همه دستگاههای لمسی از جهتگیری آگاه هستند.
touch.gestureMode
تعریف: touch.gestureMode = pointer | spots |
default
حالت ارائه را برای اشارههای نشانگر مشخص میکند. این ویژگی پیکربندی فقط زمانی مربوط است که دستگاه لمسی از نوع اشارهگر باشد.
-
اگر مقدار
pointerباشد، اشارههای صفحه لمسی بهصورت مکاننمایی شبیه به اشارهگر موشواره ارائه میشود. -
اگر مقدار
spotsباشد، اشارههای صفحه لمسی با لنگری که نشاندهنده مرکز اشاره است و مجموعهای از نقاط دایرهای که نشاندهنده موقعیت انگشتان بهصورت جداگانه است ارائه میشود.
مقدار پیشفرض pointer است وقتی ویژگی ورودی INPUT_PROP_SEMI_MT
تنظیم شده باشد، درغیراینصورت spots است.
فیلدهای X و Y
فیلدهای X و Y اطلاعات موقعیتی را برای مرکز ناحیه تماس ارائه میدهند.
محاسبه
محاسبه ساده است: اطلاعات موقعیتی از درایور لمسی بهصورت خطی به سیستم مختصات خروجی درونیابی میشود.
xScale = output.width / raw.width
yScale = output.height / raw.height
If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
output.x = (raw.y - raw.y.min) * yScale
output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
output.x = (raw.x.max - raw.x) * xScale
output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
output.x = (raw.y.max - raw.y) * yScale
output.y = (raw.x - raw.x.min) * xScale
End If
فیلدهای touchMajor، touchMinor، toolMajor، toolMinor، size
فیلدهای touchMajor و touchMinor ابعاد تقریبی ناحیه تماس را در واحدهای خروجی (پیکسل) توصیف میکنند.
فیلدهای toolMajor و toolMinor ابعاد تقریبی خود ابزار را در واحدهای برونداد (پیکسل) توصیف میکنند.
فیلد size اندازه نرمالشده لمس را نسبت به بزرگترین لمس ممکن که دستگاه لمسی میتواند حس کند توصیف میکند. کوچکترین
اندازه نرمالشده ممکن ۰٫۰ است (بدون تماس، یا غیرقابل اندازهگیری)، و بزرگترین
اندازه نرمالشده ممکن ۱٫۰ است (ناحیه حسگر اشباع شده است).
وقتی هم طول و هم عرض تقریبی قابلاندازهگیری باشد، فیلد touchMajor بُعد بلندتر و فیلد touchMinor بُعد کوتاهتر ناحیه تماس را مشخص میکند. وقتی فقط قطر تقریبی ناحیه تماس قابلاندازهگیری باشد،
فیلدهای touchMajor و touchMinor برابر هستند.
بههمین ترتیب، فیلد toolMajor بُعد بلندتر و فیلد toolMinor بُعد کوتاهتر مساحت مقطع ابزار را مشخص میکند.
اگر اندازه لمس دردسترس نباشد اما اندازه ابزار دردسترس باشد، اندازه ابزار برابر با اندازه لمس تنظیم میشود. برعکس، اگر اندازه ابزار دردسترس نباشد اما اندازه لمس دردسترس باشد، اندازه لمس برابر با اندازه ابزار تنظیم میشود.
دستگاههای لمسی اندازه لمس و اندازه ابزار را به روشهای مختلفی اندازهگیری یا گزارش میکنند. پیادهسازی فعلی از سه نوع اندازهگیری مختلف پشتیبانی میکند: قطر، مساحت، و جعبه مرزی هندسی در واحدهای سطح.
<touch.size.calibration< h4=""></touch.size.calibration<>
تعریف: touch.size.calibration = none |
geometric | diameter
| area | default
نوع اندازهگیری مورداستفاده در درایور لمسی را برای گزارش کردن اندازه لمس و اندازه ابزار مشخص میکند.
-
اگر مقدار
noneباشد، اندازه روی صفر تنظیم میشود. -
اگر مقدار
geometricباشد، فرض میشود که اندازه در همان واحدهای سطحی موقعیت مشخص شده است، بنابراین به همان شیوه مقیاسبندی میشود. -
اگر مقدار
diameterباشد، فرض میشود اندازه متناسب با قطر (عرض) لمس یا ابزار است. -
اگر مقدار
areaباشد، فرض میشود اندازه متناسب با مساحت لمس یا ابزار است. -
اگر مقدار
defaultباشد، سیستم از واسنجیgeometricاستفاده میکند اگر محورraw.touchMajorیاraw.toolMajorدردسترس باشد، درغیراینصورت از واسنجیnoneاستفاده میکند.
touch.size.scale
تعریف: touch.size.scale = <عدد ممیز شناور غیرمنفی>
ضریب مقیاس ثابتی را که در واسنجی استفاده میشود مشخص میکند.
مقدار پیشفرض 1.0 است.
touch.size.bias
تعریف: touch.size.bias = <عدد ممیز شناور غیرمنفی>
مقدار سوگیری ثابتی را که در واسنجی استفاده میشود مشخص میکند.
مقدار پیشفرض 0.0 است.
touch.size.isSummed
تعریف: touch.size.isSummed = 0 | 1
مشخص میکند که آیا اندازه بهعنوان مجموع اندازههای همه مخاطبین فعال گزارش میشود یا بهصورت جداگانه برای هر مخاطب گزارش میشود.
-
اگر مقدار
1باشد، اندازه گزارششده قبلاز استفاده بر تعداد مخاطبین تقسیم میشود. -
اگر مقدار
0باشد، اندازه گزارششده همانطور که هست استفاده میشود.
مقدار پیشفرض 0 است.
برخیاز دستگاههای لمسی، بهویژه دستگاههای «Semi-MT»، نمیتوانند ابعاد مجزای چند نقطه تماس را تشخیص دهند، بنابراین اندازهای را گزارش میکنند که نشاندهنده کل مساحت یا عرض آنها است. این ویژگی فقط باید برای چنین دستگاههایی روی
1 تنظیم شود. اگر شک دارید، این مقدار را روی 0 تنظیم کنید.
محاسبه
محاسبه فیلدهای touchMajor، touchMinor، toolMajor،
toolMinor،
و size به پارامترهای واسنجی مشخصشده بستگی دارد.
If raw.touchMajor and raw.toolMajor are available:
touchMajor = raw.touchMajor
touchMinor = raw.touchMinor
toolMajor = raw.toolMajor
toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
toolMajor = touchMajor = raw.touchMajor
toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
touchMajor = toolMajor = raw.toolMajor
touchMinor = toolMinor = raw.toolMinor
Else
touchMajor = toolMajor = 0
touchMinor = toolMinor = 0
size = 0
End If
size = avg(touchMajor, touchMinor)
If touch.size.isSummed == 1:
touchMajor = touchMajor / numberOfActiveContacts
touchMinor = touchMinor / numberOfActiveContacts
toolMajor = toolMajor / numberOfActiveContacts
toolMinor = toolMinor / numberOfActiveContacts
size = size / numberOfActiveContacts
End If
If touch.size.calibration == "none":
touchMajor = toolMajor = 0
touchMinor = toolMinor = 0
size = 0
Else If touch.size.calibration == "geometric":
outputScale = average(output.width / raw.width, output.height / raw.height)
touchMajor = touchMajor * outputScale
touchMinor = touchMinor * outputScale
toolMajor = toolMajor * outputScale
toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
touchMajor = sqrt(touchMajor)
touchMinor = touchMajor
toolMajor = sqrt(toolMajor)
toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
touchMinor = touchMajor
toolMinor = toolMajor
End If
If touchMajor != 0:
output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
output.touchMajor = 0
End If
If touchMinor != 0:
output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
output.touchMinor = 0
End If
If toolMajor != 0:
output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
output.toolMajor = 0
End If
If toolMinor != 0:
output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
output.toolMinor = 0
End If
output.size = size
فیلد فشار
فیلد pressure فشار فیزیکی تقریبی اعمالشده به دستگاه لمسی را بهعنوان مقداری نرمالشده بین ۰٫۰ (بدون لمس) و ۱٫۰ (فشار عادی) توصیف میکند.
فشار صفر نشان میدهد که ابزار در حالت شناور است.
touch.pressure.calibration
تعریف: touch.pressure.calibration = none |
physical | amplitude | default
نوع اندازهگیری مورداستفاده در درایور لمسی را برای گزارش فشار مشخص میکند.
-
اگر مقدار
noneباشد، فشار نامشخص است، بنابراین هنگام لمس کردن روی ۱٫۰ و هنگام نگه داشتن روی ۰٫۰ تنظیم میشود. -
اگر مقدار
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باشد، جهت نامشخص است، بنابراین روی ۰ تنظیم میشود. - اگر مقدار
interpolatedباشد، جهت بهصورت خطی درونیابی میشود بهطوریکه مقدار خامraw.orientation.minبه-PI/2و مقدار خامraw.orientation.maxبهPI/2نگاشت میشود. مقدار مرکزی(raw.orientation.min + raw.orientation.max) / 2به0نگاشت میشود. - اگر مقدار
vectorباشد، جهتیابی بهعنوان بردار فشرده متشکل از دو فیلد ۴ بیتی علامتدار تفسیر میشود. این نمایش در بخشهای Atmel Object Based Protocol استفاده میشود. وقتی رمزگشایی میشود، بردار زاویه جهتیابی و مقدار اطمینان را ارائه میدهد. از مقدار اطمینان برای مقیاسبندی اطلاعات اندازه استفاده میشود، مگر اینکه هندسی باشد. - اگر مقدار
defaultباشد، سیستم از واسنجیinterpolatedاستفاده میکند اگر محور جهتیابی دردسترس باشد، درغیراینصورت ازnoneاستفاده میکند.
محاسبه
محاسبه فیلدهای orientation و tilt به پارامترهای واسنجی مشخصشده و ورودی دردسترس بستگی دارد.
If touch.tiltX and touch.tiltY are available:
tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
center = average(raw.orientation.min, raw.orientation.max)
output.orientation = PI / (raw.orientation.max - raw.orientation.min)
output.tilt = 0
Else If touch.orientation.calibration == "vector":
c1 = (raw.orientation & 0xF0) >> 4
c2 = raw.orientation & 0x0F
If c1 != 0 or c2 != 0:
If c1 >= 8 Then c1 = c1 - 16
If c2 >= 8 Then c2 = c2 - 16
angle = atan2(c1, c2) / 2
confidence = sqrt(c1*c1 + c2*c2)
output.orientation = angle
If touch.size.calibration == "diameter" or "area":
scale = 1.0 + confidence / 16
output.touchMajor *= scale
output.touchMinor /= scale
output.toolMajor *= scale
output.toolMinor /= scale
End If
Else
output.orientation = 0
End If
output.tilt = 0
Else
output.orientation = 0
output.tilt = 0
End If
If orientation aware:
If screen rotation is 90 degrees:
output.orientation = output.orientation - PI / 2
Else If screen rotation is 270 degrees:
output.orientation = output.orientation + PI / 2
End If
End If
فیلد فاصله
فیلد distance فاصله بین ابزار و سطح دستگاه لمسی را توصیف میکند. مقدار ۰٫۰ نشاندهنده تماس مستقیم است و مقادیر بزرگتر نشاندهنده
افزایش فاصله از سطح است.
touch.distance.calibration
تعریف: touch.distance.calibration = none |
scaled | default
نوع اندازهگیری مورداستفاده در درایور لمسی را برای گزارش فاصله مشخص میکند.
-
اگر مقدار
noneباشد، فاصله نامشخص است، بنابراین روی ۰ تنظیم میشود. -
اگر مقدار
scaledباشد، فاصله گزارششده در یک ضریب مقیاس ثابت ضرب میشود. -
اگر مقدار
defaultباشد، سیستم از واسنجیscaledاستفاده میکند اگر محور فاصله دردسترس باشد، درغیراینصورت ازnoneاستفاده میکند.
touch.distance.scale
تعریف: touch.distance.scale = <عدد ممیز شناور غیرمنفی>
ضریب مقیاس ثابتی را که در واسنجی استفاده میشود مشخص میکند.
مقدار پیشفرض 1.0 است.
محاسبه
محاسبه فیلد distance به پارامترهای واسنجی مشخصشده بستگی دارد.
If touch.distance.calibration == "scaled":
output.distance = raw.distance * touch.distance.scale
Else
output.distance = 0
End If
مثال
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
نکاتی درباره سازگاری
ویژگیهای پیکربندی برای دستگاههای لمسی در Android Ice Cream Sandwich 4.0 بهطور قابلتوجهی تغییر کرد. همه فایلهای پیکربندی دستگاه ورودی برای دستگاههای لمسی باید بهروزرسانی شوند تا از ویژگیهای پیکربندی جدید استفاده کنند.
راهاندازهای دستگاههای لمسی قدیمیتر نیز ممکن است نیاز به بهروزرسانی داشته باشند.
فایلهای نقشه کلید مجازی
از دستگاههای لمسی میتوان برای پیادهسازی کلیدهای مجازی استفاده کرد.
چندین روش برای انجام این کار وجود دارد که به قابلیتهای کنترلکننده لمسی بستگی دارد. برخیاز کنترلکنندههای لمسی را میتوان مستقیماً برای پیادهسازی کلیدهای نرمافزاری با تنظیم ثباتهای سفتافزار پیکربندی کرد. در مواقع دیگر، مطلوب است که نگاشت از مختصات لمسی به کدهای کلید در نرمافزار انجام شود.
وقتی کلیدهای مجازی در نرمافزار پیادهسازی میشوند، هسته باید فایل نقشه کلید مجازی بهنام virtualkeys.<devicename> را بهعنوان ویژگی برد صادر کند. برای مثال،
اگر درایورهای دستگاه صفحه لمسی نام خود را بهصورت «touchyfeely» گزارش کنند،
مسیر فایل نگاشت کلید مجازی باید
/sys/board_properties/virtualkeys.touchyfeely باشد.
فایل نقشه کلید مجازی مختصات و کدهای کلید Linux کلیدهای مجازی را در صفحه لمسی شرح میدهد.
علاوهبر فایل نقشه کلید مجازی، باید فایل چیدمان کلید و فایل نقشه نویسه کلید متناظر وجود داشته باشد تا کدهای کلید Linux به کدهای کلید Android نگاشت شود و نوع دستگاه صفحهکلید (معمولاً SPECIAL_FUNCTION) مشخص شود.
نحو
فایل نگاشت کلید مجازی یک فایل نوشتاری ساده است که از توالی شرحهای چیدمان کلید مجازی تشکیل شده است که با خط جدید یا دونقطه از هم جدا شدهاند.
خطوط نظر با «#» شروع میشوند و تا انتهای خط ادامه مییابند.
هر کلید مجازی با ۶ مؤلفه جداشده با دونقطه توصیف میشود:
-
0x01: کد نسخه. همیشه باید0x01باشد. - <Linux key code>: کد کلید Linux برای کلید مجازی.
- <centerX>: مختصات پیکسلی X مرکز کلید مجازی.
- <centerY>: مختصات پیکسلی Y مرکز کلید مجازی.
- <width>: عرض کلید مجازی به پیکسل.
- <height>: ارتفاع کلید مجازی به پیکسل.
همه مختصات و اندازهها براساس سیستم مختصات نمایشگر مشخص میشوند.
در اینجا یک فایل نگاشت کلید مجازی وجود دارد که همه در یک خط نوشته شده است.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
یک فایل نگاشت کلید مجازی را میتوان در چند خط نیز نوشت.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
در مثال بالا، صفحه لمسی وضوح ۴۸۰×۸۰۰ دارد. بنابراین، همه کلیدهای مجازی دارای مختصات <centerY> با مقدار ۸۳۵ هستند که کمی پایینتر از ناحیه قابلمشاهده صفحهنمایش لمسی است.
کلید اول دارای کد اسکن Linux 158 (KEY_BACK)، مرکز X
55، مرکز Y 835، عرض 90، و ارتفاع
55 است.
مثال
فایل نگاشت کلید مجازی: /sys/board_properties/virtualkeys.touchyfeely.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
فایل جانمایی کلید: /system/usr/keylayout/touchyfeely.kl.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
فایل نگاشت نویسه کلید: /system/usr/keychars/touchyfeely.kcm.
type SPECIAL_FUNCTION
اشارههای چندلمسی غیرمستقیم اشارهگر
در حالت اشارهگر، سیستم اشارههای زیر را تفسیر میکند:
- تکضرب با یک انگشت: کلیک.
- حرکت یک انگشت: اشارهگر را حرکت میدهد.
- حرکت یک انگشت بهعلاوه فشار دادن دکمه: اشارهگر را میکشد.
- حرکت دو انگشت، هر دو انگشت در یک جهت حرکت میکنند: ناحیه زیر اشارهگر را در آن جهت بکشید. خود اشارهگر حرکت نمیکند.
- حرکت دو انگشت، هر دو انگشت بهسمت یکدیگر یا دور از هم در جهتهای مختلف حرکت میکنند: حرکت افقی/ مقیاسبندی/ چرخاندن ناحیه اطراف اشارهگر. خود اشارهگر حرکت نمیکند.
- حرکت چند انگشت: اشاره آزاد.
رد کردن لمس کف دست
از Android 13، وقتی چارچوب داخلی فعال باشد، سیستم میتواند بهطور خودکار ورودیهای کف دست را رد کند. راهحلهای داخلی و سفارشیسازیشده همچنان پشتیبانی میشوند،
هرچند ممکن است لازم باشد اصلاح شوند تا هنگام تشخیص کف دست،
پرچم TOOL_TYPE_PALM را برگردانند. چارچوب داخلی همچنین در ارتباط با راهحلهای سفارشی کار میکند.
مدل واقعی ۹۰ میلیثانیه اول دادههای اشاره، اشارهگر فعلی، و اشارهگرهای اطراف را بررسی میکند، سپس فاصله لمسها را از لبه نمایشگر درنظر میگیرد.
سپس، براساس هر اشارهگر، تعیین میکند کدام اشارهگرها کف دست هستند. همچنین اندازه هر مخاطب را، طبق گزارش touchMajor و touchMinor، درنظر میگیرد. سپس چارچوب Android اشارهگرهایی را که بهعنوان کف دست علامتگذاری شدهاند از جریان لمس برمیدارد.
اگر اشارهگر قبلاً به برنامهها ارسال شده باشد، سیستم یکی از کارهای زیر را انجام میدهد:
- (اگر اشارهگرهای فعال دیگری وجود داشته باشد) اشارهگر را با
ACTION_POINTER_UPوFLAG_CANCELEDتنظیمشده لغو میکند. - (اگر این تنها اشارهگر باشد) اشارهگر را با
ACTION_CANCELلغو میکند.
میانای برنامهسازی کاربردی عمومی، MotionEvent.FLAG_CANCELED، نشان میدهد که رویداد
کنونی نباید کنش کاربر را راهاندازی کند. این پرچم برای هر دو ACTION_CANCEL
و ACTION_POINTER_UP تنظیم شده است.
اگر اشارهگر کف دست به برنامهها ارسال نشده باشد، سیستم بهسادگی اشارهگر را رها میکند.
فعال کردن «رد کردن کف دست»
- در درایور لمسی، از
ماکرو
input_abs_set_resبرای تنظیم وضوح فیلدهای زیر استفاده کنید (واحدها پیکسل در میلیمتر است):ABS_MT_POSITION_XABS_MT_POSITION_YABS_MT_TOUCH_MAJORABS_MT_TOUCH_MINOR
پشتیبانی از
ABS_MT_TOUCH_MINORاختیاری است. بااینحال، اگر دستگاهتان از آن پشتیبانی میکند، مطمئن شوید وضوح بهدرستی تنظیم شده باشد. - برای تأیید اینکه فیلدها بهدرستی تنظیم شدهاند، این دستور را اجرا کنید:
$ adb shell getevent -li - برای فعال کردن این ویژگی درطول زمان اجرا، این دستور را اجرا کنید:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1 - فرایند
system_serverرا بازراهاندازی کنید.$ adb shell stop && adb shell start - تأیید کنید که
adb shell dumpsys inputنشان میدهد که ردکننده لمس کف دست در داخلUnwantedInteractionBlockerوجود دارد. اگر اینطور نیست، گزارشهای مربوط به ورودی را بررسی کنید تا سرنخهایی درباره آنچه ممکن است پیکربندی نادرست داشته باشد پیدا کنید.برای مرجع، مثال زیر را ببینید:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - برای فعال کردن دائمی این ویژگی، فرمان sysprop مربوطه را در فایل
init**rcخود اضافه کنید:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1