Сенсорные устройства

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

Android поддерживает различные сенсорные экраны и сенсорные панели, в том числе планшеты со стилусом.

Сенсорные экраны — это сенсорные устройства, которые связаны с дисплеем таким образом, что у пользователя создается впечатление, что он непосредственно манипулирует элементами на экране.

Сенсорные панели — это сенсорные устройства, которые не связаны с дисплеем, например планшетный дигитайзер. Сенсорные панели обычно используются для указания или для абсолютного непрямого позиционирования или управления пользовательским интерфейсом на основе жестов.

Сенсорные устройства могут иметь кнопки, функции которых аналогичны кнопкам мыши.

Сенсорными устройствами иногда можно манипулировать с помощью различных инструментов, таких как пальцы или стилус, в зависимости от базовой технологии сенсорного датчика.

Сенсорные устройства иногда используются для реализации виртуальных клавиш. Например, на некоторых устройствах Android область датчика сенсорного экрана выходит за край дисплея и выполняет двойную функцию как часть чувствительной к прикосновениям клавиатуры.

Из-за большого разнообразия сенсорных устройств Android использует большое количество свойств конфигурации для описания характеристик и желаемого поведения каждого устройства.

Классификация сенсорных устройств

Устройство ввода классифицируется как мультисенсорное , если выполняются оба следующих условия:

  • Устройство ввода сообщает о наличии абсолютных осей ABS_MT_POSITION_X и ABS_MT_POSITION_Y .

  • На устройстве ввода нет кнопок геймпада. Это условие устраняет неоднозначность с некоторыми геймпадами, которые сообщают оси с кодами, перекрывающимися с кодами осей MT.

Устройство ввода классифицируется как устройство с одним касанием , если выполняются оба следующих условия:

  • Устройство ввода не классифицируется как мультисенсорное. Устройство ввода классифицируется либо как устройство с одним касанием, либо как устройство с несколькими касаниями, а не как то и другое одновременно.

  • Устройство ввода сообщает о наличии абсолютных осей ABS_X и ABS_Y , а также о наличии кода клавиши BTN_TOUCH .

После того как устройство ввода было классифицировано как сенсорное, наличие виртуальных клавиш определяется путем попытки загрузить файл сопоставления виртуальных клавиш для устройства. Если доступна карта виртуальных клавиш, то также загружается файл раскладки клавиш для устройства.

Обратитесь к разделу ниже о расположении и формате файлов карты виртуальных ключей.

Затем система загружает файл конфигурации устройства ввода для сенсорного устройства.

Все встроенные сенсорные устройства должны иметь файлы конфигурации устройств ввода. Если файл конфигурации устройства ввода отсутствует, система выберет конфигурацию по умолчанию, подходящую для типичных сенсорных периферийных устройств общего назначения, таких как внешние сенсорные экраны USB или Bluetooth HID или сенсорные панели. Эти значения по умолчанию не предназначены для встроенных сенсорных экранов и, скорее всего, приведут к неправильному поведению.

После загрузки конфигурации устройства ввода система классифицирует устройство ввода как сенсорный экран , сенсорную панель или стрелочное устройство.

  • Устройство с сенсорным экраном используется для прямого манипулирования объектами на экране. Поскольку пользователь непосредственно прикасается к экрану, системе не требуются дополнительные возможности для указания объектов, с которыми он манипулирует.

  • Устройство с сенсорной панелью используется для предоставления приложению информации об абсолютном позиционировании о прикосновениях к заданной сенсорной области. Это может быть полезно для планшетов дигитайзера.

  • Указательное устройство используется для непрямого манипулирования объектами на экране с помощью курсора. Пальцы интерпретируются как жесты мультисенсорного указателя. Другие инструменты, такие как стилусы, интерпретируются с использованием абсолютных позиций.

    Дополнительную информацию см. в разделе Косвенные жесты указателя мультитач .

Следующие правила используются для классификации устройства ввода как сенсорного экрана , сенсорной панели или указателя .

  • Если установлено свойство touch.deviceType , то тип устройства будет установлен, как указано.

  • Если устройство ввода сообщает о наличии свойства ввода INPUT_PROP_DIRECT (через ioctl EVIOCGPROP ), то тип устройства будет установлен на сенсорный экран . Это условие предполагает, что сенсорные устройства прямого ввода подключены к дисплею, который также подключен.

  • Если устройство ввода сообщает о наличии входного свойства INPUT_PROP_POINTER (через ioctl EVIOCGPROP ), то тип устройства будет установлен на указатель .

  • Если устройство ввода сообщает о наличии относительных осей REL_X или REL_Y , то тип устройства будет установлен на сенсорную панель . Это условие устраняет неоднозначность для устройств ввода, состоящих как из мыши, так и из сенсорной панели. В этом случае сенсорная панель не будет использоваться для управления указателем, поскольку мышь уже управляет им.

  • В противном случае тип устройства будет установлен на указатель . Это значение по умолчанию гарантирует, что сенсорные панели, не предназначенные для каких-либо других специальных целей, будут служить для управления указателем.

Кнопки

Кнопки — это необязательные элементы управления, которые могут использоваться приложениями для выполнения дополнительных функций. Кнопки на сенсорных устройствах ведут себя аналогично кнопкам мыши и в основном используются с сенсорными устройствами стрелочного типа или со стилусом.

Поддерживаются следующие кнопки:

  • BTN_LEFT : сопоставляется с MotionEvent.BUTTON_PRIMARY .

  • BTN_RIGHT : сопоставляется с MotionEvent.BUTTON_SECONDARY .

  • BTN_MIDDLE : сопоставляется с MotionEvent.BUTTON_MIDDLE .

  • BTN_BACK и BTN_SIDE : сопоставлены с MotionEvent.BUTTON_BACK . Нажатие этой кнопки также синтезирует нажатие клавиши с кодом клавиши KeyEvent.KEYCODE_BACK .

  • BTN_FORWARD и BTN_EXTRA : сопоставлены с MotionEvent.BUTTON_FORWARD . Нажатие этой кнопки также синтезирует нажатие клавиши с кодом клавиши KeyEvent.KEYCODE_FORWARD .

  • BTN_STYLUS : сопоставляется с MotionEvent.BUTTON_SECONDARY .

  • BTN_STYLUS2 : сопоставляется с MotionEvent.BUTTON_TERTIARY .

Инструменты и типы инструментов

Инструмент — это палец, стилус или другое устройство, которое используется для взаимодействия с сенсорным устройством. Некоторые сенсорные устройства могут различать разные типы инструментов.

В других местах Android, например в API MotionEvent , инструмент часто называют указателем .

Поддерживаются следующие типы инструментов:

  • BTN_TOOL_FINGER и MT_TOOL_FINGER : сопоставлены с MotionEvent.TOOL_TYPE_FINGER .

  • BTN_TOOL_PEN и MT_TOOL_PEN : сопоставлены с MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_RUBBER : сопоставляется с MotionEvent.TOOL_TYPE_ERASER .

  • BTN_TOOL_BRUSH : сопоставляется с MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_PENCIL : сопоставляется с MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_AIRBRUSH : сопоставляется с MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_MOUSE : сопоставляется с MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_LENS : сопоставляется с MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP и BTN_TOOL_QUADTAP : сопоставлены с MotionEvent.TOOL_TYPE_FINGER .

Наведение и прикосновение к инструментам

Инструменты могут либо соприкасаться с сенсорным устройством, либо находиться в пределах досягаемости и парить над ним. Не все сенсорные устройства способны обнаруживать присутствие инструмента, зависшего над сенсорным устройством. Те, которые это делают, например дигитайзеры со стилусом на основе радиочастот, часто могут обнаруживать, когда инструмент находится в ограниченном диапазоне дигитайзера.

Компонент 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 .

Требования к драйверу сенсорного устройства

  1. Драйверы сенсорных устройств должны регистрировать оси и коды клавиш только для тех осей и кнопок, которые они фактически поддерживают. Регистрация избыточных осей или кодов клавиш может привести к путанице в алгоритме классификации устройства или привести к тому, что система неправильно определит возможности устройства.

    Например, если устройство сообщает код клавиши BTN_TOUCH , система будет предполагать, что BTN_TOUCH всегда будет использоваться для указания того, действительно ли инструмент касается экрана. Следовательно, BTN_TOUCH не следует использовать для обозначения того, что инструмент просто находится в диапазоне и зависает.

  2. Устройства с одним касанием используют следующие события ввода 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 Отчеты инструмента : (дополнительный тип )

  3. Устройства Multi-Touch используют следующие события ввода 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». Дополнительные сведения см. в документации по протоколу multi-touch в 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 Отчеты инструмента : (дополнительный тип )

  4. Если определены оси как для протокола с одним касанием, так и для протокола с несколькими касаниями, то будут использоваться только оси с несколькими касаниями, а оси с одним касанием будут игнорироваться.

  5. Минимальные и максимальные значения ABS_X , ABS_Y , ABS_MT_POSITION_X и ABS_MT_POSITION_Y определяют границы активной области устройства в поверхностных единицах, специфичных для устройства. В случае сенсорного экрана активная область описывает часть сенсорного устройства, которая фактически закрывает дисплей.

    Для сенсорного экрана система автоматически интерполирует зарегистрированные позиции касания в единицах поверхности, чтобы получить позиции касания в пикселях дисплея в соответствии со следующим расчетом:

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

    Сенсорный экран может сообщать о касаниях за пределами сообщаемой активной области.

    Прикосновения, инициированные за пределами активной области, не доставляются в приложения, но могут использоваться для виртуальных клавиш.

    Прикосновения, инициированные внутри активной области или входящие и исходящие из области отображения, передаются приложениям. Следовательно, если касание начинается в пределах границ приложения, а затем перемещается за пределы активной области, приложение может получать события касания с отрицательными координатами дисплея или за пределами дисплея. Это ожидаемое поведение.

    Сенсорное устройство никогда не должно привязывать сенсорные координаты к границам активной области. Если касание выходит за пределы активной области, о нем следует сообщать как о нахождении за пределами активной области или вообще не сообщать.

    Например, если палец пользователя касается верхнего левого угла сенсорного экрана, он может сообщить координату (minX, minY). Если палец продолжает двигаться дальше за пределы активной области, сенсорный экран должен либо начать сообщать координаты с компонентами меньше minX и minY, например (minX - 2, minY - 3), либо вообще перестать сообщать о касании. Другими словами, сенсорный экран не должен сообщать (minX, minY), когда палец пользователя действительно касается за пределами активной области.

    Привязка сенсорных координат к краю дисплея создает искусственную жесткую границу вокруг края экрана, которая не позволяет системе плавно отслеживать движения, которые входят или выходят за границы области дисплея.

  6. Значения, сообщаемые ABS_PRESSURE или ABS_MT_PRESSURE , если они вообще сообщаются, должны быть ненулевыми, когда инструмент касается устройства, и нулем в противном случае, чтобы указать, что инструмент зависает.

    Сообщать информацию о давлении необязательно , но настоятельно рекомендуется. Приложения могут использовать информацию о давлении для реализации чувствительного к давлению рисования и других эффектов.

  7. Значения, сообщаемые ABS_TOOL_WIDTH , ABS_MT_TOUCH_MAJOR , ABS_MT_TOUCH_MINOR , ABS_MT_WIDTH_MAJOR или ABS_MT_WIDTH_MINOR , должны быть ненулевыми, когда инструмент касается устройства, и равными нулю в противном случае, но это не требуется. Например, сенсорное устройство может измерять размер сенсорных контактов пальцев, но не сенсорных контактов стилуса.

    Сообщать информацию о размере необязательно , но настоятельно рекомендуется. Приложения могут использовать информацию о давлении для реализации рисования с учетом размера и других эффектов.

  8. Значения, сообщаемые параметрами ABS_DISTANCE или ABS_MT_DISTANCE , должны приближаться к нулю, когда инструмент касается устройства. Расстояние может оставаться отличным от нуля, даже когда инструмент находится в прямом контакте. Точные сообщаемые значения зависят от способа, которым аппаратное обеспечение измеряет расстояние.

    Сообщение информации о расстоянии является необязательным , но рекомендуется для устройств со стилусом.

  9. Значения, сообщаемые ABS_TILT_X и ABS_TILT_Y , должны быть равны нулю, когда инструмент перпендикулярен устройству. Ненулевой наклон воспринимается как указание на то, что инструмент удерживается под наклоном.

    Предполагается, что углы наклона по осям X и Y заданы в градусах от перпендикуляра. Центральная точка (совершенно перпендикулярно) определяется как (max + min) / 2 для каждой оси. Значения меньше центральной точки представляют наклон вверх или влево, значения больше центральной точки представляют наклон вниз или вправо.

    InputReader преобразует компоненты наклона X и Y в перпендикулярный угол наклона в диапазоне от 0 до PI / 2 радиан и плоский угол ориентации в диапазоне от -PI до PI радиан. Это представление приводит к описанию ориентации, которое совместимо с тем, что используется для описания касаний пальцев.

    Сообщать информацию о наклоне необязательно , но рекомендуется для устройств со стилусом.

  10. Если тип инструмента сообщается с помощью ABS_MT_TOOL_TYPE , он заменяет любую информацию о типе инструмента, сообщаемую с помощью BTN_TOOL_* . Если информация о типе инструмента вообще отсутствует, по умолчанию используется тип инструмента MotionEvent.TOOL_TYPE_FINGER .

  11. Инструмент считается активным на основании следующих условий:

    • При использовании протокола в одно касание инструмент активен, если BTN_TOUCH или BTN_TOOL_* равно 1.

      Это условие подразумевает, что InputReader должен иметь хотя бы некоторую информацию о характере инструмента, будь то касание или, по крайней мере, его тип инструмента. Если информация недоступна, предполагается, что инструмент неактивен (вне диапазона).

    • При использовании протокола multi-touch «A» инструмент активен всякий раз, когда он появляется в самом последнем отчете о синхронизации. Когда инструмент перестает отображаться в отчетах о синхронизации, он перестает существовать.

    • При использовании мультисенсорного протокола «B» инструмент активен до тех пор, пока у него есть активный слот. Когда слот очищается, инструмент перестает существовать.

  12. Инструмент определяется как зависший на основании следующих условий:

    • Если инструмент BTN_TOOL_MOUSE или BTN_TOOL_LENS , то инструмент не зависает, даже если выполняется одно из следующих условий.

    • Если инструмент активен и водитель сообщает информацию о давлении, а сообщаемое давление равно нулю, то инструмент зависает.

    • Если инструмент активен и драйвер поддерживает код клавиши BTN_TOUCH , а BTN_TOUCH имеет нулевое значение, инструмент зависает.

  13. InputReader поддерживает оба протокола multi-touch «A» и «B». Новые драйверы должны использовать протокол «B», но любой из них будет работать.

  14. Начиная с Android Ice Cream Sandwich 4.0, возможно, потребуется изменить драйверы сенсорного экрана, чтобы они соответствовали спецификации протокола ввода Linux.

    Могут потребоваться следующие изменения:

    • Когда инструмент становится неактивным (палец идет «вверх»), он должен перестать появляться в последующих отчетах мультитач-синхронизации. Когда все инструменты становятся неактивными (все пальцы идут «вверх»), драйвер должен отправить пустой пакет отчета о синхронизации, такой как SYN_MT_REPORT , за которым следует SYN_REPORT .

      В предыдущих версиях Android ожидалось, что о событиях «вверх» будет сообщаться путем отправки значения давления, равного 0. Старое поведение было несовместимо со спецификацией протокола ввода Linux и больше не поддерживается.

    • Информация о физическом давлении или силе сигнала должна сообщаться с использованием ABS_MT_PRESSURE .

      Предыдущие версии Android извлекали информацию о давлении из ABS_MT_TOUCH_MAJOR . Старое поведение было несовместимо со спецификацией протокола ввода Linux и больше не поддерживается.

    • Информация о размере касания должна сообщаться с использованием ABS_MT_TOUCH_MAJOR .

      Предыдущие версии Android извлекали информацию о размере из ABS_MT_TOOL_MAJOR . Старое поведение было несовместимо со спецификацией протокола ввода Linux и больше не поддерживается.

    Драйверы сенсорных устройств больше не нуждаются в настройке для Android. Опираясь на стандартный протокол ввода Linux, Android может поддерживать более широкий спектр сенсорных периферийных устройств, таких как внешние мультисенсорные сенсорные экраны HID, с использованием немодифицированных драйверов.

Сенсорное управление устройством

Ниже приведен краткий обзор работы сенсорного устройства на Android.

  1. EventHub считывает необработанные события из драйвера evdev .

  2. InputReader использует необработанные события и обновляет внутреннее состояние о положении и других характеристиках каждого инструмента. Он также отслеживает состояния кнопок.

  3. Если кнопки НАЗАД или ВПЕРЕД были нажаты или отпущены, InputReader уведомляет InputDispatcher о событии клавиши.

  4. InputReader определяет, произошло ли нажатие виртуальной клавиши. Если это так, он уведомляет InputDispatcher о ключевом событии.

  5. InputReader определяет, было ли касание инициировано в пределах границ дисплея. Если это так, он уведомляет InputDispatcher о событии касания.

  6. Если нет инструментов касания, но есть хотя бы один инструмент с наведением, InputReader уведомляет InputDispatcher о событии наведения.

  7. Если тип сенсорного устройства — pointer , 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 , система автоматически определяет тип устройства в соответствии с алгоритмом классификации.

Дополнительные сведения о том, как тип устройства влияет на поведение сенсорного устройства, см. в разделе « Классификация ».

До Honeycomb все сенсорные устройства считались сенсорными экранами.

touch.orientationAware

Определение: touch.orientationAware = 0 | 1

Указывает, должно ли сенсорное устройство реагировать на изменение ориентации дисплея.

  • Если значение равно 1 , положения касания, о которых сообщает сенсорное устройство, поворачиваются всякий раз, когда изменяется ориентация дисплея.

  • Если значение равно 0 , положения касания, о которых сообщает сенсорное устройство, не подвержены изменениям ориентации дисплея.

Значение по умолчанию — 1 , если устройство с сенсорным экраном, в противном случае — 0 .

Система различает внутренние и внешние сенсорные экраны и дисплеи. Внутренний сенсорный экран, учитывающий ориентацию, поворачивается в зависимости от ориентации внутреннего дисплея. Внешний сенсорный экран, учитывающий ориентацию, поворачивается в зависимости от ориентации внешнего дисплея.

Осведомленность об ориентации используется для поворота сенсорных экранов на таких устройствах, как Nexus One. Например, когда устройство поворачивается по часовой стрелке на 90 градусов от его естественной ориентации, абсолютные положения касаний переназначаются таким образом, что касание в верхнем левом углу абсолютной системы координат сенсорного экрана регистрируется как касание в верхнем левом углу. углу повернутой системы координат дисплея. Это сделано для того, чтобы о касаниях сообщалось в той же системе координат, которую приложения используют для отрисовки своих визуальных элементов.

До Honeycomb предполагалось, что все сенсорные устройства учитывают ориентацию.

touch.gestureMode

Определение: touch.gestureMode = pointer | spots | default

Определяет режим презентации для жестов указателя. Это свойство конфигурации имеет значение только в том случае, если сенсорное устройство имеет тип pointer .

  • Если значение равно pointer , жесты сенсорной панели представлены в виде курсора, аналогичного указателю мыши.

  • Если значение — spots , жесты сенсорной панели представлены привязкой, представляющей центр тяжести жеста, и набором круглых точек, представляющих положение отдельных пальцев.

Значением по умолчанию является pointer , если установлено свойство ввода INPUT_PROP_SEMI_MT , или spots в противном случае.

Поля X и Y

Поля X и Y предоставляют информацию о положении центра области контакта.

Расчет

Расчет прост: позиционная информация от сенсорного драйвера линейно интерполируется в выходную систему координат.

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

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

TouchMajor , TouchMinor , ToolMajor , ToolMinor , Size полей

TouchMajor и TouchMinor описывают приблизительные размеры области контакта в выходных единицах (пикселях).

ToolMajor и ToolMinor описывают приблизительные размеры самого инструмента в выходных единицах (пикселях).

Поле « Size » описывает нормализованный размер касания относительно максимально возможного касания, которое может воспринимать сенсорное устройство. Наименьший возможный нормализованный размер равен 0,0 (контакт отсутствует или его невозможно измерить), а максимально возможный нормализованный размер равен 1,0 (зона датчика насыщена).

Когда можно измерить и приблизительную длину, и ширину, то поле TouchMajor указывает более длинный размер, а поле TouchMinor указывает более короткий размер контактной области. Когда можно измерить только приблизительный диаметр контактной площадки, поля TouchMajor и TouchMinor будут равны.

Аналогично, поле ToolMajor указывает более длинный размер, а поле ToolMinor указывает более короткий размер площади поперечного сечения инструмента.

Если размер касания недоступен, но доступен размер инструмента, то размер инструмента будет установлен равным размеру касания. И наоборот, если размер инструмента недоступен, но доступен размер касания, то размер касания будет установлен равным размеру инструмента.

Сенсорные устройства измеряют или сообщают о размере касания и размере инструмента различными способами. Текущая реализация поддерживает три различных типа измерений: диаметр, площадь и геометрическую ограничительную рамку в поверхностных единицах.

touch.size.calibration

Определение: touch.size.calibration = none | geometric | diameter | area | default

Определяет тип измерения, используемого драйвером сенсорного экрана для сообщения размера касания и размера инструмента.

  • Если значение равно none , размер устанавливается равным нулю.

  • Если значение равно geometric , предполагается, что размер указан в тех же единицах поверхности, что и положение, поэтому он масштабируется таким же образом.

  • Если значение равно diameter , предполагается, что размер пропорционален диаметру (ширине) касания или инструмента.

  • Если значение равно area , предполагается, что размер пропорционален площади касания или инструмента.

  • Если значение по default , система использует geometric калибровку, если доступна ось raw.touchMajor или raw.toolMajor , в противном случае она none использует калибровку.

touch.size.scale

Определение: touch.size.scale = <неотрицательное число с плавающей запятой>

Указывает постоянный масштабный коэффициент, используемый при калибровке.

Значение по умолчанию — 1.0 .

touch.size.bias

Определение: touch.size.bias = <неотрицательное число с плавающей запятой>

Указывает постоянное значение смещения, используемое при калибровке.

Значение по умолчанию — 0.0 .

touch.size.isSummed

Определение: touch.size.isSummed = 0 | 1

Указывает, сообщается ли размер как сумма размеров всех активных контактов или сообщается индивидуально для каждого контакта.

  • Если значение равно 1 , сообщаемый размер будет разделен на количество контактов перед использованием.

  • Если значение равно 0 , указанный размер будет использоваться как есть.

Значение по умолчанию — 0 .

Некоторые сенсорные устройства, особенно устройства «Semi-MT», не могут различать отдельные размеры нескольких контактов, поэтому они сообщают об измерении размера, которое представляет их общую площадь или ширину. Для таких устройств это свойство должно быть установлено только в 1 . Если вы сомневаетесь, установите это значение на 0 .

Расчет

Расчет TouchMajor , TouchMinor , ToolMajor , ToolMinor и Size зависит от указанных параметров калибровки.

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

size = avg(touchMajor, touchMinor)

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

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

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

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

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

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

output.size = size

Поле Pressure

Поле « Pressure » описывает приблизительное физическое давление, прикладываемое к сенсорному устройству, как нормализованное значение от 0,0 (без касания) до 1,0 (полная сила).

Нулевое давление указывает на то, что инструмент зависает.

touch.pressure.calibration

Определение: touch.pressure.calibration = none | physical | amplitude | default

Указывает тип измерения, используемого драйвером сенсорного экрана для сообщения о давлении.

  • Если значение равно none , давление неизвестно, поэтому оно устанавливается равным 1,0 при касании и 0,0 при наведении.

  • Если значение равно physical , предполагается, что ось давления измеряет фактическую физическую интенсивность давления, приложенного к сенсорной панели.

  • If the value is amplitude , the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.

  • If the value is default , the system uses the physical calibration if the pressure axis available, otherwise uses none .

touch.pressure.scale

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

Specifies a constant scale factor used in the calibration.

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

Calculation

The calculation of the Pressure field depends on the specified calibration parameters.

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

Orientation and Tilt Fields

The Orientation field describes the orientation of the touch and tool as an angular measurement. An orientation of 0 indicates that the major axis is oriented vertically, -PI/2 indicates that the major axis is oriented to the left, PI/2 indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI or PI .

The Tilt field describes the inclination of the tool as an angular measurement. A tilt of 0 indicates that the tool is perpendicular to the surface. A tilt of PI/2 indicates that the tool is flat on the surface.

touch.orientation.calibration

Definition: touch.orientation.calibration = none | interpolated | vector | default

Specifies the kind of measurement used by the touch driver to report the orientation.

  • If the value is none , the orientation is unknown so it is set to 0.

  • If the value is interpolated , the orientation is linearly interpolated such that a raw value of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .

  • If the value is vector , the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.

  • If the value is default , the system uses the interpolated calibration if the orientation axis available, otherwise uses none .

Calculation

The calculation of the Orientation and Tilt fields depends on the specified calibration parameters and available input.

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

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

        output.orientation = angle

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

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

Distance Field

The Distance field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.

touch.distance.calibration

Definition: touch.distance.calibration = none | scaled | default

Specifies the kind of measurement used by the touch driver to report the distance.

  • If the value is none , the distance is unknown so it is set to 0.

  • If the value is scaled , the reported distance is multiplied by a constant scale factor.

  • If the value is default , the system uses the scaled calibration if the distance axis available, otherwise uses none .

touch.distance.scale

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

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Calculation

The calculation of the Distance field depends on the specified calibration parameters.

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

Example

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

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

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

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

# Orientation
touch.orientation.calibration = vector

Compatibility Notes

The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.

Older touch device drivers may also need to be updated.

Virtual Key Map Files

Touch devices are often used to implement virtual keys.

There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.

When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename> as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely .

A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.

In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION ).

Syntax

A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.

Comment lines begin with '#' and continue to the end of the line.

Each virtual key is described by 6 colon-delimited components:

  • 0x01 : A version code. Must always be 0x01 .
  • <Linux key code>: The Linux key code of the virtual key.
  • <centerX>: The X pixel coordinate of the center of the virtual key.
  • <centerY>: The Y pixel coordinate of the center of the virtual key.
  • <width>: The width of the virtual key in pixels.
  • <height>: The height of the virtual key in pixels.

All coordinates and sizes are specified in terms of the display coordinate system.

Here is a virtual key map file all written on one line.

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

The same virtual key map file can also be written on multiple lines.

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

In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.

The first key has a Linux scan code of 158 ( KEY_BACK ), centerX of 55 , centerY of 835 , width of 90 and height of 55 .

Example

Virtual key map file: /sys/board_properties/virtualkeys.touchyfeely .

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

Key layout file: /system/usr/keylayout/touchyfeely.kl .

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

Key character map file: /system/usr/keychars/touchyfeely.kcm .

type SPECIAL_FUNCTION

Indirect Multi-touch Pointer Gestures

In pointer mode, the system interprets the following gestures:

  1. Single finger tap: click.

  2. Single finger motion: move the pointer.

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

  4. Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.

  5. Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.

  6. Multiple finger motion: freeform gesture.

Further Reading

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