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را گزارش کند (ازطریق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 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نگاشت شد.
نگه داشتن روی ابزارها درمقابل لمس کردن آنها
ابزارها میتوانند با دستگاه لمسی در تماس باشند یا در محدوده آن باشند و بالای آن شناور باشند. همه دستگاههای لمسی نمیتوانند حضور ابزاری را که در بالای دستگاه لمسی معلق است حس کنند. آنهایی که این کار را انجام میدهند، مانند دیجیتایزرهای قلم نوری مبتنی بر 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 «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 را به زاویه کجی عمود بر صفحه (از ۰ تا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رویدادهای خام را مصرف میکند و وضعیت داخلی را درباره موقعیت و سایر ویژگیهای هر ابزار بهروز میکند. همچنین وضعیت دکمهها را ردیابی میکند.- اگر 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، یا ۰ اگر دردسترس نباشد. 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، یا 0 اگر دردسترس نباشد.
محدوده محور خام
عبارتهای زیر نشاندهنده حدود مقادیر خام است. این مقادیر با فراخوانی EVIOCGABS ioctl برای هر محور بهدست میآیند.
raw.*.min- مقدار حداقل فراگیر محور خام.
raw.*.max- حداکثر مقدار فراگیر محور خام.
raw.*.range- معادل
raw.*.max - raw.*.min. raw.*.fuzz- دقت محور خام. برای مثال، fuzz = 1 یعنی مقادیر با دقت +/- ۱ واحد هستند.
raw.width- عرض فراگیر ناحیه لمس، معادل
raw.x.range + 1. raw.height- ارتفاع فراگیر ناحیه لمس، معادل
raw.y.range + 1.
محدودههای برونداد
عبارتهای زیر نشاندهنده ویژگیهای سیستم مختصات خروجی است. سیستم از میانیابی خطی برای ترجمه اطلاعات موقعیت لمس از واحدهای سطح استفادهشده توسط دستگاه لمسی به واحدهای برونداد استفاده میکند که به برنامههایی مثل پیکسلهای نمایشگر گزارش میشود.
output.width- عرض برونداد. برای صفحههای لمسی (مرتبط با نمایشگر)، این
عرض نمایشگر برحسب پیکسل است. برای صفحههای لمسی (که با نمایشگر مرتبط نیستند)،
عرض خروجی برابر با
raw.widthاست، که نشان میدهد هیچ درونیابیای انجام نشده است. output.height- ارتفاع برونداد. برای صفحههای لمسی (مرتبط با نمایشگر)، این
ارتفاع نمایشگر برحسب پیکسل است. برای صفحههای لمسی (که با نمایشگر مرتبط نیستند)،
ارتفاع خروجی برابر با
raw.heightاست، که نشان میدهد هیچ درونیابیای انجام نشده است. output.diag- طول قطر سیستم مختصات برونداد، معادل
sqrt(output.width ^2 + output.height ^2).
پیکربندی پایه
نگاشت ورودی لمسی از بسیاری از داراییهای پیکربندی در فایل پیکربندی دستگاه ورودی برای مشخص کردن مقادیر کالیبراسیون استفاده میکند. جدول زیر برخیاز مشخصههای پیکربندی با هدف عمومی را شرح میدهد. همه داراییهای دیگر در بخشهای زیر همراه با فیلدهایی که برای کالیبره کردن استفاده میشوند شرح داده شدهاند.
touch.deviceType
تعریف: touch.deviceType = touchScreen |
touchPad | pointer | default
نوع دستگاه لمسی را مشخص میکند.
-
اگر مقدار
touchScreenباشد، دستگاه لمسی یک صفحه لمسی مرتبط با نمایشگر است. -
اگر مقدار
touchPadباشد، دستگاه لمسی یک صفحه لمسی است که با نمایشگر مرتبط نیست. -
اگر مقدار
pointerباشد، دستگاه لمسی یک پد لمسی است که با نمایشگر مرتبط نیست و از حرکات آن برای اشارههای چندلمسی غیرمستقیم اشارهگر استفاده میشود. -
اگر مقدار
defaultباشد، سیستم بهطور خودکار نوع دستگاه را براساس الگوریتم طبقهبندی تشخیص میدهد.
برای جزئیات بیشتر درباره اینکه نوع دستگاه چگونه بر رفتار دستگاه لمسی تأثیر میگذارد، به بخش طبقهبندی مراجعه کنید.
در Android 3 و نسخههای پایینتر، همه دستگاههای لمسی بهعنوان صفحه لمسی درنظر گرفته میشدند.
touch.orientationAware
تعریف: touch.orientationAware = 0 | 1
مشخص میکند که آیا دستگاه لمسی باید به تغییرات جهت نمایشگر واکنش نشان دهد یا نه.
-
اگر مقدار
1باشد، هرگاه جهت نمایشگر تغییر کند، موقعیتهای لمسی گزارششده توسط دستگاه لمسی چرخانده میشود. -
اگر مقدار
0باشد، موقعیتهای لمسی گزارششده توسط دستگاه لمسی دربرابر تغییرات جهت نمایشگر مصون هستند.
اگر دستگاه صفحه لمسی باشد، مقدار پیشفرض 1 است، درغیراینصورت 0
است.
سیستم بین صفحهنمایشها و نمایشگرهای لمسی داخلی و خارجی تمایز قائل میشود. صفحه لمسی داخلی آگاه از جهت براساس جهت نمایشگر داخلی میچرخد. صفحه لمسی خارجی آگاه از جهت براساس جهت نمایشگر خارجی میچرخد.
از آگاهی از جهت برای پشتیبانی از چرخش صفحه لمسی در دستگاههایی مثل Nexus One استفاده میشود. برای مثال، وقتی دستگاه ۹۰ درجه در جهت عقربههای ساعت از جهت طبیعی خود میچرخد، موقعیتهای مطلق لمسها دوباره نقشهبندی میشوند بهطوریکه لمس در گوشه بالا سمت راست سیستم مختصات مطلق صفحه لمسی بهعنوان لمس در گوشه بالا سمت راست سیستم مختصات چرخیده نمایشگر گزارش میشود. این کار به این دلیل انجام میشود که لمسها با همان سیستم مختصاتی گزارش شوند که برنامهها برای رسم عناصر دیداریشان استفاده میکنند.
قبلاز Honeycomb، همه دستگاههای لمسی دارای جهتگیری درنظر گرفته میشدند.
touch.gestureMode
تعریف: touch.gestureMode = pointer | spots |
default
حالت ارائه را برای اشارههای اشارهگر مشخص میکند. این ویژگی پیکربندی فقط زمانی مرتبط است که دستگاه لمسی از نوع اشارهگر باشد.
-
اگر مقدار
pointerباشد، اشارههای صفحه لمسی بهصورت مکاننمایی شبیه به اشارهگر موشواره ارائه میشود. -
اگر مقدار
spotsباشد، اشارههای صفحه لمسی با یک نقطه اتکا که نشاندهنده مرکز هندسی اشاره است و مجموعهای از نقطههای دایرهای که نشاندهنده موقعیت انگشتان است ارائه میشود.
وقتی دارایی ورودی INPUT_PROP_SEMI_MT تنظیم شده باشد، مقدار پیشفرض pointer است،
درغیراینصورت 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 = none |
geometric | diameter
| area | default
نوع اندازهگیری مورداستفاده توسط درایور لمس برای گزارش اندازه لمس و اندازه ابزار را مشخص میکند.
-
اگر مقدار
noneباشد، اندازه روی صفر تنظیم میشود. -
اگر مقدار
geometricباشد، فرض میشود که اندازه با همان واحدهای سطح موقعیت مشخص شده است، بنابراین به همان روش مقیاسبندی میشود. -
اگر مقدار
diameterباشد، فرض میشود اندازه متناسب با قطر (عرض) لمس یا ابزار باشد. -
اگر مقدار
areaباشد، فرض میشود اندازه متناسب با مساحت لمس یا ابزار است. -
اگر مقدار
defaultباشد، درصورت دردسترس بودن محورraw.touchMajorیاraw.toolMajor، سیستم از کالیبراسیونgeometricاستفاده میکند، درغیراینصورت از کالیبراسیونnoneاستفاده میکند.
touch.size.scale
تعریف: touch.size.scale = <a non-negative floating point number>
ضریب مقیاس ثابتی را که در واسنجی استفاده میشود مشخص میکند.
مقدار پیشفرض 1.0 است.
touch.size.bias
تعریف: touch.size.bias = <a non-negative floating point number>
مقدار سوگیری ثابتی را که در واسنجی استفاده میشود مشخص میکند.
مقدار پیشفرض 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 = <a non-negative floating point number>
ضریب مقیاس ثابتی را که در واسنجی استفاده میشود مشخص میکند.
مقدار پیشفرض 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 = <a non-negative floating point number>
عامل مقیاس ثابت مورداستفاده در کالیبراسیون را مشخص میکند.
مقدار پیشفرض 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>: کد کلید 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)، 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
اشارههای اشارهگر چندلمسی غیرمستقیم
در حالت اشارهگر، سیستم حرکات زیر را تفسیر میکند:
- تکضرب با یک انگشت: کلیک.
- حرکت یک انگشتی: اشارهگر را حرکت دهید.
- حرکت یک انگشت بهعلاوه فشار دادن دکمه: اشارهگر را میکشد.
- حرکت دو انگشت، هر دو انگشت در یک جهت حرکت میکنند: ناحیه زیر اشارهگر را در آن جهت بکشید. خود اشارهگر حرکت نمیکند.
- حرکت دو انگشت، هر دو انگشت بهسمت یکدیگر یا دور از هم در جهتهای مختلف حرکت میکنند: حرکت افقی/مقیاسبندی/چرخاندن ناحیه اطراف اشارهگر. خود اشارهگر حرکت نمیکند.
- حرکت چند انگشت: اشاره آزاد.
عدم پذیرش کف دست
از 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