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

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

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

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

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

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

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

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

طبقه‌بندی دستگاه لمسی

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

  • دستگاه ورودی وجود محورهای مطلق ABS_MT_POSITION_X و ABS_MT_POSITION_Y را گزارش می‌کند.
  • دستگاه ورودی هیچ دکمه دسته بازی‌ای ندارد. این شرط ابهام مربوط به برخی‌از دسته‌های بازی را که محورها را با کدهایی گزارش می‌کنند که با کدهای محورهای MT هم‌پوشانی دارند برطرف می‌کند.

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

  • دستگاه ورودی به‌عنوان دستگاه چندلمسی طبقه‌بندی نشده است. دستگاه ورودی یا به‌عنوان دستگاه تک‌لمسی یا به‌عنوان دستگاه چندلمسی طبقه‌بندی می‌شود، هرگز هر دو نیست.
  • دستگاه ورودی وجود محورهای مطلق ABS_X و ABS_Y و وجود کد کلید BTN_TOUCH را گزارش می‌کند.

وقتی دستگاه ورودی به‌عنوان دستگاه لمسی طبقه‌بندی می‌شود، وجود کلیدهای مجازی با تلاش برای بار کردن فایل نقشه کلید مجازی برای دستگاه تعیین می‌شود. اگر نگاشت کلید مجازی دردسترس باشد، فایل چیدمان کلید برای دستگاه نیز بار می‌شود. برای کسب اطلاعات درباره مکان و قالب این فایل‌ها، به [فایل‌های نقشه کلید مجازی](#virtual-key-map-files) مراجعه کنید.

سپس، سیستم فایل پیکربندی دستگاه ورودی را برای دستگاه لمسی بار می‌کند.

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

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

  • از دستگاه دارای صفحه لمسی برای دستکاری مستقیم اشیاء روی صفحه استفاده می‌شود. کاربر مستقیماً صفحه را لمس می‌کند، بنابراین سیستم به هیچ امکانات اضافی برای نشان دادن اشیایی که دستکاری می‌شوند نیاز ندارد.
  • از دستگاه صفحه لمسی برای ارائه اطلاعات موقعیت‌یابی مطلق به برنامه درباره لمس‌های انجام‌شده در ناحیه حسگر مشخصی استفاده می‌شود. این ویژگی می‌تواند برای تبلت‌های دیجیتالی مفید باشد.
  • از دستگاه اشاره‌گر برای دستکاری غیرمستقیم اشیاء روی صفحه بااستفاده از مکان‌نما استفاده می‌شود. انگشتان به‌عنوان اشاره‌های اشاره‌گر چندلمسی تفسیر می‌شوند. ابزارهای دیگر، مانند قلم‌ها، بااستفاده از موقعیت‌های مطلق تفسیر می‌شوند. برای اطلاعات بیشتر، اشاره‌های اشاره‌گر چندلمسی غیرمستقیم را ببینید.

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

  • اگر ویژگی touch.deviceType تنظیم شده باشد، نوع دستگاه همان‌طور که نشان داده شده است تنظیم می‌شود.
  • اگر دستگاه ورودی وجود ویژگی ورودی INPUT_PROP_DIRECT را (ازطریق EVIOCGPROP ioctl) گزارش کند، نوع دستگاه روی صفحه لمسی تنظیم می‌شود. این شرط فرض می‌کند که دستگاه‌های لمسی ورودی مستقیم به نمایشگری متصل هستند که آن هم متصل است.
  • اگر دستگاه ورودی وجود ویژگی ورودی INPUT_PROP_POINTER را (ازطریق EVIOCGPROP ioctl) گزارش کند، نوع دستگاه روی اشاره‌گر تنظیم می‌شود.
  • اگر دستگاه ورودی وجود محورهای نسبی REL_X یا REL_Y را گزارش کند، نوع دستگاه روی صفحه لمسی تنظیم می‌شود. این شرط ابهام را برای دستگاه‌های ورودی که هم موشواره و هم صفحه لمسی دارند برطرف می‌کند. در این حالت، از صفحه لمسی برای کنترل اشاره‌گر استفاده نمی‌شود زیرا موشواره ازقبل آن را کنترل می‌کند.
  • درغیراین‌صورت، نوع دستگاه روی اشاره‌گر تنظیم می‌شود. این پیش‌فرض تضمین می‌کند که صفحه‌های لمسی که هیچ هدف خاص دیگری برای آن‌ها تعیین نشده است نشانگر را کنترل کنند.

دکمه‌ها

دکمه‌ها کنترل‌های اختیاری هستند که برنامه‌ها می‌توانند برای انجام عملکردهای اضافی از آن‌ها استفاده کنند. دکمه‌ها در دستگاه‌های لمسی رفتاری مشابه دکمه‌های موشواره دارند و عمدتاً در دستگاه‌های لمسی از نوع اشاره‌گر یا با قلم استفاده می‌شوند.

دکمه‌های زیر پشتیبانی می‌شود:

  • BTN_LEFT: به MotionEvent.BUTTON_PRIMARY نگاشت شد.
  • BTN_RIGHT: به MotionEvent.BUTTON_SECONDARY نگاشت شد.
  • BTN_MIDDLE: به MotionEvent.BUTTON_MIDDLE نگاشت شد.
  • ‫BTN_BACK و BTN_SIDE: به MotionEvent.BUTTON_BACK نگاشت شد. فشار دادن این دکمه همچنین فشار دادن کلید را با کد کلید KeyEvent.KEYCODE_BACK ترکیب می‌کند.
  • BTN_FORWARD و BTN_EXTRA: به MotionEvent.BUTTON_FORWARD نگاشت شد. فشار دادن این دکمه همچنین فشار دادن کلید را با کد کلید KeyEvent.KEYCODE_FORWARD ترکیب می‌کند.
  • BTN_STYLUS: به MotionEvent.BUTTON_SECONDARY نگاشت شد.
  • BTN_STYLUS2: به MotionEvent.BUTTON_TERTIARY نگاشت شد.

ابزارها و انواع ابزار

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

در جاهای دیگر Android، مانند میانای برنامه‌سازی کاربردی MotionEvent، اغلب به ابزار اشاره‌گر گفته می‌شود.

انواع ابزارهای زیر پشتیبانی می‌شوند:

  • BTN_TOOL_FINGER و MT_TOOL_FINGER: به MotionEvent.TOOL_TYPE_FINGER نگاشت شد.
  • BTN_TOOL_PEN و MT_TOOL_PEN: به MotionEvent.TOOL_TYPE_STYLUS نگاشت شد.
  • BTN_TOOL_RUBBER: به MotionEvent.TOOL_TYPE_ERASER نگاشت شد.
  • BTN_TOOL_BRUSH: به MotionEvent.TOOL_TYPE_STYLUS نگاشت شد.
  • BTN_TOOL_PENCIL: به MotionEvent.TOOL_TYPE_STYLUS نگاشت شد.
  • BTN_TOOL_AIRBRUSH: به MotionEvent.TOOL_TYPE_STYLUS نگاشت شد.
  • BTN_TOOL_MOUSE: به MotionEvent.TOOL_TYPE_MOUSE نگاشت شد.
  • BTN_TOOL_LENS: به MotionEvent.TOOL_TYPE_MOUSE نگاشت شد.
  • ‫BTN_TOOL_DOUBLETAP، BTN_TOOL_TRIPLETAP، و BTN_TOOL_QUADTAP: به MotionEvent.TOOL_TYPE_FINGER نگاشت شده است.

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

ابزارها می‌توانند با دستگاه لمسی در تماس باشند یا در محدوده آن باشند و بالای آن شناور باشند. همه دستگاه‌های لمسی نمی‌توانند وجود ابزاری را که بالای دستگاه لمسی نگه داشته شده است حس کنند. آن‌هایی که این کار را انجام می‌دهند، مانند دیجیتایزرهای قلم نوری مبتنی بر RF، اغلب می‌توانند تشخیص دهند که ابزار در محدوده محدودی از دیجیتایزر قرار دارد.

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

ابزارهای لمسی بااستفاده از MotionEvent.ACTION_DOWN،‏ MotionEvent.ACTION_MOVE،‏ MotionEvent.ACTION_DOWN،‏ MotionEvent.ACTION_POINTER_DOWN، و MotionEvent.ACTION_POINTER_UP به‌عنوان رویدادهای لمسی به برنامه‌ها گزارش می‌شوند.

ابزارهای شناور بااستفاده از MotionEvent.ACTION_HOVER_ENTER،‏ MotionEvent.ACTION_HOVER_MOVE، و MotionEvent.ACTION_HOVER_EXIT به‌عنوان رویدادهای حرکتی عمومی به برنامه‌ها گزارش می‌شوند.

الزامات درایور دستگاه لمسی

  • درایورهای دستگاه لمسی باید فقط محورها و کدهای کلید را برای محورها و دکمه‌هایی که پشتیبانی می‌کنند ثبت کنند. ثبت محورها یا کدهای کلید پشتیبانی‌نشده می‌تواند الگوریتم طبقه‌بندی دستگاه را گیج کند یا باعث شود سیستم به‌طور نادرست قابلیت‌های دستگاه را تشخیص دهد. برای مثال، اگر دستگاه کد کلید BTN_TOUCH را گزارش کند، سیستم فرض می‌کند که BTN_TOUCH همیشه برای نشان دادن اینکه آیا ابزار صفحه‌نمایش را لمس می‌کند یا نه استفاده می‌شود. بنابراین، نباید از BTN_TOUCH برای نشان دادن اینکه ابزار صرفاً در محدوده است و نگه داشته شده است استفاده شود.
  • دستگاه‌های تک‌لمسی از رویدادهای ورودی Linux زیر استفاده می‌کنند:
    • ABS_X: (الزامی) مختصات X ابزار را گزارش می‌کند.
    • ABS_Y: (الزامی) مختصات Y ابزار را گزارش می‌کند.
    • ABS_PRESSURE: (اختیاری) فشار فیزیکی اعمال‌شده به نوک ابزار یا قدرت سیگنال تماس لمسی را گزارش می‌کند.
    • ‫ABS_TOOL_WIDTH: (اختیاری) مساحت مقطع یا عرض تماس لمسی یا خود ابزار را گزارش می‌کند.
    • ABS_DISTANCE: (اختیاری) فاصله ابزار از سطح دستگاه لمسی را گزارش می‌کند.
    • ‫ABS_TILT_X: (اختیاری) شیب ابزار را از سطح دستگاه لمسی در امتداد محور X گزارش می‌کند.
    • ABS_TILT_Y: (اختیاری) شیب ابزار را از سطح دستگاه لمسی در امتداد محور Y گزارش می‌کند.
    • BTN_TOUCH: (الزامی) نشان می‌دهد که آیا ابزار دستگاه را لمس می‌کند یا نه.
    • BTN_LEFT، BTN_RIGHT، BTN_MIDDLE، BTN_BACK، BTN_SIDE، BTN_FORWARD، BTN_EXTRA، BTN_STYLUS، BTN_STYLUS2: (اختیاری) وضعیت دکمه را گزارش می‌کند.
    • BTN_TOOL_FINGER، BTN_TOOL_PEN، BTN_TOOL_RUBBER، BTN_TOOL_BRUSH، BTN_TOOL_PENCIL، BTN_TOOL_AIRBRUSH، BTN_TOOL_MOUSE، BTN_TOOL_LENS، BTN_TOOL_DOUBLETAP، BTN_TOOL_TRIPLETAP، BTN_TOOL_QUADTAP: (اختیاری) نوع ابزار را گزارش می‌کند.
  • دستگاه‌های چندلمسی از رویدادهای ورودی Linux زیر استفاده می‌کنند:
    • ABS_MT_POSITION_X: (الزامی) مختصات X ابزار را گزارش می‌کند.
    • ABS_MT_POSITION_Y: (الزامی) مختصات Y ابزار را گزارش می‌کند.
    • ABS_MT_PRESSURE: (اختیاری) فشار فیزیکی اعمال‌شده به نوک ابزار یا قدرت سیگنال تماس لمسی را گزارش می‌کند.
    • ‫ABS_MT_TOUCH_MAJOR: (اختیاری) مساحت سطح مقطع تماس لمسی یا طول بُعد بلندتر تماس لمسی را گزارش می‌کند.
    • ABS_MT_TOUCH_MINOR: (اختیاری) طول بعد کوتاه‌تر تماس لمسی را گزارش می‌کند. اگر ABS_MT_TOUCH_MAJOR اندازه‌گیری مساحت را گزارش می‌کند، نباید از این محور استفاده شود.
    • ABS_MT_WIDTH_MAJOR: (اختیاری) مساحت سطح مقطع خود ابزار یا طول بعد بلندتر خود ابزار را گزارش می‌کند. از این محور استفاده نکنید مگر اینکه ابعاد خود ابزار را بدانید.
    • ABS_MT_WIDTH_MINOR: (اختیاری) طول بعد کوتاه‌تر خود ابزار را گزارش می‌کند. اگر ABS_MT_WIDTH_MAJOR اندازه‌گیری مساحت را گزارش می‌کند یا اگر ابعاد خود ابزار نامشخص است، نباید از این محور استفاده شود.
    • ABS_MT_ORIENTATION: (اختیاری) جهت ابزار را گزارش می‌کند.
    • ABS_MT_DISTANCE: (اختیاری) فاصله ابزار را از سطح دستگاه لمسی گزارش می‌کند.
    • ‫ABS_MT_TOOL_TYPE: (اختیاری) نوع ابزار را به‌صورت MT_TOOL_FINGER یا MT_TOOL_PEN گزارش می‌کند.
    • ABS_MT_TRACKING_ID: (اختیاری) شناسه ردیابی ابزار را گزارش می‌کند. شناسه ردیابی یک عدد صحیح غیرمنفی اختیاری است که برای شناسایی و ردیابی مستقل هر ابزار در زمانی که چندین ابزار فعال هستند استفاده می‌شود. برای مثال، وقتی چند انگشت دستگاه را لمس می‌کند، باید به هر انگشت شناسه ردیابی متمایزی اختصاص داده شود که تا زمانی که انگشت در تماس است استفاده شود. وقتی ابزارهای مرتبط با شناسه‌های ردیابی از محدوده خارج شوند، می‌توان از این شناسه‌ها دوباره استفاده کرد.
    • ABS_MT_SLOT: (اختیاری) شناسه جایگاه ابزار را هنگام استفاده از پروتکل چندلمسی Linux «ب» گزارش می‌کند. برای جزئیات بیشتر، به مستندات پروتکل چندلمسی Linux مراجعه کنید.
    • BTN_TOUCH: (الزامی) نشان می‌دهد که آیا ابزار دستگاه را لمس می‌کند یا نه.
    • BTN_LEFT، BTN_RIGHT، BTN_MIDDLE، BTN_BACK، BTN_SIDE، BTN_FORWARD، BTN_EXTRA، BTN_STYLUS، BTN_STYLUS2: (اختیاری) وضعیت دکمه را گزارش می‌کند.
    • BTN_TOOL_FINGER، BTN_TOOL_PEN، BTN_TOOL_RUBBER، BTN_TOOL_BRUSH، BTN_TOOL_PENCIL، BTN_TOOL_AIRBRUSH، BTN_TOOL_MOUSE، BTN_TOOL_LENS، BTN_TOOL_DOUBLETAP، BTN_TOOL_TRIPLETAP، BTN_TOOL_QUADTAP: (اختیاری) نوع ابزار را گزارش می‌کند.
  • اگر محورها برای هر دو پروتکل تک‌لمسی و چندلمسی تعریف شده باشند، فقط محورهای چندلمسی استفاده می‌شوند و محورهای تک‌لمسی نادیده گرفته می‌شوند.
  • حداقل و حداکثر مقادیر محورهای ABS_X، ABS_Y، ABS_MT_POSITION_X، و ABS_MT_POSITION_Y حدود ناحیه فعال دستگاه را در واحدهای سطح مختص دستگاه تعریف می‌کنند. درمورد صفحه لمسی، ناحیه فعال بخشی از دستگاه لمسی را توصیف می‌کند که درواقع نمایشگر را پوشش می‌دهد.

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

        displayX = (x - minX) * displayWidth / (maxX - minX + 1)
        displayY = (y - minY) * displayHeight / (maxY - minY + 1)
        

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

    لمس‌هایی که خارج از ناحیه فعال شروع می‌شوند به برنامه‌ها ارسال نمی‌شوند اما می‌توان از آن‌ها برای کلیدهای مجازی استفاده کرد.

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

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

    برای مثال، اگر انگشت کاربر نزدیک گوشه بالا سمت چپ صفحه لمسی را لمس کند، ممکن است مختصات (minX, minY) را گزارش کند. اگر انگشت همچنان به حرکت بیشتر در خارج از ناحیه فعال ادامه دهد، صفحه لمسی باید یا شروع به گزارش مختصات با مؤلفه‌های کمتر از minX و minY کند، مانند (minX - 2, minY - 3)، یا باید گزارش لمس را به‌طور کامل متوقف کند. به عبارت دیگر، وقتی انگشت کاربر واقعاً خارج از ناحیه فعال را لمس می‌کند، صفحه لمسی نباید (minX, minY) را گزارش کند.

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

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

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

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

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

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

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

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

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

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

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

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

  • ابزار براساس شرایط زیر فعال درنظر گرفته می‌شود:

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

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

    • هنگام استفاده از پروتکل چندلمسی «A»، هرگاه ابزار در جدیدترین گزارش همگام‌سازی ظاهر شود، فعال است. وقتی ابزار دیگر در گزارش‌های همگام‌سازی نشان داده نشود، دیگر وجود ندارد.
    • هنگام استفاده از پروتکل چندلمسی «B»، ابزار تا زمانی فعال است که شکاف فعال داشته باشد. وقتی جایگاه پاک شود، ابزار دیگر وجود نخواهد داشت.
  • ابزار براساس شرایط زیر درحال نگه داشتن تشخیص داده می‌شود:
    • اگر ابزار BTN_TOOL_MOUSE یا BTN_TOOL_LENS باشد، ابزار شناور نیست، حتی اگر یکی از شرایط زیر درست باشد.
    • اگر ابزار فعال باشد و درایور اطلاعات فشار را گزارش کند، و فشار گزارش‌شده صفر باشد، ابزار درحال شناور ماندن است.
    • اگر ابزار فعال باشد و درایور از کد کلید BTN_TOUCH پشتیبانی کند و BTN_TOUCH مقدار صفر داشته باشد، ابزار درحال نگه داشتن است.
  • InputReader از هر دو پروتکل چندلمسی «A» و «B» پشتیبانی می‌کند. درایورهای جدید باید از پروتکل «B» استفاده کنند اما هر دو کار می‌کند.
  • از Android 4.0، ممکن است لازم باشد درایورهای صفحه لمسی تغییر کنند تا با مشخصات پروتکل ورودی Linux مطابقت داشته باشند.

    ممکن است تغییرات زیر لازم باشد:

    • وقتی ابزاری غیرفعال می‌شود (انگشت «بالا» می‌رود)، باید دیگر در گزارش‌های همگام‌سازی چندلمسی بعدی نشان داده نشود. وقتی همه ابزارها غیرفعال می‌شوند (همه انگشتان «بالا» می‌روند)، درایور باید یک بسته گزارش همگام‌سازی خالی ارسال کند، مانند SYN_MT_REPORT و سپس SYN_REPORT.

      نسخه‌های قبلی Android انتظار داشتند رویدادهای «بالا» با ارسال مقدار فشار ۰ گزارش شوند. رفتار قدیمی با مشخصات پروتکل ورودی Linux ناسازگار بود و دیگر پشتیبانی نمی‌شود.

    • اطلاعات فشار فیزیکی یا قدرت سیگنال باید بااستفاده از ABS_MT_PRESSURE گزارش شود.

      نسخه‌های قبلی Android اطلاعات فشار را از ABS_MT_TOUCH_MAJOR بازیابی می‌کردند. رفتار قدیمی با مشخصات پروتکل ورودی Linux ناسازگار بود و دیگر پشتیبانی نمی‌شود.

    • اطلاعات اندازه لمس باید بااستفاده از ABS_MT_TOUCH_MAJOR گزارش شود.

      نسخه‌های قبلی Android اطلاعات اندازه را از ABS_MT_TOOL_MAJOR بازیابی می‌کردند. رفتار قدیمی با مشخصات پروتکل ورودی Linux ناسازگار بود و دیگر پشتیبانی نمی‌شود.

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

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

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

  1. EventHub رویدادهای خام را از درایور evdev می‌خواند.
  2. InputReader رویدادهای خام را مصرف می‌کند و وضعیت داخلی را درباره موقعیت و سایر ویژگی‌های هر ابزار به‌روز می‌کند. همچنین وضعیت دکمه‌ها را ردیابی می‌کند.
  3. اگر عقب یا جلو فشار داده یا رها شده باشد، 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، یا ۰ اگر دردسترس نباشد.
raw.touchMinor
مقدار محور ABS_MT_TOUCH_MINOR، یا raw.touchMajor اگر دردسترس نباشد.
raw.toolMajor
مقدار محور ABS_TOOL_WIDTH یا ABS_MT_WIDTH_MAJOR، یا ۰ اگر دردسترس نباشد.
raw.toolMinor
مقدار محور ABS_MT_WIDTH_MINOR، یا raw.toolMajor اگر دردسترس نباشد.
raw.orientation
مقدار محور ABS_MT_ORIENTATION، یا ۰ اگر دردسترس نباشد.
raw.distance
مقدار محور ABS_DISTANCE یا ABS_MT_DISTANCE، یا 0 اگر دردسترس نباشد.
raw.tiltX
مقدار محور ABS_TILT_X، یا ۰ اگر دردسترس نباشد.
raw.tiltY
مقدار محور ABS_TILT_Y، یا ۰ اگر دردسترس نباشد.

محدوده‌های محور خام

عبارت‌های زیر نشان‌دهنده حدود مقادیر خام هستند. این مقادیر با فراخوانی EVIOCGABS ioctl برای هر محور به‌دست می‌آیند.

raw.*.min
حداقل مقدار فراگیر محور خام.
raw.*.max
حداکثر مقدار فراگیر محور خام.
raw.*.range
معادل raw.*.max - raw.*.min.
raw.*.fuzz
دقت محور خام. برای مثال، fuzz = 1 یعنی مقادیر با دقت +/- ۱ واحد هستند.
raw.width
عرض فراگیر ناحیه لمس، معادل raw.x.range + 1.
raw.height
ارتفاع فراگیر ناحیه لمس، معادل raw.y.range + 1.

محدوده‌های برونداد

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

output.width
عرض برونداد. برای صفحه‌های لمسی (مرتبط با نمایشگر)، این عرض نمایشگر برحسب پیکسل است. برای صفحه‌های لمسی (که با نمایشگر مرتبط نیستند)، عرض خروجی برابر با raw.width است، که نشان می‌دهد هیچ درونیابی‌ای انجام نشده است.
output.height
ارتفاع برونداد. برای صفحه‌های لمسی (مرتبط با نمایشگر)، این ارتفاع نمایشگر به پیکسل است. برای پدهای لمسی (که با نمایشگر مرتبط نیستند)، ارتفاع خروجی برابر با raw.height است، که نشان می‌دهد هیچ درونیابی‌ای انجام نشده است.
output.diag
طول قطری سیستم مختصات خروجی، معادل sqrt(output.width ^2 + output.height ^2).

پیکربندی پایه

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

touch.deviceType

تعریف: touch.deviceType = touchScreen | touchPad | pointer | default

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

  • اگر مقدار touchScreen باشد، دستگاه لمسی یک صفحه لمسی مرتبط با نمایشگر است.

  • اگر مقدار touchPad باشد، دستگاه لمسی یک صفحه لمسی است که با نمایشگر مرتبط نیست.

  • اگر مقدار pointer باشد، دستگاه لمسی یک پد لمسی است که با نمایشگر مرتبط نیست و از حرکات آن برای اشاره‌های چندلمسی غیرمستقیم اشاره‌گر استفاده می‌شود.

  • اگر مقدار default باشد، سیستم به‌طور خودکار نوع دستگاه را براساس الگوریتم طبقه‌بندی تشخیص می‌دهد.

برای جزئیات بیشتر درباره اینکه نوع دستگاه چگونه بر رفتار دستگاه لمسی تأثیر می‌گذارد، به بخش طبقه‌بندی مراجعه کنید.

در Android 3 و نسخه‌های پایین‌تر، فرض بر این بود که همه دستگاه‌های لمسی صفحه‌نمایش لمسی هستند.

touch.orientationAware

تعریف: touch.orientationAware = 0 | 1

مشخص می‌کند که آیا دستگاه لمسی باید به تغییرات جهت نمایشگر واکنش نشان دهد یا نه.

  • اگر مقدار 1 باشد، هرگاه جهت نمایشگر تغییر کند، موقعیت‌های لمس گزارش‌شده توسط دستگاه لمسی چرخانده می‌شود.

  • اگر مقدار 0 باشد، موقعیت‌های لمسی گزارش‌شده توسط دستگاه لمسی دربرابر تغییرات جهت نمایشگر مصون هستند.

اگر دستگاه صفحه لمسی باشد، مقدار پیش‌فرض 1 است، درغیراین‌صورت 0 است.

سیستم بین صفحه‌نمایش‌ها و نمایشگرهای لمسی داخلی و خارجی تمایز قائل می‌شود. صفحه لمسی داخلی حساس به جهت براساس جهت نمایشگر داخلی می‌چرخد. صفحه لمسی خارجی حساس به جهت براساس جهت نمایشگر خارجی چرخانده می‌شود.

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

پیش‌از Honeycomb، فرض بر این بود که همه دستگاه‌های لمسی از جهت‌گیری آگاه هستند.

touch.gestureMode

تعریف: touch.gestureMode = pointer | spots | default

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

  • اگر مقدار pointer باشد، اشاره‌های صفحه لمسی به‌صورت مکان‌نمایی شبیه به اشاره‌گر موشواره ارائه می‌شود.

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

مقدار پیش‌فرض pointer است وقتی ویژگی ورودی INPUT_PROP_SEMI_MT تنظیم شده باشد، درغیراین‌صورت spots است.

فیلدهای X و Y

فیلدهای X و Y اطلاعات موقعیتی را برای مرکز ناحیه تماس ارائه می‌دهند.

محاسبه

محاسبه ساده است: اطلاعات موقعیتی از درایور لمسی به‌صورت خطی به سیستم مختصات خروجی درون‌یابی می‌شود.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

فیلدهای touchMajor،‏ touchMinor،‏ toolMajor،‏ toolMinor،‏ size

فیلدهای touchMajor و touchMinor ابعاد تقریبی ناحیه تماس را در واحدهای خروجی (پیکسل) توصیف می‌کنند.

فیلدهای toolMajor و toolMinor ابعاد تقریبی خود ابزار را در واحدهای برونداد (پیکسل) توصیف می‌کنند.

فیلد size اندازه نرمال‌شده لمس را نسبت به بزرگ‌ترین لمس ممکن که دستگاه لمسی می‌تواند حس کند توصیف می‌کند. کوچک‌ترین اندازه نرمال‌شده ممکن ۰٫۰ است (بدون تماس، یا غیرقابل اندازه‌گیری)، و بزرگ‌ترین اندازه نرمال‌شده ممکن ۱٫۰ است (ناحیه حسگر اشباع شده است).

وقتی هم طول و هم عرض تقریبی قابل‌اندازه‌گیری باشد، فیلد touchMajor بُعد بلندتر و فیلد touchMinor بُعد کوتاه‌تر ناحیه تماس را مشخص می‌کند. وقتی فقط قطر تقریبی ناحیه تماس قابل‌اندازه‌گیری باشد، فیلدهای touchMajor و touchMinor برابر هستند.

به‌همین ترتیب، فیلد toolMajor بُعد بلندتر و فیلد toolMinor بُعد کوتاه‌تر مساحت مقطع ابزار را مشخص می‌کند.

اگر اندازه لمس دردسترس نباشد اما اندازه ابزار دردسترس باشد، اندازه ابزار برابر با اندازه لمس تنظیم می‌شود. برعکس، اگر اندازه ابزار دردسترس نباشد اما اندازه لمس دردسترس باشد، اندازه لمس برابر با اندازه ابزار تنظیم می‌شود.

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

<touch.size.calibration< h4=""></touch.size.calibration<>

تعریف: touch.size.calibration = none | geometric | diameter | area | default

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

  • اگر مقدار none باشد، اندازه روی صفر تنظیم می‌شود.

  • اگر مقدار geometric باشد، فرض می‌شود که اندازه در همان واحدهای سطحی موقعیت مشخص شده است، بنابراین به همان شیوه مقیاس‌بندی می‌شود.

  • اگر مقدار diameter باشد، فرض می‌شود اندازه متناسب با قطر (عرض) لمس یا ابزار است.

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

  • اگر مقدار default باشد، سیستم از واسنجی geometric استفاده می‌کند اگر محور raw.touchMajor یا raw.toolMajor دردسترس باشد، درغیراین‌صورت از واسنجی none استفاده می‌کند.

touch.size.scale

تعریف: touch.size.scale = <عدد ممیز شناور غیرمنفی>

ضریب مقیاس ثابتی را که در واسنجی استفاده می‌شود مشخص می‌کند.

مقدار پیش‌فرض 1.0 است.

touch.size.bias

تعریف: touch.size.bias = <عدد ممیز شناور غیرمنفی>

مقدار سوگیری ثابتی را که در واسنجی استفاده می‌شود مشخص می‌کند.

مقدار پیش‌فرض 0.0 است.

touch.size.isSummed

تعریف: touch.size.isSummed = 0 | 1

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

  • اگر مقدار 1 باشد، اندازه گزارش‌شده قبل‌از استفاده بر تعداد مخاطبین تقسیم می‌شود.

  • اگر مقدار 0 باشد، اندازه گزارش‌شده همان‌طور که هست استفاده می‌شود.

مقدار پیش‌فرض 0 است.

برخی‌از دستگاه‌های لمسی، به‌ویژه دستگاه‌های «Semi-MT»، نمی‌توانند ابعاد مجزای چند نقطه تماس را تشخیص دهند، بنابراین اندازه‌ای را گزارش می‌کنند که نشان‌دهنده کل مساحت یا عرض آن‌ها است. این ویژگی فقط باید برای چنین دستگاه‌هایی روی 1 تنظیم شود. اگر شک دارید، این مقدار را روی 0 تنظیم کنید.

محاسبه

محاسبه فیلدهای touchMajor،‏ touchMinor،‏ toolMajor،‏ toolMinor،‏ و size به پارامترهای واسنجی مشخص‌شده بستگی دارد.

If raw.touchMajor and raw.toolMajor are available:
    touchMajor = raw.touchMajor
    touchMinor = raw.touchMinor
    toolMajor = raw.toolMajor
    toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
    toolMajor = touchMajor = raw.touchMajor
    toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
    touchMajor = toolMajor = raw.toolMajor
    touchMinor = toolMinor = raw.toolMinor
Else
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
    touchMajor = touchMajor / numberOfActiveContacts
    touchMinor = touchMinor / numberOfActiveContacts
    toolMajor = toolMajor / numberOfActiveContacts
    toolMinor = toolMinor / numberOfActiveContacts
    size = size / numberOfActiveContacts
End If

If touch.size.calibration == "none":
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
Else If touch.size.calibration == "geometric":
    outputScale = average(output.width / raw.width, output.height / raw.height)
    touchMajor = touchMajor * outputScale
    touchMinor = touchMinor * outputScale
    toolMajor = toolMajor * outputScale
    toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
    touchMajor = sqrt(touchMajor)
    touchMinor = touchMajor
    toolMajor = sqrt(toolMajor)
    toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
    touchMinor = touchMajor
    toolMinor = toolMajor
End If

If touchMajor != 0:
    output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
    output.touchMajor = 0
End If

If touchMinor != 0:
    output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
    output.touchMinor = 0
End If

If toolMajor != 0:
    output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
    output.toolMajor = 0
End If

If toolMinor != 0:
    output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
    output.toolMinor = 0
End If

output.size = size

فیلد فشار

فیلد pressure فشار فیزیکی تقریبی اعمال‌شده به دستگاه لمسی را به‌عنوان مقداری نرمال‌شده بین ۰٫۰ (بدون لمس) و ۱٫۰ (فشار عادی) توصیف می‌کند.

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

touch.pressure.calibration

تعریف: touch.pressure.calibration = none | physical | amplitude | default

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

  • اگر مقدار none باشد، فشار نامشخص است، بنابراین هنگام لمس کردن روی ۱٫۰ و هنگام نگه داشتن روی ۰٫۰ تنظیم می‌شود.

  • اگر مقدار physical باشد، فرض می‌شود که محور فشار، شدت فیزیکی واقعی فشار اعمال‌شده به صفحه لمسی را اندازه‌گیری می‌کند.

  • اگر مقدار amplitude باشد، فرض می‌شود که محور فشار دامنه سیگنال را اندازه‌گیری می‌کند که با اندازه تماس و فشار اعمال‌شده مرتبط است.

  • اگر مقدار default باشد، سیستم از واسنجی physical استفاده می‌کند اگر محور فشار دردسترس باشد، درغیراین‌صورت از none استفاده می‌کند.

touch.pressure.scale

تعریف: touch.pressure.scale = <عدد ممیز شناور غیرمنفی>

ضریب مقیاس ثابتی را که در واسنجی استفاده می‌شود مشخص می‌کند.

مقدار پیش‌فرض 1.0 / raw.pressure.max است.

محاسبه

محاسبه فیلد pressure به پارامترهای واسنجی مشخص‌شده بستگی دارد.

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

فیلدهای جهت و شیب

فیلد orientation جهت لمس و ابزار را به‌عنوان اندازه‌گیری زاویه‌ای توصیف می‌کند. جهت 0 نشان می‌دهد که محور اصلی به‌صورت عمودی جهت‌گیری شده است، -PI/2 نشان می‌دهد که محور اصلی به‌سمت چپ جهت‌گیری شده است، PI/2 نشان می‌دهد که محور اصلی به‌سمت راست جهت‌گیری شده است. وقتی ابزار قلم وجود دارد، محدوده جهت را می‌توان در محدوده دایره کامل از -PI یا PI توصیف کرد.

فیلد tilt شیب ابزار را به‌عنوان اندازه‌گیری زاویه‌ای توصیف می‌کند. زاویه 0 نشان می‌دهد که ابزار بر سطح عمود است. شیب PI/2 نشان می‌دهد که ابزار به‌صورت صاف روی سطح قرار دارد.

touch.orientation.calibration

تعریف: touch.orientation.calibration = none | interpolated | vector | default

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

  • اگر مقدار none باشد، جهت نامشخص است، بنابراین روی ۰ تنظیم می‌شود.
  • اگر مقدار interpolated باشد، جهت به‌صورت خطی درون‌یابی می‌شود به‌طوری‌که مقدار خام raw.orientation.min به -PI/2 و مقدار خام raw.orientation.max به PI/2 نگاشت می‌شود. مقدار مرکزی (raw.orientation.min + raw.orientation.max) / 2 به 0 نگاشت می‌شود.
  • اگر مقدار vector باشد، جهت‌یابی به‌عنوان بردار فشرده متشکل از دو فیلد ۴ بیتی علامت‌دار تفسیر می‌شود. این نمایش در بخش‌های Atmel Object Based Protocol استفاده می‌شود. وقتی رمزگشایی می‌شود، بردار زاویه جهت‌یابی و مقدار اطمینان را ارائه می‌دهد. از مقدار اطمینان برای مقیاس‌بندی اطلاعات اندازه استفاده می‌شود، مگر اینکه هندسی باشد.
  • اگر مقدار default باشد، سیستم از واسنجی interpolated استفاده می‌کند اگر محور جهت‌یابی دردسترس باشد، درغیراین‌صورت از none استفاده می‌کند.

محاسبه

محاسبه فیلدهای orientation و tilt به پارامترهای واسنجی مشخص‌شده و ورودی دردسترس بستگی دارد.

If touch.tiltX and touch.tiltY are available:
    tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
    tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
    tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
    tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
    output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
    output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
    center = average(raw.orientation.min, raw.orientation.max)
    output.orientation = PI / (raw.orientation.max - raw.orientation.min)
    output.tilt = 0
Else If touch.orientation.calibration == "vector":
    c1 = (raw.orientation & 0xF0) >> 4
    c2 = raw.orientation & 0x0F

    If c1 != 0 or c2 != 0:
        If c1 >= 8 Then c1 = c1 - 16
        If c2 >= 8 Then c2 = c2 - 16
        angle = atan2(c1, c2) / 2
        confidence = sqrt(c1*c1 + c2*c2)

        output.orientation = angle

        If touch.size.calibration == "diameter" or "area":
            scale = 1.0 + confidence / 16
            output.touchMajor *= scale
            output.touchMinor /= scale
            output.toolMajor *= scale
            output.toolMinor /= scale
        End If
    Else
        output.orientation = 0
    End If
    output.tilt = 0
Else
    output.orientation = 0
    output.tilt = 0
End If

If orientation aware:
    If screen rotation is 90 degrees:
        output.orientation = output.orientation - PI / 2
    Else If screen rotation is 270 degrees:
        output.orientation = output.orientation + PI / 2
    End If
End If

فیلد فاصله

فیلد distance فاصله بین ابزار و سطح دستگاه لمسی را توصیف می‌کند. مقدار ۰٫۰ نشان‌دهنده تماس مستقیم است و مقادیر بزرگ‌تر نشان‌دهنده افزایش فاصله از سطح است.

touch.distance.calibration

تعریف: touch.distance.calibration = none | scaled | default

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

  • اگر مقدار none باشد، فاصله نامشخص است، بنابراین روی ۰ تنظیم می‌شود.

  • اگر مقدار scaled باشد، فاصله گزارش‌شده در یک ضریب مقیاس ثابت ضرب می‌شود.

  • اگر مقدار default باشد، سیستم از واسنجی scaled استفاده می‌کند اگر محور فاصله دردسترس باشد، درغیراین‌صورت از none استفاده می‌کند.

touch.distance.scale

تعریف: touch.distance.scale = <عدد ممیز شناور غیرمنفی>

ضریب مقیاس ثابتی را که در واسنجی استفاده می‌شود مشخص می‌کند.

مقدار پیش‌فرض 1.0 است.

محاسبه

محاسبه فیلد distance به پارامترهای واسنجی مشخص‌شده بستگی دارد.

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

مثال

# Input device configuration file for a touch screen that supports pressure,
# size and orientation. The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

نکاتی درباره سازگاری

ویژگی‌های پیکربندی برای دستگاه‌های لمسی در Android Ice Cream Sandwich 4.0 به‌طور قابل‌توجهی تغییر کرد. همه فایل‌های پیکربندی دستگاه ورودی برای دستگاه‌های لمسی باید به‌روزرسانی شوند تا از ویژگی‌های پیکربندی جدید استفاده کنند.

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

فایل‌های نقشه کلید مجازی

از دستگاه‌های لمسی می‌توان برای پیاده‌سازی کلیدهای مجازی استفاده کرد.

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

وقتی کلیدهای مجازی در نرم‌افزار پیاده‌سازی می‌شوند، هسته باید فایل نقشه کلید مجازی به‌نام virtualkeys.<devicename> را به‌عنوان ویژگی برد صادر کند. برای مثال، اگر درایورهای دستگاه صفحه لمسی نام خود را به‌صورت «touchyfeely» گزارش کنند، مسیر فایل نگاشت کلید مجازی باید /sys/board_properties/virtualkeys.touchyfeely باشد.

فایل نقشه کلید مجازی مختصات و کدهای کلید Linux کلیدهای مجازی را در صفحه لمسی شرح می‌دهد.

علاوه‌بر فایل نقشه کلید مجازی، باید فایل چیدمان کلید و فایل نقشه نویسه کلید متناظر وجود داشته باشد تا کدهای کلید Linux به کدهای کلید Android نگاشت شود و نوع دستگاه صفحه‌کلید (معمولاً SPECIAL_FUNCTION) مشخص شود.

نحو

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

خطوط نظر با «#» شروع می‌شوند و تا انتهای خط ادامه می‌یابند.

هر کلید مجازی با ۶ مؤلفه جداشده با دونقطه توصیف می‌شود:

  • ‫0x01: کد نسخه. همیشه باید 0x01 باشد.
  • <Linux key code>: کد کلید Linux برای کلید مجازی.
  • <centerX>: مختصات پیکسلی X مرکز کلید مجازی.
  • <centerY>: مختصات پیکسلی Y مرکز کلید مجازی.
  • <width>: عرض کلید مجازی به پیکسل.
  • <height>: ارتفاع کلید مجازی به پیکسل.

همه مختصات و اندازه‌ها براساس سیستم مختصات نمایشگر مشخص می‌شوند.

در اینجا یک فایل نگاشت کلید مجازی وجود دارد که همه در یک خط نوشته شده است.

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

یک فایل نگاشت کلید مجازی را می‌توان در چند خط نیز نوشت.

# One key per line
0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

در مثال بالا، صفحه لمسی وضوح ۴۸۰×۸۰۰ دارد. بنابراین، همه کلیدهای مجازی دارای مختصات <centerY> با مقدار ۸۳۵ هستند که کمی پایین‌تر از ناحیه قابل‌مشاهده صفحه‌نمایش لمسی است.

کلید اول دارای کد اسکن Linux‏ 158 (KEY_BACK)، مرکز X‏ 55، مرکز Y‏ 835، عرض 90، و ارتفاع 55 است.

مثال

فایل نگاشت کلید مجازی: /sys/board_properties/virtualkeys.touchyfeely.

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

فایل جانمایی کلید: /system/usr/keylayout/touchyfeely.kl.

key 158 BACK
key 139 MENU
key 172 HOME
key 217 SEARCH

فایل نگاشت نویسه کلید: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

اشاره‌های چندلمسی غیرمستقیم اشاره‌گر

در حالت اشاره‌گر، سیستم اشاره‌های زیر را تفسیر می‌کند:

  • تک‌ضرب با یک انگشت: کلیک.
  • حرکت یک انگشت: اشاره‌گر را حرکت می‌دهد.
  • حرکت یک انگشت به‌علاوه فشار دادن دکمه: اشاره‌گر را می‌کشد.
  • حرکت دو انگشت، هر دو انگشت در یک جهت حرکت می‌کنند: ناحیه زیر اشاره‌گر را در آن جهت بکشید. خود اشاره‌گر حرکت نمی‌کند.
  • حرکت دو انگشت، هر دو انگشت به‌سمت یکدیگر یا دور از هم در جهت‌های مختلف حرکت می‌کنند: حرکت افقی/ مقیاس‌بندی/ چرخاندن ناحیه اطراف اشاره‌گر. خود اشاره‌گر حرکت نمی‌کند.
  • حرکت چند انگشت: اشاره آزاد.

رد کردن لمس کف دست

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

مدل واقعی ۹۰ میلی‌ثانیه اول داده‌های اشاره، اشاره‌گر فعلی، و اشاره‌گرهای اطراف را بررسی می‌کند، سپس فاصله لمس‌ها را از لبه نمایشگر درنظر می‌گیرد. سپس، براساس هر اشاره‌گر، تعیین می‌کند کدام اشاره‌گرها کف دست هستند. همچنین اندازه هر مخاطب را، طبق گزارش touchMajor و touchMinor، درنظر می‌گیرد. سپس چارچوب Android اشاره‌گرهایی را که به‌عنوان کف دست علامت‌گذاری شده‌اند از جریان لمس برمی‌دارد.

اگر اشاره‌گر قبلاً به برنامه‌ها ارسال شده باشد، سیستم یکی از کارهای زیر را انجام می‌دهد:

  • (اگر اشاره‌گرهای فعال دیگری وجود داشته باشد) اشاره‌گر را با ACTION_POINTER_UP و FLAG_CANCELED تنظیم‌شده لغو می‌کند.
  • (اگر این تنها اشاره‌گر باشد) اشاره‌گر را با ACTION_CANCEL لغو می‌کند.

میانای برنامه‌سازی کاربردی عمومی، MotionEvent.FLAG_CANCELED، نشان می‌دهد که رویداد کنونی نباید کنش کاربر را راه‌اندازی کند. این پرچم برای هر دو ACTION_CANCEL و ACTION_POINTER_UP تنظیم شده است.

اگر اشاره‌گر کف دست به برنامه‌ها ارسال نشده باشد، سیستم به‌سادگی اشاره‌گر را رها می‌کند.

فعال کردن «رد کردن کف دست»

  1. در درایور لمسی، از ماکرو input_abs_set_res برای تنظیم وضوح فیلدهای زیر استفاده کنید (واحدها پیکسل در میلی‌متر است):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    پشتیبانی از ABS_MT_TOUCH_MINOR اختیاری است. بااین‌حال، اگر دستگاهتان از آن پشتیبانی می‌کند، مطمئن شوید وضوح به‌درستی تنظیم شده باشد.

  2. برای تأیید اینکه فیلدها به‌درستی تنظیم شده‌اند، این دستور را اجرا کنید:
        $ adb shell getevent -li
    
  3. برای فعال کردن این ویژگی درطول زمان اجرا، این دستور را اجرا کنید:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. فرایند system_server را بازراه‌اندازی کنید.
         $ adb shell stop && adb shell start
        
  5. تأیید کنید که 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: {}
    
  6. برای فعال کردن دائمی این ویژگی، فرمان sysprop مربوطه را در فایل init**rc خود اضافه کنید:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

مطالعه بیشتر