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

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

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

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

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

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

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

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

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

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

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

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

  • Устройство ввода не классифицируется как мультитач-устройство. Устройство ввода классифицируется либо как устройство с одним касанием, либо как устройство с несколькими касаниями, но не то и другое одновременно.
  • Устройство ввода сообщает о наличии абсолютных осей ABS_X и ABS_Y , а также о наличии кода клавиши BTN_TOUCH .

Когда устройство ввода классифицируется как сенсорное устройство, наличие виртуальных клавиш определяется путем попытки загрузить файл карты виртуальных клавиш для устройства. Если доступна виртуальная карта клавиш, то также загружается файл раскладки клавиш для устройства. Обратитесь к [Файлы карты виртуальных клавиш](#virtual-key-map-files) для получения информации о расположении и формате этих файлов.

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

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

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

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

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

  • Если свойство touch.deviceType установлено, то тип устройства устанавливается, как указано.
  • Если устройство ввода сообщает о наличии свойства ввода INPUT_PROP_DIRECT (через 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 .

Инструменты наведения и касания

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

Компонент InputReader отличает инструменты касания от инструментов наведения. Аналогичным образом, приложениям по-разному сообщаются инструменты касания и наведения.

Инструменты касания передаются приложениям как события касания с использованием MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN и MotionEvent.ACTION_POINTER_UP .

Инструменты наведения передаются приложениям как общие события движения с помощью MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE и MotionEvent.ACTION_HOVER_EXIT .

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

  • Драйверы сенсорных устройств должны регистрировать только оси и коды клавиш для осей и кнопок, которые они поддерживают. Регистрация неподдерживаемых осей или кодов клавиш может сбить с толку алгоритм классификации устройства или привести к тому, что система неправильно определит возможности устройства. Например, если устройство сообщает код клавиши BTN_TOUCH , система предполагает, что BTN_TOUCH всегда используется для указания того, касается ли инструмент экрана. Поэтому BTN_TOUCH не следует использовать для обозначения того, что инструмент просто находится в диапазоне и зависает.
  • Устройства с одним касанием используют следующие события ввода Linux:
    • ABS_X : (ОБЯЗАТЕЛЬНО) Сообщает координату X инструмента.
    • ABS_Y : (ОБЯЗАТЕЛЬНО) Сообщает координату Y инструмента.
    • ABS_PRESSURE : (необязательно) Сообщает о физическом давлении, приложенном к кончику инструмента, или силе сигнала сенсорного контакта.
    • ABS_TOOL_WIDTH : (необязательно) Сообщает площадь поперечного сечения или ширину сенсорного контакта или самого инструмента.
    • ABS_DISTANCE : (необязательно) Сообщает расстояние инструмента от поверхности сенсорного устройства.
    • ABS_TILT_X : (необязательно) Сообщает наклон инструмента от поверхности сенсорного устройства вдоль оси X.
    • ABS_TILT_Y : (необязательно) Сообщает наклон инструмента от поверхности сенсорного устройства вдоль оси Y.
    • BTN_TOUCH : (ОБЯЗАТЕЛЬНО) Указывает, касается ли инструмент устройства.
    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (необязательно) Сообщает о состоянии кнопки .
    • BTN_TOOL_FINGER , BTN_TOOL_PEN , BTN_TOOL_RUBBER , BTN_TOOL_BRUSH , BTN_TOOL_PENCIL , BTN_TOOL_AIRBRUSH , BTN_TOOL_MOUSE , BTN_TOOL_LENS , BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP , BTN_TOOL_QUADTAP : (необязательно) Сообщает тип инструмента .
  • Устройства с поддержкой 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 : (необязательно) Сообщает тип инструмента .
  • Если определены оси как для протокола с одним касанием, так и для протокола с несколькими касаниями, то используются только оси с несколькими касаниями, а оси с одним касанием игнорируются.
  • Минимальные и максимальные значения осей 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 .

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

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

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

    • При использовании протокола мультитач «А» инструмент активен всякий раз, когда он появляется в последнем отчете о синхронизации. Когда инструмент перестает появляться в отчетах о синхронизации, он перестает существовать.
    • При использовании протокола мультитач «B» инструмент активен, пока у него есть активный слот. Когда слот очищается, инструмент перестает существовать.
  • Инструмент определяется как зависший на основании следующих условий:
    • Если это инструмент BTN_TOOL_MOUSE или BTN_TOOL_LENS , то инструмент не зависает, даже если выполняется любое из следующих условий.
    • Если инструмент активен и водитель сообщает информацию о давлении, а сообщаемое давление равно нулю, то инструмент зависает.
    • Если инструмент активен и драйвер поддерживает код клавиши BTN_TOUCH , а BTN_TOUCH имеет нулевое значение, то инструмент зависает.
  • InputReader поддерживает протоколы мультитач «A» и «B». Новые драйверы должны использовать протокол «B», но любой из них работает.
  • Начиная с Android 4.0, возможно, потребуется изменить драйверы сенсорного экрана, чтобы они соответствовали спецификации протокола ввода Linux.

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

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

      В предыдущих версиях Android предполагалось, что о событиях «вверх» будет сообщаться путем отправки значения давления, равного 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. Если 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 , система автоматически определяет тип устройства в соответствии с алгоритмом классификации.

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

В Android 3 и более ранних версиях все сенсорные устройства считались сенсорными экранами.

touch.orientationAware

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

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

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

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

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

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

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

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

touch.gestureMode

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

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

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

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

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

Поля X и Y

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

Расчет

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

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

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

touchMajor, touchMinor,toolMajor,toolMinor, поля размера

Поля 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 , система использует geometric калибровку, если доступна ось raw.touchMajor или raw.toolMajor , в противном случае она не использует калибровку none калибровки.

сенсорный.размер.масштаб

Определение: 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

Определение: touch.distance.calibration = none | scaled | default

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

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

  • Если значение scaled , сообщаемое расстояние умножается на коэффициент постоянного масштаба.

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

сенсорное расстояние.масштаб

Определение: touch.distance.scale = <a Незначательный номер с плавающей запятой>

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

Значение по умолчанию составляет 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 мороженое Sandwich 4.0. Все файлы конфигурации устройства ввода для сенсорных устройств должны быть обновлены для использования новых свойств конфигурации.

Старые драйверы сенсорных устройств также могут быть обновлены.

Файлы карты виртуальных ключей

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

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

Когда виртуальные ключи реализуются в программном обеспечении, ядро ​​должно экспортировать файл карты виртуальных ключей под названием virtualkeys.<devicename> как свойство доски. Например, если драйверы устройства сенсорного экрана сообщают о своем имени как «Touchyfeely», тогда файл карты виртуальных ключей должен иметь Path /sys/board_properties/virtualkeys.touchyfeely .

Файл карты виртуальных ключей описывает координаты и коды ключей Linux виртуальных ключей на сенсорном экране.

В дополнение к файлу карты виртуальных клавиш, должен быть соответствующий файл макета клавиш и файл карты клавиш, чтобы отобразить коды ключей Linux с кодами клавиш Android и указать тип устройства клавиатуры (обычно SPECIAL_FUNCTION ).

Синтаксис

Файл карты виртуальных ключей - это простой текстовый файл, состоящий из последовательности описаний макета виртуальных ключей, отделенных новыми линиями или колонами.

Строки комментариев начинаются с «#» и продолжаются до конца строки.

Каждый виртуальный ключ описывается 6 компонентами с разрешением толстой кишки:

  • 0x01 : код версии. Всегда должен быть 0x01 .
  • <Код клавиши Linux>: код клавиши Linux виртуального ключа.
  • <CenterX>: x пиксельная координата центра виртуального ключа.
  • <Centery>: координата пикселя Y Центра виртуального ключа.
  • <sidth>: ширина виртуального ключа в пикселях.
  • <Высота>: высота виртуального ключа в пикселях.

Все координаты и размеры указаны в терминах системы координат отображения.

Вот файл карты виртуальных ключей, записанный на одной строке.

# 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. Соответственно, все виртуальные ключи имеют координату <centerery> 835, что немного ниже видимой области сенсорного экрана.

Первый ключ имеет код сканирования Linux 158 ( KEY_BACK ), Centerx 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

Непрямые жесты указателя с несколькими привязками

В режиме указателя система интерпретирует следующие жесты:

  • Нажмите с одним пальцем: нажмите.
  • Одиночное движение пальца: переместите указатель.
  • Кнопка «Движение с одним пальцем» плюс нажатие: перетащите указатель.
  • Два движения пальца Оба пальца движутся в одном направлении: перетащите область под указателем в этом направлении. Сам указатель не движется.
  • Два движения пальца оба пальца движутся друг с другом или в разных направлениях: сковорода/масштаб/поверните область, окружающую указатель. Сам указатель не движется.
  • Многократное движение пальца: жест свободной формы.

Отказ от пальмы

По состоянию на 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
    

дальнейшее чтение

,

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

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

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

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

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

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

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

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

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

  • Устройство ввода сообщает о наличии ABS_MT_POSITION_X и ABS_MT_POSITION_Y Абсолютные оси.
  • Устройство ввода не имеет кнопок Gamepad. Это условие разрешает двусмысленность с определенными геймпадами, в которых сообщается оси с кодами, которые перекрывают оси МТ.

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

  • Устройство ввода не классифицируется как мультитаховое устройство. Устройство ввода либо классифицируется как одно касание устройства, либо как мультитач-устройство, никогда не оба.
  • Устройство ввода сообщает о наличии абсолютных осей ABS_X и ABS_Y , а также наличие кода ключа BTN_TOUCH .

Когда устройство ввода классифицируется как сенсорное устройство, наличие виртуальных ключей определяется путем попытки загрузить файл карты виртуальных ключей для устройства. Если доступна карта виртуальных ключей, то также загружается файл макета клавиш для устройства. Обратитесь к [Файлы карты виртуальных ключей] (#виртуально-ключа-карты) для получения информации о местоположении и формате этих файлов.

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

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

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

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

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

  • Если установлено свойство touch.deviceType , то тип устройства устанавливается как указано.
  • Если устройство ввода сообщает о наличии входного свойства INPUT_PROP_DIRECT (через EVIOCGPROP ioctl), то тип устройства устанавливается на сенсорный экран . Это условие предполагает, что прямые входные сенсорные устройства прикреплены к дисплею, который также подключен.
  • Если устройство ввода сообщает о присутствии входного свойства INPUT_PROP_POINTER (через EVIOCGPROP ioctl), то тип устройства устанавливается для указателя .
  • Если устройство ввода сообщает о наличии относительных осей REL_X или REL_Y , то тип устройства устанавливается на Touch Pad . Это условие разрешает двусмысленность для входных устройств, которые состоят как из мыши, так и сенсорной площадки. В этом случае сенсорная площадка не используется для управления указателем, потому что мышь уже контролирует его.
  • В противном случае тип устройства установлен для указателя . Эта по умолчанию гарантирует, что сенсорные колодки, которые не были обозначены каким -либо другим специальным назначением, управляют указателем.

Кнопки

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

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

  • BTN_LEFT : нанесен на MotionEvent.BUTTON_PRIMARY .
  • BTN_RIGHT : нанесен на MotionEvent.BUTTON_SECONDARY .
  • BTN_MIDDLE : отображается на MotionEvent.BUTTON_MIDDLE .
  • BTN_BACK и BTN_SIDE : maphed to MotionEvent.BUTTON_BACK . Нажатие этой кнопки также синтезирует нажатие клавиши с помощью кода клавиши KeyEvent.KEYCODE_BACK .
  • BTN_FORWARD и BTN_EXTRA : maped to 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 .

Паривное против инструментов прикосновения

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

Компонент InputReader отличает касания инструментов от инструментов зависания. Аналогичным образом, приложения и инструменты для паряков по -разному сообщаются по -разному.

Инструменты прикосновения сообщаются в приложениях как события прикосновения с использованием MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN и MotionEvent.ACTION_POINTER_UP .

Инструменты зависания сообщаются в приложениях как общие события движения с использованием MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE и MotionEvent.ACTION_HOVER_EXIT .

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

  • Драйверы касания устройств должны зарегистрировать только оси и коды ключей для оси и кнопок, которые они поддерживают. Регистрация неподдерживаемых осей или кодов ключей может смутить алгоритм классификации устройств или привести к тому, что система неверно обнаруживает возможности устройства. Например, если устройство сообщает о коде клавиши BTN_TOUCH , система предполагает, что BTN_TOUCH всегда используется для указания, касается ли инструмент на экране. Следовательно, BTN_TOUCH не следует использовать для указания, что инструмент находится только в диапазоне и парят.
  • Устройства с одним касанием используйте следующие события ввода Linux:
    • ABS_X : (требуется) сообщает о x координату инструмента.
    • ABS_Y : (требуется) сообщает о координате y инструмента.
    • ABS_PRESSURE : (Необязательно) Сообщает о физическом давлении, применяемом к кончику инструмента или силе сигнала сенсорного контакта.
    • ABS_TOOL_WIDTH : (необязательно) сообщает о области поперечного сечения или ширину сенсорного контакта или самого инструмента.
    • ABS_DISTANCE : (необязательно) сообщает о расстоянии инструмента от поверхности сенсорного устройства.
    • ABS_TILT_X : (необязательно) сообщает о наклоне инструмента с поверхности сенсорного устройства вдоль оси x.
    • ABS_TILT_Y : (необязательно) сообщает о наклоне инструмента с поверхности сенсорного устройства вдоль оси Y.
    • BTN_TOUCH : (требуется) указывает, касается ли инструмент к устройству.
    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (необязательно) отчеты .
    • BTN_TOOL_FINGER , BTN_TOOL_PEN BTN_TOOL_MOUSE BTN_TOOL_BRUSH BTN_TOOL_TRIPLETAP BTN_TOOL_RUBBER BTN_TOOL_DOUBLETAP BTN_TOOL_PENCIL , BTN_TOOL_LENS BTN_TOOL_AIRBRUSH BTN_TOOL_QUADTAP .
  • Multi-Touch Devices Используйте следующие события ввода 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 Multi-Touch 'B'. Обратитесь к документации по протоколу Linux Multi-Touch для получения более подробной информации.
    • 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_MOUSE BTN_TOOL_BRUSH BTN_TOOL_TRIPLETAP BTN_TOOL_RUBBER BTN_TOOL_DOUBLETAP BTN_TOOL_PENCIL , BTN_TOOL_LENS BTN_TOOL_AIRBRUSH 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 , должны быть ненулевыми, когда инструмент касается устройства и в противном случае, но это не требуется. Например, сенсорное устройство может измерить размер контактов с сенсорными пальцами, но не контактов Stylus Touch.

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

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

    Информация о расстоянии отчетности является необязательной , но рекомендуется для устройств Stylus.

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

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

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

    Информация о наклоне отчетности является необязательной , но рекомендуется для устройств Stylus.

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

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

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

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

    • При использовании протокола Multi-Touch «A», инструмент активен всякий раз, когда он появляется в самом последнем отчете о синхронизации. Когда инструмент перестает появляться в отчетах синхронизации, он перестает существовать.
    • При использовании протокола Multi-Touch «B» инструмент активен, если он имеет активное слот. Когда слот очищается, инструмент перестает существовать.
  • Инструмент определяется как зависание на основе следующих условий:
    • Если инструмент - BTN_TOOL_MOUSE или BTN_TOOL_LENS , то инструмент не колеблется, даже если какое -либо из следующих условий верно.
    • Если инструмент активен, а драйвер сообщает информацию о давлении, и сообщаемое давление равно нулю, то инструмент колеблется.
    • Если инструмент активен, и драйвер поддерживает код ключа BTN_TOUCH , а BTN_TOUCH имеет значение нулю, то инструмент колеблется.
  • InputReader поддерживает как Multi-Touch Protocol 'A' ', так и' B '. Новые драйверы должны использовать протокол «B», но любой работает.
  • По состоянию на Android 4.0, может потребоваться изменить драйверы сенсорного экрана, чтобы соответствовать спецификации протокола входа Linux.

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

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

      Предыдущие версии Android ожидали событий «UP», которые будут сообщать, отправив значение давления 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 HID, с использованием немодифицированных драйверов.

Прикоснитесь к работе устройства

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

  1. EventHub читает необработанные события от драйвера evdev .
  2. InputReader потребляет необработанные события и обновляет внутреннее состояние о позиции и других характеристиках каждого инструмента. Это также отслеживает кнопки состояния.
  3. Если назад или вперед был нажат или выпущен, InputReader уведомляет InputDispatcher о событии ключа.
  4. InputReader определяет, произошло ли произошло нажатие виртуальной клавиши. Если это так, он уведомляет InputDispatcher о ключевом событии.
  5. InputReader определяет, был ли прикосновение инициирован в пределах границ дисплея. Если это так, это уведомляет InputDispatcher о событии Touch.
  6. Если нет никаких трогательных инструментов, но есть хотя бы один инструмент зависания, InputReader уведомляет InputDispatcher о событии Hover.
  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 OXIS или 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
The output height. For touch screens (associated with a display), this is the display height in pixels. For touch pads (not associated with a display), the output height equals raw.height , indicating that no interpolation is performed.
output.diag
The diagonal length of the output coordinate system, equivalent to sqrt(output.width ^2 + output.height ^2) .

Базовая конфигурация

The touch input mapper uses many configuration properties in the input device configuration file to specify calibration values. The following table describes some general purpose configuration properties. All other properties are described in the following sections along with the fields they are used to calibrate.

touch.deviceType

Definition: touch.deviceType = touchScreen | touchPad | pointer | default

Specifies the touch device type.

  • If the value is touchScreen , the touch device is a touch screen associated with a display.

  • If the value is touchPad , the touch device is a touch pad not associated with a display.

  • If the value is pointer , the touch device is a touch pad not associated with a display, and its motions are used for indirect multi-touch pointer gestures .

  • If the value is default , the system automatically detects the device type according to the classification algorithm.

Refer to the Classification section for more details about how the device type influences the behavior of the touch device.

In Android 3 and lower, all touch devices were assumed to be touch screens.

touch.orientationAware

Definition: touch.orientationAware = 0 | 1

Specifies whether the touch device should react to display orientation changes.

  • If the value is 1 , touch positions reported by the touch device are rotated whenever the display orientation changes.

  • If the value is 0 , touch positions reported by the touch device are immune to display orientation changes.

The default value is 1 if the device is a touch screen, 0 otherwise.

The system distinguishes between internal and external touch screens and displays. An orientation aware internal touch screen is rotated based on the orientation of the internal display. An orientation aware external touch screen is rotated based on the orientation of the external display.

Orientation awareness is used to support rotation of touch screens on devices like the Nexus One. For example, when the device is rotated clockwise 90 degrees from its natural orientation, the absolute positions of touches are remapped such that a touch in the top-left corner of the touch screen's absolute coordinate system is reported as a touch in the top-left corner of the display's rotated coordinate system. This is done so that touches are reported with the same coordinate system that apps use to draw their visual elements.

Prior to Honeycomb, all touch devices were assumed to be orientation aware.

touch.gestureMode

Definition: touch.gestureMode = pointer | spots | default

Specifies the presentation mode for pointer gestures. This configuration property is only relevant when the touch device is of type pointer .

  • If the value is pointer , the touch pad gestures are presented by way of a cursor similar to a mouse pointer.

  • If the value is spots , the touch pad gestures are presented by an anchor that represents the centroid of the gesture and a set of circular spots that represent the position of individual fingers.

The default value is pointer when the INPUT_PROP_SEMI_MT input property is set, or spots otherwise.

X and Y fields

The X and Y fields provide positional information for the center of the contact area.

Расчет

The calculation is straightforward: positional information from the touch driver is linearly interpolated to the output coordinate system.

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 fields

The touchMajor and touchMinor fields describe the approximate dimensions of the contact area in output units (pixels).

The toolMajor and toolMinor fields describe the approximate dimensions of the tool itself in output units (pixels).

The size field describes the normalized size of the touch relative to the largest possible touch that the touch device can sense. The smallest possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest possible normalized size is 1.0 (sensor area is saturated).

When both the approximate length and breadth can be measured, then the touchMajor field specifies the longer dimension and the touchMinor field specifies the shorter dimension of the contact area. When only the approximate diameter of the contact area can be measured, then the touchMajor and touchMinor fields are equal.

Likewise, the toolMajor field specifies the longer dimension and the toolMinor field specifies the shorter dimension of the tool's cross-sectional area.

If the touch size is unavailable but the tool size is available, then the tool size is set equal to the touch size. Conversely, if the tool size is unavailable but the touch size is available, then the touch size is set equal to the tool size.

Touch devices measure or report the touch size and tool size in various ways. The current implementation supports three different kinds of measurements: diameter, area, and geometric bounding box in surface units.

Definition: touch.size.calibration = none | geometric | diameter | area | default

Specifies the kind of measurement used by the touch driver to report the touch size and tool size.

  • If the value is none , the size is set to zero.

  • If the value is geometric , the size is assumed to be specified in the same surface units as the position, so it is scaled in the same manner.

  • If the value is diameter , the size is assumed to be proportional to the diameter (width) of the touch or tool.

  • If the value is area , the size is assumed to be proportional to the area of the touch or tool.

  • If the value is default , the system uses the geometric calibration if the raw.touchMajor or raw.toolMajor axis is available, otherwise it uses the none calibration.

touch.size.scale

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

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

touch.size.bias

Definition: touch.size.bias = <a non-negative floating point number>

Specifies a constant bias value used in the calibration.

The default value is 0.0 .

touch.size.isSummed

Definition: touch.size.isSummed = 0 | 1

Specifies whether the size is reported as the sum of the sizes of all active contacts, or is reported individually for each contact.

  • If the value is 1 , the reported size is divided by the number of contacts prior to use.

  • If the value is 0 , the reported size is used as is.

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

Some touch devices, particularly "Semi-MT" devices cannot distinguish the individual dimensions of multiple contacts so they report a size measurement that represents their total area or width. This property should only be set to 1 for such devices. If in doubt, set this value to 0 .

Расчет

The calculation of the touchMajor , touchMinor , toolMajor , toolMinor , and size fields depends on the specified calibration parameters.

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

поле давления

The pressure field describes the approximate physical pressure applied to the touch device as a normalized value between 0.0 (no touch) and 1.0 (normal pressure).

A zero pressure indicates that the tool is hovering.

touch.pressure.calibration

Definition: touch.pressure.calibration = none | physical | amplitude | default

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

  • If the value is none , the pressure is unknown so it is set to 1.0 when touching and 0.0 when hovering.

  • If the value is physical , the pressure axis is assumed to measure the actual physical intensity of pressure applied to the touch pad.

  • 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 .

Расчет

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 can 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 .

Расчет

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

поле расстояний

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 .

сенсорное расстояние.масштаб

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 .

Расчет

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

Пример

# 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

Примечания о совместимости

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 might also need to be updated.

Virtual key map files

Touch devices can be 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 ).

Синтаксис

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 .

Пример

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:

  • Single finger tap: click.
  • Single finger motion: move the pointer.
  • Single finger motion plus button presses: drag the pointer.
  • 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.
  • 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.
  • Multiple finger motion: freeform gesture.

Отказ от пальмы

As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.

The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor and touchMinor . The Android framework then removes the pointers that are marked as palms from the touch stream.

If a pointer was already sent to the apps, then the system either:

  • (If there are other active pointers) Cancels the pointer with ACTION_POINTER_UP and FLAG_CANCELED set.
  • (If this is the only pointer) Cancels the pointer with ACTION_CANCEL .

A public API, MotionEvent.FLAG_CANCELED , indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL and ACTION_POINTER_UP .

If the palm pointer wasn't sent to apps, then the system simply drops the pointer.

Enable palm rejection

  1. In your touch driver, use the input_abs_set_res macro to set the resolutions for the following fields (units are pixels per mm ):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Support for ABS_MT_TOUCH_MINOR is optional. However, if your device does support it, make sure the resolution is set correctly.

  2. To confirm the fields are set correctly, run:
        $ adb shell getevent -li
    
  3. To enable the feature during runtime, run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Restart the system_server process.
         $ adb shell stop && adb shell start
        
  5. Confirm that adb shell dumpsys input shows that there are palm rejectors inside UnwantedInteractionBlocker . If it doesn't, check the input-related logs to find clues on what might be misconfigured.

    See the following example for reference:

    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. To permanently enable the feature, add the corresponding sysprop command in your init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

дальнейшее чтение