دستگاه های لمسی

اندروید از انواع صفحه‌نمایش‌های لمسی و پدهای لمسی، از جمله تبلت‌های دیجیتالی‌ساز مبتنی بر قلم پشتیبانی می‌کند.

صفحه‌های لمسی دستگاه‌های لمسی هستند که با یک نمایشگر مرتبط هستند به طوری که کاربر این تصور را دارد که مستقیماً آیتم‌های روی صفحه را دستکاری می‌کند.

پدهای لمسی دستگاه های لمسی هستند که با صفحه نمایشی مانند تبلت دیجیتایزر مرتبط نیستند. پدهای لمسی معمولاً برای اشاره یا برای موقعیت یابی غیرمستقیم مطلق یا کنترل مبتنی بر ژست یک رابط کاربری استفاده می شود.

دستگاه های لمسی ممکن است دکمه هایی داشته باشند که عملکرد آنها شبیه دکمه های ماوس است.

بسته به فناوری حسگر لمسی، گاهی اوقات می‌توان دستگاه‌های لمسی را با استفاده از ابزارهای مختلف مانند انگشتان یا قلم دستکاری کرد.

گاهی اوقات از دستگاه های لمسی برای پیاده سازی کلیدهای مجازی استفاده می شود. به عنوان مثال، در برخی از دستگاه‌های اندرویدی، ناحیه حسگر صفحه لمسی فراتر از لبه نمایشگر گسترش می‌یابد و به عنوان بخشی از صفحه کلید حساس به لمس، کارکرد دوگانه را دارد.

با توجه به تنوع زیاد دستگاه های لمسی، اندروید برای توصیف ویژگی ها و رفتار دلخواه هر دستگاه به تعداد زیادی ویژگی پیکربندی متکی است.

دسته بندی دستگاه را لمس کنید

اگر هر دو شرایط زیر برقرار باشد، یک دستگاه ورودی به عنوان یک دستگاه چند لمسی طبقه بندی می شود:

  • دستگاه ورودی وجود محورهای مطلق 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 را لمس کنید

  1. درایورهای دستگاه لمسی فقط باید محورها و کدهای کلیدی را برای محورها و دکمه‌هایی که واقعاً پشتیبانی می‌کنند ثبت کنند. ثبت بیش از حد محورها یا کدهای کلید ممکن است الگوریتم طبقه بندی دستگاه را گیج کند یا باعث شود سیستم به اشتباه قابلیت های دستگاه را تشخیص دهد.

    به عنوان مثال، اگر دستگاه کد کلید BTN_TOUCH را گزارش کند، سیستم فرض می کند که BTN_TOUCH همیشه برای نشان دادن اینکه آیا ابزار واقعاً صفحه را لمس می کند یا خیر استفاده می شود. بنابراین، BTN_TOUCH نباید برای نشان دادن این که ابزار صرفاً در محدوده قرار دارد و شناور است، استفاده شود.

  2. دستگاه های تک لمسی از رویدادهای ورودی لینوکس زیر استفاده می کنند:

    • 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 .

  3. دستگاه های چند لمسی از رویدادهای ورودی لینوکس زیر استفاده می کنند:

    • 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 .

  4. اگر محورها برای هر دو پروتکل تک لمسی و چند لمسی تعریف شده باشد، آنگاه فقط محورهای چند لمسی استفاده می شود و محورهای تک لمسی نادیده گرفته می شوند.

  5. مقادیر حداقل و حداکثر 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).

    چسباندن مختصات لمسی به لبه نمایشگر، یک مرز سخت مصنوعی در اطراف لبه صفحه ایجاد می‌کند که از ردیابی هموار حرکاتی که وارد یا خارج از محدوده صفحه نمایش می‌شوند، جلوگیری می‌کند.

  6. مقادیر گزارش شده توسط ABS_PRESSURE یا ABS_MT_PRESSURE ، اگر اصلاً گزارش شده باشند، باید زمانی که ابزار در حال لمس دستگاه است غیر صفر و در غیر این صورت صفر باشد تا نشان دهد که ابزار معلق است.

    گزارش اطلاعات فشار اختیاری است اما به شدت توصیه می شود. برنامه ها می توانند از اطلاعات فشار برای اجرای نقشه های حساس به فشار و سایر اثرات استفاده کنند.

  7. مقادیر گزارش شده توسط ABS_TOOL_WIDTH ، ABS_MT_TOUCH_MAJOR ، ABS_MT_TOUCH_MINOR ، ABS_MT_WIDTH_MAJOR ، یا ABS_MT_WIDTH_MINOR باید غیر صفر و در غیر این صورت صفر باشند، اما در غیر این صورت نیازی به این نیست. به عنوان مثال، دستگاه لمسی ممکن است بتواند اندازه مخاطبین لمسی انگشت را اندازه گیری کند، اما نمی تواند اندازه مخاطبین لمسی قلم را اندازه گیری کند.

    گزارش اطلاعات اندازه اختیاری است اما قویاً توصیه می شود. برنامه ها می توانند از اطلاعات فشار برای پیاده سازی نقشه های حساس به اندازه و سایر اثرات استفاده کنند.

  8. مقادیر گزارش شده توسط ABS_DISTANCE یا ABS_MT_DISTANCE باید زمانی که ابزار در حال لمس دستگاه است به صفر نزدیک شود. فاصله ممکن است حتی زمانی که ابزار در تماس مستقیم است غیر صفر باقی بماند. مقادیر دقیق گزارش شده به روشی که سخت افزار فاصله را اندازه می گیرد بستگی دارد.

    گزارش اطلاعات فاصله اختیاری است اما برای دستگاه های قلم توصیه می شود.

  9. مقادیر گزارش شده توسط ABS_TILT_X و ABS_TILT_Y زمانی که ابزار عمود بر دستگاه است باید صفر باشد. شیب غیر صفر به عنوان نشانه ای از نگه داشتن ابزار در شیب در نظر گرفته می شود.

    زوایای شیب در امتداد محورهای X و Y بر حسب درجه از عمود در نظر گرفته شده است. نقطه مرکزی (کاملاً عمود بر) با (max + min) / 2 برای هر محور داده می شود. مقادیر کوچکتر از نقطه مرکزی نشان دهنده یک شیب به سمت بالا یا چپ است، مقادیر بزرگتر از نقطه مرکزی نشان دهنده یک شیب به پایین یا به راست است.

    InputReader اجزای شیب X و Y را به یک زاویه شیب عمودی از 0 تا PI / 2 رادیان و یک زاویه جهت مسطح از -PI تا رادیان PI تبدیل می کند. این نمایش منجر به توصیف جهت گیری می شود که با آنچه برای توصیف لمس انگشت استفاده می شود سازگار است.

    گزارش اطلاعات شیب اختیاری است اما برای دستگاه های قلم توصیه می شود.

  10. اگر نوع ابزار توسط ABS_MT_TOOL_TYPE گزارش شود، جایگزین هر گونه اطلاعات نوع ابزار گزارش شده توسط BTN_TOOL_* می شود. اگر هیچ اطلاعاتی از نوع ابزار در دسترس نباشد، نوع ابزار پیش‌فرض MotionEvent است. MotionEvent.TOOL_TYPE_FINGER .

  11. یک ابزار بر اساس شرایط زیر فعال است:

    • هنگام استفاده از پروتکل تک لمسی، اگر BTN_TOUCH یا BTN_TOOL_* 1 باشد، ابزار فعال است.

      این شرط حاکی از آن است که InputReader باید حداقل اطلاعاتی در مورد ماهیت ابزار داشته باشد، چه لمسی بودن یا حداقل نوع ابزار آن. اگر هیچ اطلاعاتی در دسترس نباشد، ابزار غیرفعال (خارج از محدوده) فرض می شود.

    • هنگام استفاده از پروتکل چند لمسی 'A'، ابزار هر زمان که در آخرین گزارش همگام سازی ظاهر شود فعال است. وقتی ابزار در گزارش‌های همگام‌سازی ظاهر نمی‌شود، دیگر وجود ندارد.

    • هنگام استفاده از پروتکل چند لمسی 'B'، ابزار تا زمانی فعال است که یک اسلات فعال داشته باشد. وقتی شکاف پاک شد، ابزار دیگر وجود ندارد.

  12. یک ابزار بر اساس شرایط زیر معلق است:

    • اگر ابزار BTN_TOOL_MOUSE یا BTN_TOOL_LENS باشد، ابزار شناور نمی‌شود، حتی اگر یکی از شرایط زیر درست باشد.

    • اگر ابزار فعال باشد و راننده اطلاعات فشار را گزارش کند و فشار گزارش شده صفر باشد، ابزار در حالت شناور است.

    • اگر ابزار فعال است و درایور از کد کلید BTN_TOUCH پشتیبانی می کند و BTN_TOUCH دارای مقدار صفر است، ابزار در حالت شناور است.

  13. InputReader از هر دو پروتکل چند لمسی "A" و "B" پشتیبانی می کند. درایورهای جدید باید از پروتکل "B" استفاده کنند اما هر کدام کار خواهند کرد.

  14. از 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، با استفاده از درایورهای اصلاح نشده پشتیبانی کند.

عملکرد دستگاه را لمس کنید

در زیر خلاصه ای از عملکرد دستگاه لمسی در اندروید ارائه شده است.

  1. EventHub رویدادهای خام را از درایور evdev می خواند.

  2. InputReader رویدادهای خام را مصرف می کند و وضعیت داخلی را در مورد موقعیت و سایر ویژگی های هر ابزار به روز می کند. همچنین وضعیت دکمه ها را ردیابی می کند.

  3. اگر دکمه‌های BACK یا FORWARD فشرده یا رها شوند، InputReader به InputDispatcher در مورد رویداد کلیدی اطلاع می‌دهد.

  4. InputReader تعیین می کند که آیا فشار کلید مجازی رخ داده است یا خیر. اگر چنین است، InputDispatcher را در مورد رویداد کلیدی مطلع می کند.

  5. InputReader تعیین می کند که آیا لمس در محدوده نمایشگر شروع شده است یا خیر. اگر چنین است، InputDispatcher را در مورد رویداد لمسی مطلع می کند.

  6. اگر هیچ ابزار لمسی وجود نداشته باشد اما حداقل یک ابزار شناور وجود داشته باشد، InputReader به InputDispatcher در مورد رویداد شناور اطلاع می دهد.

  7. اگر نوع دستگاه لمسی اشاره گر باشد، InputReader تشخیص اشاره اشاره گر را انجام می دهد، نشانگر و نقاط را بر اساس آن حرکت می دهد و InputDispatcher را در مورد رویداد اشاره گر مطلع می کند.

  8. 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 the physical calibration if the pressure axis available, otherwise uses none .

touch.pressure.scale

Definition: touch.pressure.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 / raw.pressure.max .

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 of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .

  • 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 the interpolated calibration if the orientation axis available, otherwise uses none .

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 the scaled calibration if the distance axis available, otherwise uses none .

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 be 0x01 .
  • <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:

  1. Single finger tap: click.

  2. Single finger motion: move the pointer.

  3. Single finger motion plus button presses: drag the pointer.

  4. 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.

  5. 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.

  6. 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 and FLAG_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

  1. 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.

  2. To confirm the fields are set correctly, run:
        $ adb shell getevent -li
    
  3. To enable the feature during runtime, run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Restart the system_server process.
         $ adb shell stop && adb shell start
        
  5. Confirm that adb shell dumpsys input shows that there are palm rejectors inside UnwantedInteractionBlocker . 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: {}
    
  6. 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
    

Further Reading

  1. Linux multi-touch protocol
  2. ENAC list of available multitouch devices on Linux