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

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

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

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

Значение по умолчанию составляет 1.0 .

Расчет

Расчет поля distance зависит от указанных параметров калибровки.

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

Пример

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

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

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

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

# Orientation
touch.orientation.calibration = vector

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

Свойства конфигурации для сенсорных устройств значительно изменились в Android мороженое 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
    

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