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
(через ioctlEVIOCGPROP
), то тип устройства устанавливается на сенсорный экран . Это условие предполагает, что сенсорные устройства прямого ввода подключены к дисплею, который также подключен. - Если устройство ввода сообщает о наличии входного свойства
INPUT_PROP_POINTER
(через ioctlEVIOCGPROP
), то тип устройства устанавливается на указатель . - Если устройство ввода сообщает о наличии относительных осей
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.
-
EventHub
считывает необработанные события из драйвераevdev
. -
InputReader
потребляет необработанные события и обновляет внутреннее состояние о положении и других характеристиках каждого инструмента. Он также отслеживает состояния кнопок. - Если была нажата или отпущена клавиша BACK или FORWARD ,
InputReader
уведомляетInputDispatcher
о событии клавиши. -
InputReader
определяет, произошло ли нажатие виртуальной клавиши. Если да, то он уведомляетInputDispatcher
о событии клавиши. -
InputReader
определяет, было ли касание инициировано в пределах дисплея. Если да, то он уведомляетInputDispatcher
о событии касания. - Если нет ни одного касающегося инструмента, но есть хотя бы один наведенный инструмент,
InputReader
уведомляетInputDispatcher
о событии наведения. - Если тип сенсорного устройства — указатель ,
InputReader
выполняет обнаружение жеста указателя, перемещает указатель и отслеживает его соответствующим образом, а затем уведомляетInputDispatcher
о событии указателя. -
InputDispatcher
используетWindowManagerPolicy
для определения того, следует ли отправлять события и следует ли им пробуждать устройство. ЗатемInputDispatcher
доставляет события в соответствующие приложения.
Конфигурация сенсорного устройства
Поведение сенсорного устройства определяется осями устройства, кнопками, свойствами ввода, конфигурацией устройства ввода, картой виртуальных клавиш и расположением клавиш.
Более подробную информацию о файлах, участвующих в настройке клавиатуры, можно найти в следующих разделах:
Характеристики
Система использует множество свойств конфигурации устройства ввода для настройки и калибровки поведения сенсорного устройства.
Одной из причин этого является то, что драйверы сенсорных устройств часто сообщают характеристики касаний, используя единицы измерения, специфичные для устройства.
Например, многие сенсорные устройства измеряют область касания с помощью внутренней шкалы, специфичной для устройства, например, общего количества сенсорных узлов, которые были активированы касанием. Это необработанное значение размера не будет иметь смысла для приложений, поскольку им необходимо знать о физическом размере и других характеристиках сенсорных узлов сенсорного устройства.
Система использует параметры калибровки, закодированные в файлах конфигурации устройства ввода, для декодирования, преобразования и нормализации значений, сообщаемых сенсорным устройством, в более простое стандартное представление, понятное приложениям.
Соглашения о документации
В целях документирования мы используем следующие условные обозначения для описания значений, используемых системой в процессе калибровки.
Исходные значения осей
Следующие выражения обозначают необработанные значения, сообщаемые драйвером сенсорного устройства как события EV_ABS
.
-
raw.x
- Значение оси
ABS_X
илиABS_MT_POSITION_X
. -
raw.y
- Значение оси
ABS_Y
илиABS_MT_POSITION_Y
. -
raw.pressure
- Значение оси
ABS_PRESSURE
илиABS_MT_PRESSURE
, или 0, если недоступно. -
raw.touchMajor
- Значение оси
ABS_MT_TOUCH_MAJOR
или 0, если недоступно. -
raw.touchMinor
- Значение оси
ABS_MT_TOUCH_MINOR
илиraw.touchMajor
, если оно недоступно. -
raw.toolMajor
- Значение оси
ABS_TOOL_WIDTH
илиABS_MT_WIDTH_MAJOR
или 0, если недоступно. -
raw.toolMinor
- Значение оси
ABS_MT_WIDTH_MINOR
илиraw.toolMajor
, если оно недоступно. -
raw.orientation
- Значение оси
ABS_MT_ORIENTATION
или 0, если недоступно. -
raw.distance
- Значение оси
ABS_DISTANCE
илиABS_MT_DISTANCE
или 0, если недоступно. -
raw.tiltX
- Значение оси
ABS_TILT_X
или 0, если недоступно. -
raw.tiltY
- Значение оси
ABS_TILT_Y
или 0, если недоступно.
Диапазоны необработанных осей
Следующие выражения обозначают границы необработанных значений. Они получаются путем вызова EVIOCGABS
ioctl для каждой оси.
-
raw.*.min
- Минимальное значение исходной оси.
-
raw.*.max
- Максимальное значение исходной оси.
-
raw.*.range
- Эквивалентно
raw.*.max - raw.*.min
. -
raw.*.fuzz
- Точность исходной оси. Например, fuzz = 1 подразумевает, что значения имеют точность +/- 1 единица.
-
raw.width
- Включительная ширина области касания, эквивалентная
raw.x.range + 1
. -
raw.height
- Общая высота области касания, эквивалентная
raw.y.range + 1
.
Выходные диапазоны
Следующие выражения обозначают характеристики выходной системы координат. Система использует линейную интерполяцию для перевода информации о положении касания из единиц поверхности, используемых сенсорным устройством, в выходные единицы, которые сообщаются приложениям, таким как пиксели дисплея.
-
output.width
- Ширина вывода. Для сенсорных экранов (связанных с дисплеем) это ширина дисплея в пикселях. Для сенсорных панелей (не связанных с дисплеем) ширина вывода равна
raw.width
, что означает, что интерполяция не выполняется. -
output.height
- Высота вывода. Для сенсорных экранов (связанных с дисплеем) это высота дисплея в пикселях. Для сенсорных панелей (не связанных с дисплеем) высота вывода равна
raw.height
, что означает, что интерполяция не выполняется. -
output.diag
- Длина диагонали выходной системы координат, эквивалентная
sqrt(output.width ^2 + output.height ^2)
.
Базовая конфигурация
Сенсорный картограф ввода использует множество свойств конфигурации в файле конфигурации устройства ввода для указания значений калибровки. В следующей таблице описаны некоторые свойства конфигурации общего назначения. Все остальные свойства описаны в следующих разделах вместе с полями, которые они используют для калибровки.
тип сенсорного устройства
Определение: touch.deviceType
= 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
.
Если указатель пальмы не был отправлен в приложения, то система просто бросает указатель.
Включить отказ от пальмы
- В вашем драйвере прикосновения используйте макрос
input_abs_set_res
, чтобы установить разрешения для следующих полей (единицы - это пиксели на мм ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Поддержка
ABS_MT_TOUCH_MINOR
является необязательной. Однако, если ваше устройство поддерживает его, убедитесь, что разрешение установлено правильно. -
- Чтобы подтвердить, что поля установлены правильно, запустите:
$ adb shell getevent -li
- Чтобы включить функцию во время выполнения, запустите:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Перезагрузите процесс
system_server
.$ adb shell stop && adb shell start
- Убедитесь, что
adb shell dumpsys input
показывает, что внутриUnwantedInteractionBlocker
есть реакциоры пальм. Если это не так, проверьте журналы, связанные с входом, чтобы найти подсказки о том, что может быть неправильно настроено.См. Следующий пример для справки:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - Чтобы навсегда включить функцию, добавьте соответствующую команду Sysprop в свой файл
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1