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

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

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

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

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

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

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

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

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

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

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

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

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

هنگامی که یک دستگاه ورودی به عنوان یک دستگاه لمسی طبقه بندی می شود، وجود کلیدهای مجازی با تلاش برای بارگذاری فایل نقشه کلید مجازی برای دستگاه تعیین می شود. اگر نقشه کلید مجازی موجود باشد، فایل طرح بندی کلید برای دستگاه نیز بارگیری می شود. برای اطلاعات در مورد مکان و قالب این فایل ها به [فایل های نقشه کلید مجازی] (#فایل-نقشه-کلید مجازی) مراجعه کنید.

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

همه دستگاه های لمسی داخلی باید فایل های پیکربندی دستگاه ورودی داشته باشند. اگر فایل پیکربندی دستگاه ورودی وجود نداشته باشد، سیستم یک پیکربندی پیش‌فرض را انتخاب می‌کند که برای لوازم جانبی لمسی همه منظوره مانند صفحه‌نمایش‌های لمسی USB یا بلوتوث 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 نگاشت شده است.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 نگاشت شده است.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 نباید برای نشان دادن اینکه ابزار صرفاً در محدوده قرار دارد و شناور است استفاده شود.
  • دستگاه های تک لمسی از رویدادهای ورودی لینوکس زیر استفاده می کنند:
    • 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_DOUBLETAP BTN_TOOL_LENS BTN_TOOL_TRIPLETAP ، BTN_TOOL_QUADTAP : (اختیاری) نوع ابزار را گزارش می‌کند.
  • دستگاه های چند لمسی از رویدادهای ورودی لینوکس زیر استفاده می کنند:
    • 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_DOUBLETAP BTN_TOOL_LENS 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 را به یک زاویه شیب عمودی از 0 تا PI / 2 رادیان و یک زاویه جهت گیری مسطح از -PI تا رادیان PI تبدیل می کند. این نمایش منجر به توصیف جهت گیری می شود که با آنچه برای توصیف لمس انگشت استفاده می شود سازگار است.

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

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

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

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

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

    • هنگام استفاده از پروتکل چند لمسی 'A'، ابزار هر زمان که در آخرین گزارش همگام سازی ظاهر شود فعال است. وقتی ابزار در گزارش‌های همگام‌سازی ظاهر نمی‌شود، دیگر وجود ندارد.
    • هنگام استفاده از پروتکل چند لمسی 'B'، ابزار تا زمانی فعال است که یک اسلات فعال داشته باشد. وقتی شکاف پاک شد، ابزار دیگر وجود ندارد.
  • یک ابزار بر اساس شرایط زیر معلق است:
    • اگر ابزار BTN_TOOL_MOUSE یا BTN_TOOL_LENS باشد، ابزار شناور نمی‌شود، حتی اگر یکی از شرایط زیر درست باشد.
    • اگر ابزار فعال باشد و راننده اطلاعات فشار را گزارش کند و فشار گزارش شده صفر باشد، ابزار در حالت شناور است.
    • اگر ابزار فعال است و درایور از کد کلید BTN_TOUCH پشتیبانی می کند و BTN_TOUCH دارای مقدار صفر است، ابزار در حالت شناور است.
  • InputReader از هر دو پروتکل چند لمسی "A" و "B" پشتیبانی می کند. درایورهای جدید باید از پروتکل "B" استفاده کنند اما هر کدام کار می کند.
  • از Android 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 ioctl برای هر محور به دست می آیند.

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 باشد، سیستم به‌طور خودکار نوع دستگاه را طبق الگوریتم طبقه‌بندی تشخیص می‌دهد.

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

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

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 تنظیم شده باشد، یا به شکل دیگری spots ، مقدار پیش‌فرض pointer است.

فیلدهای 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، اندازه

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

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

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

وقتی بتوان هم طول و هم عرض تقریبی را اندازه گرفت، فیلد 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 = <عدد ممیز شناور غیر منفی>

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

مقدار پیش فرض 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 ، فشار فیزیکی تقریبی اعمال شده به دستگاه لمسی را به صورت یک مقدار نرمال شده بین 0.0 (بدون لمس) و 1.0 (فشار عادی) توصیف می کند.

فشار صفر نشان می دهد که ابزار معلق است.

لمس.فشار.کالیبراسیون

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

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

  • اگر مقدار none نباشد، فشار ناشناخته است، بنابراین در هنگام لمس روی 1.0 و هنگام شناور کردن 0.0 تنظیم می شود.

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

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

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

لمس.فشار.مقیاس

تعریف: 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 نباشد ، جهت گیری ناشناخته است بنابراین روی 0 تنظیم می شود.
  • اگر مقدار interpolated شود ، جهت گیری به صورت خطی درون یابی می شود به گونه ای که یک مقدار خام از raw.orientation.min نقشه ها به -PI/2 و یک مقدار خام از raw.orientation.max to PI/2 . مقدار مرکز (raw.orientation.min + raw.orientation.max) / 2 تا 0 .
  • اگر مقدار vector باشد ، جهت گیری به عنوان یک بردار بسته بندی شده از دو قسمت 4 بیتی امضا شده تفسیر می شود. این نمایندگی در قطعات پروتکل مبتنی بر شیء Atmel استفاده می شود. هنگام رمزگشایی ، بردار زاویه جهت گیری و بزرگی اعتماد به نفس را به همراه دارد. از میزان اطمینان برای مقیاس اطلاعات اندازه استفاده می شود ، مگر اینکه هندسی باشد.
  • اگر مقدار 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 فاصله بین ابزار و سطح دستگاه لمسی را توصیف می کند. مقدار 0.0 نشانگر تماس مستقیم و مقادیر بزرگتر نشان دهنده افزایش فاصله از سطح است.

touch.distance.Calibration

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

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

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

  • اگر مقدار 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

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

خصوصیات پیکربندی دستگاه های لمسی در ساندویچ بستنی اندرویدی 4.0 به طور قابل توجهی تغییر کرد. تمام پرونده های پیکربندی دستگاه ورودی برای دستگاه های لمسی باید به روز شوند تا از خصوصیات پیکربندی جدید استفاده کنند.

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

پرونده های نقشه کلید مجازی

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

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

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

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

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

نحو

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

خطوط نظر با '#' شروع می شوند و به پایان خط ادامه می دهند.

هر کلید مجازی توسط 6 مؤلفه دفع روده بزرگ شرح داده شده است:

  • 0x01 : یک کد نسخه. همیشه باید 0x01 باشد.
  • <کد کلید لینوکس>: کد کلید لینوکس کلید مجازی.
  • <Centerx>: مختصات X پیکسل مرکز کلید مجازی.
  • <Centery>: مختصات پیکسل Y مرکز کلید مجازی.
  • <Width>: عرض کلید مجازی در پیکسل ها.
  • <Eight>: ارتفاع کلید مجازی در پیکسل ها.

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

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

# 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

در مثال بالا ، صفحه لمسی دارای وضوح 480x800 است. بر این اساس ، تمام کلیدهای مجازی دارای یک مختصات <centery> 835 هستند که کمی پایین تر از ناحیه قابل مشاهده صفحه لمسی است.

کلید اول دارای کد اسکن لینوکس از 158 ( KEY_BACK ) ، مرکز 55 ، مرکز 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

حرکات نشانگر چند لمسی غیرمستقیم

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

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

رد کف دست

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

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

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

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

یک API عمومی ، 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
    

در ادامه مطلب