اندروید از انواع صفحهنمایشهای لمسی و پدهای لمسی، از جمله تبلتهای دیجیتالیساز مبتنی بر قلم پشتیبانی میکند.
صفحههای لمسی دستگاههای لمسی هستند که با یک نمایشگر مرتبط هستند به طوری که کاربر این تصور را دارد که مستقیماً آیتمهای روی صفحه را دستکاری میکند.
پدهای لمسی دستگاه های لمسی هستند که با نمایشگر مرتبط نیستند، مانند تبلت دیجیتالیزر. پدهای لمسی معمولاً برای اشاره یا برای موقعیت یابی غیرمستقیم مطلق یا کنترل مبتنی بر ژست یک رابط کاربری استفاده می شود.
دستگاه های لمسی می توانند دکمه هایی داشته باشند که عملکرد آنها شبیه دکمه های ماوس است.
بسته به فناوری حسگر لمسی، گاهی اوقات میتوان دستگاههای لمسی را با استفاده از ابزارهای مختلف مانند انگشتان یا قلم دستکاری کرد.
گاهی اوقات از دستگاه های لمسی برای پیاده سازی کلیدهای مجازی استفاده می شود. به عنوان مثال، در برخی از دستگاههای اندرویدی، ناحیه حسگر صفحه لمسی فراتر از لبه نمایشگر گسترش مییابد و به عنوان بخشی از صفحه کلید حساس به لمس، کارکرد دوگانه را دارد.
با توجه به تنوع زیاد دستگاه های لمسی، اندروید برای توصیف ویژگی ها و رفتار دلخواه هر دستگاه به تعداد زیادی ویژگی پیکربندی متکی است.
طبقه بندی دستگاه های لمسی
اگر هر دو شرایط زیر برقرار باشد، یک دستگاه ورودی به عنوان یک دستگاه چند لمسی طبقه بندی می شود:
- دستگاه ورودی وجود محورهای مطلق
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_LENS
،BTN_TOOL_DOUBLETAP
، ،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_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 را به یک زاویه شیب عمودی از 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
بازیابی میکردند. رفتار قدیمی با مشخصات پروتکل ورودی لینوکس ناسازگار بود و دیگر پشتیبانی نمی شود.
عملکرد دستگاه لمسی
در زیر خلاصه ای از عملکرد دستگاه لمسی در اندروید ارائه شده است.
-
EventHub
رویدادهای خام را از درایورevdev
می خواند. -
InputReader
رویدادهای خام را مصرف می کند و وضعیت داخلی را در مورد موقعیت و سایر ویژگی های هر ابزار به روز می کند. همچنین وضعیت دکمه ها را ردیابی می کند. - اگر BACK یا FORWARD فشار داده شد یا آزاد شد،
InputReader
بهInputDispatcher
در مورد رویداد کلیدی اطلاع می دهد. -
InputReader
تعیین می کند که آیا فشار کلید مجازی رخ داده است یا خیر. اگر چنین است،InputDispatcher
در مورد رویداد کلیدی مطلع می کند. -
InputReader
تعیین می کند که آیا لمس در محدوده نمایشگر شروع شده است یا خیر. اگر چنین است،InputDispatcher
در مورد رویداد لمسی مطلع می کند. - اگر هیچ ابزار لمسی وجود نداشته باشد اما حداقل یک ابزار شناور وجود داشته باشد،
InputReader
بهInputDispatcher
در مورد رویداد شناور اطلاع می دهد. - اگر نوع دستگاه لمسی اشاره گر باشد،
InputReader
تشخیص اشاره اشاره گر را انجام می دهد، نشانگر و نقاط را بر اساس آن حرکت می دهد وInputDispatcher
در مورد رویداد اشاره گر مطلع می کند. -
InputDispatcher
ازWindowManagerPolicy
برای تعیین اینکه آیا رویدادها باید ارسال شوند و اینکه آیا آنها باید دستگاه را بیدار کنند استفاده می کند. سپس،InputDispatcher
رویدادها را به برنامه های مناسب تحویل می دهد.
پیکربندی دستگاه را لمس کنید
رفتار دستگاه لمسی توسط محورها، دکمهها، ویژگیهای ورودی، پیکربندی دستگاه ورودی، نقشه کلید مجازی و چیدمان کلید تعیین میشود.
برای جزئیات بیشتر در مورد فایل هایی که در پیکربندی صفحه کلید شرکت می کنند به بخش های زیر مراجعه کنید:
خواص
این سیستم برای پیکربندی و کالیبره کردن رفتار دستگاه لمسی به بسیاری از ویژگیهای پیکربندی دستگاه ورودی متکی است.
یکی از دلایل این امر این است که درایورهای دستگاه برای دستگاه های لمسی اغلب ویژگی های لمس را با استفاده از واحدهای خاص دستگاه گزارش می دهند.
به عنوان مثال، بسیاری از دستگاه های لمسی، ناحیه تماس لمسی را با استفاده از مقیاس داخلی مخصوص دستگاه اندازه گیری می کنند، مانند تعداد کل گره های حسگر که با لمس ایجاد شده اند. این مقدار اندازه خام برای برنامهها معنیدار نیست، زیرا آنها باید در مورد اندازه فیزیکی و سایر ویژگیهای گرههای حسگر دستگاه لمسی بدانند.
این سیستم از پارامترهای کالیبراسیون کدگذاری شده در فایل های پیکربندی دستگاه ورودی برای رمزگشایی، تبدیل و عادی سازی مقادیر گزارش شده توسط دستگاه لمسی به یک نمایش استاندارد ساده تر که برنامه ها می توانند آن را درک کنند، استفاده می کند.
کنوانسیون های مستندسازی
برای اهداف مستندسازی، ما از قراردادهای زیر برای توصیف مقادیر استفاده شده توسط سیستم در طول فرآیند کالیبراسیون استفاده میکنیم.
مقادیر محور خام
عبارات زیر مقادیر خام گزارش شده توسط درایور دستگاه لمسی را به عنوان رویدادهای EV_ABS
نشان می دهد.
-
raw.x
- مقدار محور
ABS_X
یاABS_MT_POSITION_X
. -
raw.y
- مقدار محور
ABS_Y
یاABS_MT_POSITION_Y
. -
raw.pressure
- مقدار محور
ABS_PRESSURE
یاABS_MT_PRESSURE
یا 0 در صورت موجود نبودن. -
raw.touchMajor
- مقدار محور
ABS_MT_TOUCH_MAJOR
یا 0 اگر در دسترس نباشد. -
raw.touchMinor
- مقدار محور
ABS_MT_TOUCH_MINOR
یاraw.touchMajor
اگر در دسترس نباشد. -
raw.toolMajor
- مقدار محور
ABS_TOOL_WIDTH
یاABS_MT_WIDTH_MAJOR
یا 0 اگر در دسترس نباشد. -
raw.toolMinor
- مقدار محور
ABS_MT_WIDTH_MINOR
یاraw.toolMajor
اگر در دسترس نباشد. -
raw.orientation
- مقدار محور
ABS_MT_ORIENTATION
یا 0 اگر در دسترس نباشد. -
raw.distance
- مقدار محور
ABS_DISTANCE
یاABS_MT_DISTANCE
یا 0 در صورت موجود نبودن. -
raw.tiltX
- مقدار محور
ABS_TILT_X
یا 0 اگر در دسترس نباشد. -
raw.tiltY
- مقدار محور
ABS_TILT_Y
یا 0 اگر در دسترس نباشد.
محدوده های محور خام
عبارات زیر مرزهای مقادیر خام را نشان می دهد. آنها با فراخوانی EVIOCGABS
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
به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
= none
| scaled
| default
نوع اندازه گیری مورد استفاده توسط راننده لمسی برای گزارش مسافت را مشخص می کند.
اگر مقدار
none
باشد، فاصله ناشناخته است، بنابراین روی 0 تنظیم می شود.اگر مقدار
scaled
باشد، فاصله گزارش شده در یک ضریب مقیاس ثابت ضرب می شود.اگر مقدار
default
باشد، اگر محور فاصله موجود باشد، سیستم از کالیبراسیونscaled
استفاده میکند، در غیر این صورت ازnone
استفاده نمیکند.
لمس.فاصله.مقیاس
تعریف: 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
را داشته باشد.
یک فایل نقشه کلید مجازی مختصات و کدهای کلید لینوکس کلیدهای مجازی را در صفحه لمسی توصیف می کند.
علاوه بر فایل نقشه کلید مجازی، باید یک فایل چیدمان کلید و فایل نقشه کاراکترهای کلیدی مربوطه وجود داشته باشد تا کدهای کلید لینوکس را به کدهای کلید اندروید نگاشت و نوع دستگاه صفحه کلید را مشخص کند (معمولا SPECIAL_FUNCTION
).
نحو
فایل نقشه کلید مجازی یک فایل متنی ساده است که از توالی توضیحات چیدمان کلید مجازی تشکیل شده است که با خطوط جدید یا دو نقطه از هم جدا شده اند.
خطوط نظر با "#" شروع می شود و تا انتهای خط ادامه می یابد.
هر کلید مجازی با 6 مولفه جدا شده با کولون توصیف می شود:
-
0x01
: یک کد نسخه. همیشه باید0x01
باشد. - <کد کلید لینوکس>: کد کلید لینوکس کلید مجازی.
- <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
در مثال بالا، صفحه نمایش لمسی دارای وضوح 480x800 است. بر این اساس، همه کلیدهای مجازی دارای مختصات <centerY> 835 هستند که کمی زیر ناحیه قابل مشاهده صفحه لمسی است.
کلید اول دارای کد اسکن لینوکس 158
( KEY_BACK
)، centerX 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
حرکات اشاره گر چند لمسی غیر مستقیم
در حالت اشاره گر، سیستم حرکات زیر را تفسیر می کند:
- ضربه زدن با یک انگشت: کلیک کنید.
- حرکت تک انگشتی: نشانگر را حرکت دهید.
- فشار دادن دکمه به اضافه حرکت تک انگشتی: نشانگر را بکشید.
- حرکت دو انگشت هر دو انگشت در یک جهت: ناحیه زیر نشانگر را در آن جهت بکشید. خود اشاره گر حرکت نمی کند.
- حرکت دو انگشت هر دو انگشت به سمت یکدیگر یا در جهات مختلف از هم دور می شوند: ناحیه اطراف نشانگر را حرکت دهید/مقیاس کنید/ بچرخانید. خود اشاره گر حرکت نمی کند.
- حرکت چند انگشتی: حرکت آزاد.
رد کف دست
از اندروید 13، وقتی چارچوب داخلی فعال باشد، سیستم میتواند بهطور خودکار ورودیهای کف دست را رد کند. راهحلهای داخلی، سفارشیسازی شده هنوز پشتیبانی میشوند، اگرچه ممکن است نیاز به اصلاح داشته باشند تا هنگام شناسایی کف دست، پرچم TOOL_TYPE_PALM
را برگرداند. چارچوب داخلی نیز در ارتباط با راه حل های سفارشی کار می کند.
مدل واقعی به اولین 90 میلیثانیه دادههای حرکتی، اشارهگر فعلی و نشانگرهای اطراف نگاه میکند، سپس میزان فاصله لمسها از لبه نمایشگر را در نظر میگیرد. سپس بر اساس هر اشاره گر تعیین می کند که کدام یک از اشاره گرها کف دست هستند. همانطور که توسط touchMajor
و touchMinor
گزارش شده است، اندازه هر مخاطب را نیز در نظر می گیرد. سپس چارچوب Android نشانگرهایی را که به عنوان کف دست علامت گذاری شده اند از جریان لمسی حذف می کند.
اگر یک اشاره گر قبلاً به برنامه ها ارسال شده است، سیستم یکی از موارد زیر است:
- (اگر نشانگرهای فعال دیگری وجود دارد) نشانگر را با تنظیم
ACTION_POINTER_UP
وFLAG_CANCELED
لغو میکند. - (اگر این تنها نشانگر باشد) نشانگر را با
ACTION_CANCEL
لغو می کند.
یک API عمومی، MotionEvent.FLAG_CANCELED
، نشان میدهد که رویداد فعلی نباید اقدام کاربر را آغاز کند. این پرچم برای ACTION_CANCEL
و ACTION_POINTER_UP
تنظیم شده است.
اگر نشانگر کف دست به برنامه ها ارسال نشد، سیستم به سادگی نشانگر را رها می کند.
رد کف دست را فعال کنید
- در درایور لمسی خود، از ماکرو
input_abs_set_res
برای تنظیم رزولوشن فیلدهای زیر استفاده کنید (واحدها پیکسل در هر میلی متر هستند):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
پشتیبانی از
ABS_MT_TOUCH_MINOR
اختیاری است. با این حال، اگر دستگاه شما از آن پشتیبانی می کند، مطمئن شوید که وضوح به درستی تنظیم شده است. -
- برای تأیید اینکه فیلدها به درستی تنظیم شده اند، اجرا کنید:
$ adb shell getevent -li
- برای فعال کردن این ویژگی در زمان اجرا، اجرا کنید:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- فرآیند
system_server
را مجدداً راه اندازی کنید.$ adb shell stop && adb shell start
- تأیید کنید که
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: {} - برای فعال کردن دائمی این ویژگی، دستور sysprop مربوطه را در فایل
init**rc
خود اضافه کنید:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1