اندروید از انواع صفحهنمایشهای لمسی و پدهای لمسی، از جمله تبلتهای دیجیتالیساز مبتنی بر قلم پشتیبانی میکند.
صفحههای لمسی دستگاههای لمسی هستند که با یک نمایشگر مرتبط هستند به طوری که کاربر این تصور را دارد که مستقیماً آیتمهای روی صفحه را دستکاری میکند.
پدهای لمسی دستگاه های لمسی هستند که با صفحه نمایشی مانند تبلت دیجیتایزر مرتبط نیستند. پدهای لمسی معمولاً برای اشاره یا برای موقعیت یابی غیرمستقیم مطلق یا کنترل مبتنی بر ژست یک رابط کاربری استفاده می شود.
دستگاه های لمسی ممکن است دکمه هایی داشته باشند که عملکرد آنها شبیه دکمه های ماوس است.
بسته به فناوری حسگر لمسی، گاهی اوقات میتوان دستگاههای لمسی را با استفاده از ابزارهای مختلف مانند انگشتان یا قلم دستکاری کرد.
گاهی اوقات از دستگاه های لمسی برای پیاده سازی کلیدهای مجازی استفاده می شود. به عنوان مثال، در برخی از دستگاههای اندرویدی، ناحیه حسگر صفحه لمسی فراتر از لبه نمایشگر گسترش مییابد و به عنوان بخشی از صفحه کلید حساس به لمس، کارکرد دوگانه را دارد.
با توجه به تنوع زیاد دستگاه های لمسی، اندروید برای توصیف ویژگی ها و رفتار دلخواه هر دستگاه به تعداد زیادی ویژگی پیکربندی متکی است.
دسته بندی دستگاه را لمس کنید
اگر هر دو شرایط زیر برقرار باشد، یک دستگاه ورودی به عنوان یک دستگاه چند لمسی طبقه بندی می شود:
دستگاه ورودی وجود محورهای مطلق
ABS_MT_POSITION_X
وABS_MT_POSITION_Y
را گزارش می دهد.دستگاه ورودی هیچ دکمه گیم پد ندارد. این شرایط ابهام مربوط به گیمپدهای خاصی را برطرف میکند که محورها را با کدهایی که با محورهای MT همپوشانی دارند، گزارش میکنند.
اگر هر دو شرایط زیر برقرار باشد، یک دستگاه ورودی به عنوان یک دستگاه تک لمسی طبقه بندی می شود:
دستگاه ورودی به عنوان یک دستگاه چند لمسی طبقه بندی نمی شود. یک دستگاه ورودی یا به عنوان یک دستگاه تک لمسی یا به عنوان یک دستگاه چند لمسی طبقه بندی می شود، هرگز هر دو.
دستگاه ورودی وجود محورهای مطلق
ABS_X
وABS_Y
و وجود کد کلیدBTN_TOUCH
را گزارش می کند.
هنگامی که یک دستگاه ورودی به عنوان یک دستگاه لمسی طبقه بندی شد، با تلاش برای بارگذاری فایل نقشه کلید مجازی برای دستگاه، وجود کلیدهای مجازی تعیین می شود. اگر نقشه کلید مجازی موجود باشد، فایل طرح بندی کلید برای دستگاه نیز بارگیری می شود.
در مورد مکان و فرمت فایل های نقشه کلید مجازی به بخش زیر مراجعه کنید.
در مرحله بعد، سیستم فایل پیکربندی دستگاه ورودی را برای دستگاه لمسی بارگیری می کند.
همه دستگاه های لمسی داخلی باید فایل های پیکربندی دستگاه ورودی داشته باشند. اگر فایل پیکربندی دستگاه ورودی وجود نداشته باشد، سیستم یک پیکربندی پیشفرض را انتخاب میکند که برای تجهیزات جانبی لمسی معمولی مانند صفحهنمایشهای لمسی USB یا بلوتوث HID یا پدهای لمسی مناسب است. این پیشفرضها برای صفحههای لمسی داخلی طراحی نشدهاند و به احتمال زیاد منجر به رفتار نادرست خواهند شد.
پس از بارگیری پیکربندی دستگاه ورودی، سیستم دستگاه ورودی را به عنوان صفحه نمایش لمسی، صفحه لمسی یا دستگاه اشاره گر طبقه بندی می کند.
یک دستگاه صفحه نمایش لمسی برای دستکاری مستقیم اشیاء روی صفحه نمایش استفاده می شود. از آنجایی که کاربر مستقیماً صفحه را لمس می کند، سیستم به هیچ هزینه اضافی برای نشان دادن اشیاء دستکاری شده نیاز ندارد.
یک دستگاه پد لمسی برای ارائه اطلاعات موقعیت یابی مطلق به یک برنامه کاربردی در مورد لمس در ناحیه سنسور معین استفاده می شود. ممکن است برای قرص های دیجیتایزر مفید باشد.
یک دستگاه اشاره گر برای دستکاری غیر مستقیم اشیاء روی صفحه با استفاده از مکان نما استفاده می شود. انگشتان به عنوان حرکات اشاره گر چند لمسی تفسیر می شوند. ابزارهای دیگر، مانند قلم، با استفاده از موقعیت های مطلق تفسیر می شوند.
برای اطلاعات بیشتر به حرکات اشاره گر چند لمسی غیر مستقیم مراجعه کنید.
قوانین زیر برای طبقه بندی دستگاه ورودی به عنوان صفحه لمسی، صفحه لمسی یا دستگاه اشاره گر استفاده می شود.
اگر ویژگی
touch.deviceType
تنظیم شده باشد، نوع دستگاه همانطور که نشان داده شده تنظیم می شود.اگر دستگاه ورودی وجود ویژگی ورودی
INPUT_PROP_DIRECT
را گزارش دهد (از طریقEVIOCGPROP
)، نوع دستگاه روی صفحه نمایش لمسی تنظیم می شود. این شرایط فرض میکند که دستگاههای لمسی ورودی مستقیم به صفحهنمایش متصل شدهاند.اگر دستگاه ورودی وجود ویژگی ورودی
INPUT_PROP_POINTER
را گزارش دهد (از طریقEVIOCGPROP
)، نوع دستگاه روی اشاره گر تنظیم می شود.اگر دستگاه ورودی وجود محورهای نسبی
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
نگاشت شده است.
ابزارها و انواع ابزار
ابزار یک انگشت، قلم یا دستگاه دیگری است که برای تعامل با دستگاه لمسی استفاده می شود. برخی از دستگاه های لمسی می توانند انواع مختلف ابزارها را تشخیص دهند.
در جای دیگر اندروید، مانند 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
به برنامهها گزارش میشوند.
Device Driver Requirements را لمس کنید
درایورهای دستگاه لمسی فقط باید محورها و کدهای کلیدی را برای محورها و دکمههایی که واقعاً پشتیبانی میکنند ثبت کنند. ثبت بیش از حد محورها یا کدهای کلید ممکن است الگوریتم طبقه بندی دستگاه را گیج کند یا باعث شود سیستم به اشتباه قابلیت های دستگاه را تشخیص دهد.
به عنوان مثال، اگر دستگاه کد کلید
BTN_TOUCH
را گزارش کند، سیستم فرض می کند کهBTN_TOUCH
همیشه برای نشان دادن اینکه آیا ابزار واقعاً صفحه را لمس می کند یا خیر استفاده می شود. بنابراین،BTN_TOUCH
نباید برای نشان دادن این که ابزار صرفاً در محدوده قرار دارد و شناور است، استفاده شود.دستگاه های تک لمسی از رویدادهای ورودی لینوکس زیر استفاده می کنند:
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
: (optional) Reports the tool type .
دستگاه های چند لمسی از رویدادهای ورودی لینوکس زیر استفاده می کنند:
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
: (اختیاری) هنگام استفاده از پروتکل چند لمسی لینوکس 'B'، شناسه شکاف ابزار را گزارش می کند. برای جزئیات بیشتر به مستندات پروتکل چند لمسی لینوکس مراجعه کنید.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
: (optional) Reports the tool type .
اگر محورها برای هر دو پروتکل تک لمسی و چند لمسی تعریف شده باشد، آنگاه فقط محورهای چند لمسی استفاده می شود و محورهای تک لمسی نادیده گرفته می شوند.
مقادیر حداقل و حداکثر
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 است.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 Ice Cream Sandwich 4.0، درایورهای صفحه لمسی ممکن است نیاز به تغییر داشته باشند تا با مشخصات پروتکل ورودی لینوکس مطابقت داشته باشند.
ممکن است تغییرات زیر مورد نیاز باشد:
وقتی ابزاری غیرفعال می شود (انگشت "بالا" می رود)، باید در گزارش های همگام سازی چند لمسی بعدی ظاهر نشود. وقتی همه ابزارها غیرفعال می شوند (همه انگشتان "بالا" می روند)، راننده باید یک بسته گزارش همگام سازی خالی، مانند
SYN_MT_REPORT
و سپسSYN_REPORT
کند.نسخههای قبلی Android انتظار داشتند رویدادهای "بالا" با ارسال مقدار فشار 0 گزارش شوند. رفتار قدیمی با مشخصات پروتکل ورودی لینوکس ناسازگار بود و دیگر پشتیبانی نمیشود.
اطلاعات فشار فیزیکی یا قدرت سیگنال باید با استفاده از
ABS_MT_PRESSURE
گزارش شود.نسخههای قبلی Android اطلاعات فشار را از
ABS_MT_TOUCH_MAJOR
بازیابی کردند. رفتار قدیمی با مشخصات پروتکل ورودی لینوکس ناسازگار بود و دیگر پشتیبانی نمی شود.اطلاعات اندازه لمس باید با استفاده از
ABS_MT_TOUCH_MAJOR
گزارش شود.نسخههای قبلی Android اطلاعات اندازه را از
ABS_MT_TOOL_MAJOR
بازیابی میکردند. رفتار قدیمی با مشخصات پروتکل ورودی لینوکس ناسازگار بود و دیگر پشتیبانی نمی شود.
درایورهای دستگاه لمسی دیگر نیازی به سفارشی سازی مختص اندروید ندارند. با تکیه بر پروتکل ورودی استاندارد لینوکس، اندروید میتواند از طیف گستردهتری از لوازم جانبی لمسی مانند صفحهنمایشهای لمسی چند لمسی خارجی HID، با استفاده از درایورهای اصلاح نشده پشتیبانی کند.
عملکرد دستگاه را لمس کنید
در زیر خلاصه ای از عملکرد دستگاه لمسی در اندروید ارائه شده است.
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
برای هر محور به دست می آیند.
-
raw.*.min
- حداقل ارزش شامل محور خام.
-
raw.*.max
- حداکثر ارزش شامل محور خام.
-
raw.*.range
- معادل
raw.*.max - raw.*.min
. -
raw.*.fuzz
- دقت محور خام. به عنوان مثال. fuzz = 1 به معنای دقیق بودن مقادیر +/- 1 واحد است.
-
raw.width
- پهنای فراگیر ناحیه لمسی، معادل
raw.x.range + 1
. -
raw.height
- ارتفاع فراگیر ناحیه لمسی، معادل
raw.y.range + 1
.
محدوده های خروجی
عبارات زیر ویژگی های سیستم مختصات خروجی را نشان می دهد. این سیستم از درون یابی خطی برای ترجمه اطلاعات موقعیت لمسی از واحدهای سطحی استفاده شده توسط دستگاه لمسی به واحدهای خروجی استفاده می کند که به برنامه هایی مانند پیکسل های نمایشگر گزارش می شود.
-
output.width
- عرض خروجی برای صفحات لمسی (مرتبط با نمایشگر)، این عرض نمایش بر حسب پیکسل است. برای پدهای لمسی (که با نمایشگر مرتبط نیستند)، عرض خروجی برابر با
raw.width
است، که نشان می دهد هیچ درون یابی انجام نخواهد شد. -
output.height
- ارتفاع خروجی برای صفحات لمسی (مرتبط با نمایشگر)، این ارتفاع نمایشگر بر حسب پیکسل است. برای پدهای لمسی (که با نمایشگر مرتبط نیستند)، ارتفاع خروجی برابر با
raw.height
است، که نشان می دهد هیچ درون یابی انجام نخواهد شد. -
output.diag
- طول مورب سیستم مختصات خروجی، معادل
sqrt(output.width ^2 + output.height ^2)
.
پیکربندی پایه
نقشهبردار ورودی لمسی از بسیاری از ویژگیهای پیکربندی در فایل پیکربندی دستگاه ورودی برای تعیین مقادیر کالیبراسیون استفاده میکند. جدول زیر برخی از ویژگی های پیکربندی با هدف کلی را توضیح می دهد. تمام خصوصیات دیگر به همراه فیلدهایی که برای کالیبراسیون استفاده می شوند در بخش های زیر توضیح داده شده است.
touch.deviceType
تعریف: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
نوع دستگاه لمسی را مشخص می کند.
اگر مقدار صفحه
touchScreen
باشد، دستگاه لمسی یک صفحه نمایش لمسی مرتبط با یک نمایشگر است.اگر مقدار
touchPad
پد باشد، دستگاه لمسی یک پد لمسی است که با نمایشگر مرتبط نیست.اگر مقدار
pointer
باشد، دستگاه لمسی یک پد لمسی است که با نمایشگر مرتبط نیست و از حرکات آن برای حرکات اشاره گر چند لمسی غیرمستقیم استفاده می شود.اگر مقدار
default
باشد، سیستم بهطور خودکار نوع دستگاه را طبق الگوریتم طبقهبندی تشخیص میدهد.
برای جزئیات بیشتر در مورد نحوه تأثیر نوع دستگاه بر رفتار دستگاه لمسی به بخش طبقه بندی مراجعه کنید.
قبل از Honeycomb فرض بر این بود که تمام دستگاه های لمسی صفحه نمایش لمسی هستند.
touch.orientationAware
تعریف: touch.orientationAware
= 0
| 1
مشخص می کند که آیا دستگاه لمسی باید به تغییرات جهت نمایش واکنش نشان دهد یا خیر.
اگر مقدار
1
باشد، هر زمان که جهت نمایشگر تغییر کند، موقعیت های لمسی گزارش شده توسط دستگاه لمسی چرخانده می شود.اگر مقدار
0
باشد، موقعیت های لمسی گزارش شده توسط دستگاه لمسی از تغییرات جهت نمایش در امان هستند.
اگر دستگاه صفحه لمسی باشد، مقدار پیشفرض 1
است، در غیر این صورت 0
است.
این سیستم بین صفحه نمایش و نمایشگر لمسی داخلی و خارجی تمایز قائل می شود. یک صفحه نمایش لمسی داخلی آگاه از جهت گیری بر اساس جهت نمایش داخلی می چرخد. یک صفحه نمایش لمسی خارجی آگاه از جهت یابی بر اساس جهت گیری نمایشگر خارجی می چرخد.
آگاهی جهتگیری برای پشتیبانی از چرخش صفحههای لمسی در دستگاههایی مانند Nexus One استفاده میشود. برای مثال، هنگامی که دستگاه در جهت عقربههای ساعت 90 درجه از جهت طبیعی خود میچرخد، موقعیتهای مطلق لمسها به گونهای تغییر میکنند که لمس در گوشه سمت چپ بالای سیستم مختصات مطلق صفحه نمایش لمسی به عنوان لمس در بالا سمت چپ گزارش میشود. گوشه ای از سیستم مختصات چرخانده نمایشگر. این کار به گونه ای انجام می شود که لمس ها با همان سیستم مختصاتی که برنامه ها برای ترسیم عناصر بصری خود استفاده می کنند، گزارش می شوند.
قبل از 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
نرمال شده لمس را نسبت به بزرگترین لمس ممکن که دستگاه لمسی می تواند حس کند، توصیف می کند. کوچکترین اندازه نرمال شده ممکن 0.0 است (بدون تماس، یا غیر قابل اندازه گیری) و بزرگترین اندازه نرمال شده ممکن 1.0 است (منطقه حسگر اشباع شده است).
وقتی بتوان هم طول و هم عرض تقریبی را اندازه گرفت، فیلد TouchMajor
بعد بلندتر و فیلد TouchMinor
بعد کوتاهتر ناحیه تماس را مشخص میکند. وقتی فقط قطر تقریبی ناحیه تماس قابل اندازه گیری باشد، TouchMajor
و TouchMinor
برابر خواهند بود.
به همین ترتیب، فیلد ToolMajor
بعد طولانیتر و فیلد ToolMinor
بعد کوتاهتر سطح مقطع ابزار را مشخص میکند.
اگر اندازه لمسی در دسترس نیست اما اندازه ابزار موجود است، اندازه ابزار برابر با اندازه لمس تنظیم می شود. برعکس، اگر اندازه ابزار در دسترس نباشد اما اندازه لمسی موجود باشد، اندازه لمسی برابر با اندازه ابزار تنظیم می شود.
دستگاه های لمسی اندازه لمس و اندازه ابزار را به روش های مختلف اندازه گیری یا گزارش می کنند. اجرای فعلی از سه نوع مختلف اندازه گیری پشتیبانی می کند: قطر، مساحت و جعبه مرزی هندسی در واحدهای سطح.
touch.size.calibration
تعریف: touch.size.calibration
= none
| geometric
| diameter
| area
| default
نوع اندازه گیری مورد استفاده توسط درایور لمسی برای گزارش اندازه لمس و اندازه ابزار را مشخص می کند.
اگر مقدار
none
باشد، اندازه روی صفر تنظیم می شود.اگر مقدار
geometric
باشد، فرض میشود که اندازه در واحدهای سطحی مشابه موقعیت مشخص میشود، بنابراین به همان روش مقیاسبندی میشود.اگر مقدار
diameter
باشد، اندازه متناسب با قطر (عرض) لمس یا ابزار در نظر گرفته می شود.اگر مقدار
area
، اندازه در نظر گرفته میشود که متناسب با مساحت لمس یا ابزار باشد.اگر مقدار
default
باشد، اگر محورraw.touchMajor
یاraw.toolMajor
موجود باشد، سیستم از کالیبراسیونgeometric
استفاده میکند، در غیر این صورت از کالیبراسیون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
فیلد Pressure
، فشار فیزیکی تقریبی اعمال شده به دستگاه لمسی را به صورت یک مقدار نرمال شده بین 0.0 (بدون لمس) و 1.0 (نیروی کامل) توصیف می کند.
فشار صفر نشان می دهد که ابزار معلق است.
touch.pressure.calibration
تعریف: touch.pressure.calibration
= none
| physical
| amplitude
| default
نوع اندازه گیری مورد استفاده توسط درایور لمسی برای گزارش فشار را مشخص می کند.
اگر مقدار
none
نباشد، فشار ناشناخته است، بنابراین در هنگام لمس روی 1.0 و هنگام شناور کردن 0.0 تنظیم می شود.اگر مقدار
physical
باشد، محور فشار برای اندازه گیری شدت فیزیکی واقعی فشار اعمال شده به پد لمسی فرض می شود.If the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses thephysical
calibration if the pressure axis available, otherwise usesnone
.
touch.pressure.scale
Definition: touch.pressure.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0 / raw.pressure.max
.
Calculation
The calculation of the Pressure
field depends on the specified calibration parameters.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Orientation
and Tilt
Fields
The Orientation
field describes the orientation of the touch and tool as an angular measurement. An orientation of 0
indicates that the major axis is oriented vertically, -PI/2
indicates that the major axis is oriented to the left, PI/2
indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI
or PI
.
The Tilt
field describes the inclination of the tool as an angular measurement. A tilt of 0
indicates that the tool is perpendicular to the surface. A tilt of PI/2
indicates that the tool is flat on the surface.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifies the kind of measurement used by the touch driver to report the orientation.
If the value is
none
, the orientation is unknown so it is set to 0.If the value is
interpolated
, the orientation is linearly interpolated such that a raw value ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
.If the value is
vector
, the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.If the value is
default
, the system uses theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Calculation
The calculation of the Orientation
and Tilt
fields depends on the specified calibration parameters and available input.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
Distance
Field
The Distance
field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Specifies the kind of measurement used by the touch driver to report the distance.
If the value is
none
, the distance is unknown so it is set to 0.If the value is
scaled
, the reported distance is multiplied by a constant scale factor.If the value is
default
, the system uses thescaled
calibration if the distance axis available, otherwise usesnone
.
touch.distance.scale
Definition: touch.distance.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
Calculation
The calculation of the Distance
field depends on the specified calibration parameters.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Example
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters will need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Compatibility Notes
The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.
Older touch device drivers may also need to be updated.
Virtual Key Map Files
Touch devices are often used to implement virtual keys.
There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.
When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename>
as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely
.
A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.
In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION
).
Syntax
A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.
Comment lines begin with '#' and continue to the end of the line.
Each virtual key is described by 6 colon-delimited components:
-
0x01
: A version code. Must always be0x01
. - <Linux key code>: The Linux key code of the virtual key.
- <centerX>: The X pixel coordinate of the center of the virtual key.
- <centerY>: The Y pixel coordinate of the center of the virtual key.
- <width>: The width of the virtual key in pixels.
- <height>: The height of the virtual key in pixels.
All coordinates and sizes are specified in terms of the display coordinate system.
Here is a virtual key map file all written on one line.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
The same virtual key map file can also be written on multiple lines.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.
The first key has a Linux scan code of 158
( KEY_BACK
), centerX of 55
, centerY of 835
, width of 90
and height of 55
.
Example
Virtual key map file: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Key layout file: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key character map file: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirect Multi-touch Pointer Gestures
In pointer mode, the system interprets the following gestures:
Single finger tap: click.
Single finger motion: move the pointer.
Single finger motion plus button presses: drag the pointer.
Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
Multiple finger motion: freeform gesture.
Palm rejection
As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM
flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.
The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the edge of the display the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by TouchMajor
and TouchMinor
. The Android framework then removes the pointers that are marked as palms from the touch stream.
If a pointer was already sent to the apps, then the system either:
- (If there are other active pointers) Cancels the pointer with
ACTION_POINTER_UP
andFLAG_CANCELED
set. - (If this is the only pointer) Cancels the pointer with
ACTION_CANCEL
.
A public API, MotionEvent.FLAG_CANCELED
, indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL
and ACTION_POINTER_UP
.
If the palm pointer wasn't sent to apps, then the system simply drops the pointer.
Enable palm rejection
- In your touch driver, use the
input_abs_set_res
macro to set the resolutions for the following fields (units are pixels per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Support for
ABS_MT_TOUCH_MINOR
is optional. However, if your device does support it, make sure the resolution is set correctly. -
- To confirm the fields are set correctly, run:
$ adb shell getevent -li
- To enable the feature during runtime, run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Restart the
system_server
process.$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys input
shows that there are palm rejectors insideUnwantedInteractionBlocker
. If it doesn't, check the input-related logs to find clues on what might be misconfigured.See the following example for reference:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - To permanently enable the feature, add the corresponding sysprop command in your
init**rc
file:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1