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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • اگر دارایی touch.deviceType تنظیم شده باشد، نوع دستگاه همان‌طور که نشان داده شده است تنظیم می‌شود.
  • اگر دستگاه ورودی حضور دارایی ورودی INPUT_PROP_DIRECT را گزارش کند (ازطریق 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 API، اغلب به ابزار اشاره‌گر گفته می‌شود.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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، یا ۰ اگر دردسترس نباشد.
raw.touchMajor
مقدار محور ABS_MT_TOUCH_MAJOR، یا ۰ اگر دردسترس نباشد.
raw.touchMinor
مقدار محور ABS_MT_TOUCH_MINOR، یا raw.touchMajor اگر دردسترس نباشد.
raw.toolMajor
مقدار محور ABS_TOOL_WIDTH یا ABS_MT_WIDTH_MAJOR، یا ۰ اگر دردسترس نباشد.
raw.toolMinor
مقدار محور ABS_MT_WIDTH_MINOR، یا raw.toolMajor اگر دردسترس نباشد.
raw.orientation
مقدار محور ABS_MT_ORIENTATION، یا ۰ اگر دردسترس نباشد.
raw.distance
مقدار محور ABS_DISTANCE یا ABS_MT_DISTANCE، یا 0 اگر دردسترس نباشد.
raw.tiltX
مقدار محور ABS_TILT_X، یا ۰ اگر دردسترس نباشد.
raw.tiltY
مقدار محور ABS_TILT_Y، یا 0 اگر دردسترس نباشد.

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

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

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

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

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

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

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

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

touch.deviceType

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

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

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

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

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

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

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

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

touch.orientationAware

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

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

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

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

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

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

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

قبل‌از Honeycomb، همه دستگاه‌های لمسی دارای جهت‌گیری درنظر گرفته می‌شدند.

touch.gestureMode

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

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

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

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

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

فیلدهای X و Y

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

محاسبه

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

touch.size.scale

تعریف: touch.size.scale = <a non-negative floating point number>

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

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

touch.size.bias

تعریف: touch.size.bias = <a non-negative floating point number>

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

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

touch.size.isSummed

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

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

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

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

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

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

محاسبه

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

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

size = avg(touchMajor, touchMinor)

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

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

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

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

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

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

output.size = size

فیلد فشار

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

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

touch.pressure.calibration

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

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

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

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

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

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

touch.pressure.scale

تعریف: touch.pressure.scale = <a non-negative floating point number>

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

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

محاسبه

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

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

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

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

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

touch.orientation.calibration

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

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

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

محاسبه

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

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

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

        output.orientation = angle

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

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

فیلد فاصله

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

touch.distance.calibration

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

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

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

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

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

touch.distance.scale

تعریف: touch.distance.scale = <a non-negative floating point number>

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

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

محاسبه

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

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

مثال

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

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

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

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

# Orientation
touch.orientation.calibration = vector

یادداشت‌های سازگاری

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

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

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

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

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

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

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

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

نحو

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

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

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

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

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

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

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

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

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

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

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

مثال

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

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

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

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

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

type SPECIAL_FUNCTION

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

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

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

عدم پذیرش کف دست

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

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

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

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

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

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

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

  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
    

مطالعه بیشتر