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

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 , то тип устройства устанавливается на сенсорную панель . Это условие устраняет неоднозначность для устройств ввода, которые состоят как из мыши, так и сенсорной панели. В этом случае сенсорная панель не используется для управления указателем, поскольку мышь уже управляет им.
  • В противном случае тип устройства устанавливается на pointer . Это значение по умолчанию гарантирует, что сенсорные панели, не предназначенные для какой-либо другой специальной цели, будут управлять указателем.

Кнопки

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

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

  • 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 : (необязательно) Сообщает тип инструмента .
  • Устройства с поддержкой мультитач используют следующие события ввода 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_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 должен иметь по крайней мере некоторую информацию о природе инструмента, либо касается ли он, либо, по крайней мере, его тип инструмента. Если информация недоступна, то инструмент считается неактивным (вне диапазона).

    • При использовании протокола multi-touch 'A' инструмент активен всякий раз, когда он появляется в последнем отчете синхронизации. Когда инструмент перестает появляться в отчетах синхронизации, он перестает существовать.
    • При использовании протокола мультитач '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 = 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 = pointer | spots | default

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

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

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

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

Поля X и Y

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

Расчет

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

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

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

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

Поля 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 = <неотрицательное число с плавающей точкой>

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

Значение по умолчанию — 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

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

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