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
, то тип устройства устанавливается на сенсорную панель . Это условие устраняет неоднозначность для устройств ввода, состоящих из мыши и сенсорной панели. В этом случае сенсорная панель не используется для управления указателем, поскольку им уже управляет мышь. - В противном случае тип устройства устанавливается на указатель . Это значение по умолчанию гарантирует, что сенсорные панели, не предназначенные для другого специального назначения, управляют указателем.
Кнопки
Кнопки — это дополнительные элементы управления, которые приложения могут использовать для выполнения дополнительных функций. Кнопки на сенсорных устройствах ведут себя аналогично кнопкам мыши и в основном используются с сенсорными устройствами типа указателя или со стилусом.
Поддерживаются следующие кнопки:
-
BTN_LEFT
: сопоставлен сMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: сопоставлено сMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: сопоставлен сMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
иBTN_SIDE
: сопоставлены сMotionEvent.BUTTON_BACK
. Нажатие этой кнопки также синтезирует нажатие клавиши с кодом клавишиKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
иBTN_EXTRA
: сопоставлены сMotionEvent.BUTTON_FORWARD
. Нажатие этой кнопки также синтезирует нажатие клавиши с кодом клавишиKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: сопоставлен сMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: сопоставлен сMotionEvent.BUTTON_TERTIARY
.
Инструменты и типы инструментов
Инструмент — это палец, стилус или другое устройство, используемое для взаимодействия с сенсорным устройством. Некоторые сенсорные устройства могут различать разные типы инструментов.
В других местах Android, например в API MotionEvent
, инструмент часто называют указателем .
Поддерживаются следующие типы инструментов:
-
BTN_TOOL_FINGER
иMT_TOOL_FINGER
: сопоставлены сMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
иMT_TOOL_PEN
: сопоставлены сMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_RUBBER
: сопоставлен сMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: сопоставлен сMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_PENCIL
: сопоставлен сMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_AIRBRUSH
: сопоставлен сMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_MOUSE
: сопоставлено сMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_LENS
: сопоставлено сMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
иBTN_TOOL_QUADTAP
: сопоставлены сMotionEvent.TOOL_TYPE_FINGER
.
Инструменты наведения и касания
Инструменты могут либо находиться в контакте с сенсорным устройством, либо находиться в радиусе действия и зависать над ним. Не все сенсорные устройства могут обнаружить присутствие инструмента, находящегося над сенсорным устройством. Те, которые это делают, например дигитайзеры со стилусом на основе RF, часто могут определить, когда инструмент находится в ограниченном диапазоне дигитайзера.
Компонент InputReader
отличает инструменты касания от инструментов наведения. Аналогичным образом, приложениям по-разному сообщаются инструменты касания и наведения.
Инструменты касания передаются приложениям как события касания с помощью MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
и MotionEvent.ACTION_POINTER_UP
.
Инструменты наведения передаются приложениям как общие события движения с помощью MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
и MotionEvent.ACTION_HOVER_EXIT
.
Требования к драйверу сенсорного устройства
- Драйверы сенсорных устройств должны регистрировать только оси и коды клавиш для осей и кнопок, которые они поддерживают. Регистрация неподдерживаемых осей или кодов клавиш может сбить с толку алгоритм классификации устройства или привести к тому, что система неправильно определит возможности устройства. Например, если устройство сообщает код клавиши
BTN_TOUCH
, система предполагает, чтоBTN_TOUCH
всегда используется для указания того, касается ли инструмент экрана. ПоэтомуBTN_TOUCH
не следует использовать для обозначения того, что инструмент просто находится в диапазоне и зависает. - Устройства с одним касанием используют следующие события ввода Linux:
-
ABS_X
: (ОБЯЗАТЕЛЬНО) Сообщает координату X инструмента. -
ABS_Y
: (ОБЯЗАТЕЛЬНО) Сообщает координату Y инструмента. -
ABS_PRESSURE
: (необязательно) Сообщает о физическом давлении, приложенном к кончику инструмента, или силе сигнала сенсорного контакта. -
ABS_TOOL_WIDTH
: (необязательно) Сообщает площадь поперечного сечения или ширину сенсорного контакта или самого инструмента. -
ABS_DISTANCE
: (необязательно) Сообщает расстояние инструмента от поверхности сенсорного устройства. -
ABS_TILT_X
: (необязательно) Сообщает наклон инструмента от поверхности сенсорного устройства вдоль оси X. -
ABS_TILT_Y
: (необязательно) Сообщает наклон инструмента от поверхности сенсорного устройства вдоль оси Y. -
BTN_TOUCH
: (ОБЯЗАТЕЛЬНО) Указывает, касается ли инструмент устройства. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (необязательно) Сообщает о состоянии кнопки . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (необязательно) Сообщает тип инструмента .
-
- Устройства с поддержкой Multi-Touch используют следующие события ввода Linux:
-
ABS_MT_POSITION_X
: (ОБЯЗАТЕЛЬНО) Сообщает координату X инструмента. -
ABS_MT_POSITION_Y
: (ОБЯЗАТЕЛЬНО) Сообщает координату Y инструмента. -
ABS_MT_PRESSURE
: (необязательно) Сообщает о физическом давлении, приложенном к кончику инструмента, или силе сигнала сенсорного контакта. -
ABS_MT_TOUCH_MAJOR
: (необязательно) Сообщает площадь поперечного сечения сенсорного контакта или длину более длинного измерения сенсорного контакта. -
ABS_MT_TOUCH_MINOR
: (необязательно) Сообщает длину более короткого измерения сенсорного контакта. Эту ось не следует использовать, еслиABS_MT_TOUCH_MAJOR
сообщает об измерении площади. -
ABS_MT_WIDTH_MAJOR
: (необязательно) Сообщает площадь поперечного сечения самого инструмента или длину более длинного размера самого инструмента. Не используйте эту ось, если не знаете размеры самого инструмента. -
ABS_MT_WIDTH_MINOR
: (необязательно) Сообщает длину более короткого размера самого инструмента. Эту ось не следует использовать, еслиABS_MT_WIDTH_MAJOR
сообщает об измерении площади или если размеры самого инструмента неизвестны. -
ABS_MT_ORIENTATION
: (необязательно) Сообщает об ориентации инструмента. -
ABS_MT_DISTANCE
: (необязательно) Сообщает расстояние инструмента от поверхности сенсорного устройства. -
ABS_MT_TOOL_TYPE
: (необязательно) Сообщает тип инструмента какMT_TOOL_FINGER
илиMT_TOOL_PEN
. -
ABS_MT_TRACKING_ID
: (необязательно) Сообщает идентификатор отслеживания инструмента. Идентификатор отслеживания — это произвольное неотрицательное целое число, которое используется для идентификации и отслеживания каждого инструмента независимо, когда активны несколько инструментов. Например, когда к устройству прикасаются несколько пальцев, каждому пальцу должен быть присвоен отдельный идентификатор отслеживания, который будет использоваться до тех пор, пока палец остается на контакте. Идентификаторы отслеживания можно использовать повторно, когда связанные с ними инструменты выходят за пределы диапазона. -
ABS_MT_SLOT
: (необязательно) Сообщает идентификатор слота инструмента при использовании протокола мультитач Linux «B». Для получения более подробной информации обратитесь к документации протокола multi-touch Linux. -
BTN_TOUCH
: (ОБЯЗАТЕЛЬНО) Указывает, касается ли инструмент устройства. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (необязательно) Сообщает о состоянии кнопки . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (необязательно) Сообщает тип инструмента .
-
- Если определены оси как для протокола с одним касанием, так и для протокола с несколькими касаниями, то используются только оси с несколькими касаниями, а оси с одним касанием игнорируются.
Минимальные и максимальные значения осей
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
иABS_MT_POSITION_Y
определяют границы активной области устройства в единицах поверхности, специфичных для устройства. В случае сенсорного экрана активная область описывает часть сенсорного устройства, которая фактически закрывает дисплей.Для сенсорного экрана система автоматически интерполирует сообщаемые позиции касания в единицах поверхности, чтобы получить позиции касания в пикселях дисплея согласно следующему расчету:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Сенсорный экран может сообщать о касаниях за пределами указанной активной области.
Касания, инициированные за пределами активной области, не передаются приложениям, но могут использоваться для виртуальных клавиш.
Прикосновения, которые инициируются внутри активной области или которые входят в область отображения и выходят из нее, доставляются в приложения. Следовательно, если касание начинается внутри границ приложения, а затем выходит за пределы активной области, приложение может получать события касания с отрицательными координатами дисплея или за пределами экрана. Это ожидаемое поведение.
Сенсорное устройство никогда не должно привязывать координаты касания к границам активной области. Если касание выходит за пределы активной области, о нем следует сообщить как о том, что оно находится за пределами активной области, или о нем не следует сообщать вообще.
Например, если палец пользователя касается верхнего левого угла сенсорного экрана, он может сообщить координаты (minX, minY). Если палец продолжает выходить за пределы активной области, сенсорный экран должен либо начать сообщать координаты с компонентами, меньшими, чем minX и minY, например (minX — 2, minY — 3), либо вообще перестать сообщать о касании. Другими словами, сенсорный экран не должен сообщать (minX, minY), когда палец пользователя действительно касается за пределами активной области.
Привязка координат касания к краю экрана создает искусственную жесткую границу вокруг края экрана, которая не позволяет системе плавно отслеживать движения, входящие или выходящие за пределы области отображения.
Значения, сообщаемые
ABS_PRESSURE
илиABS_MT_PRESSURE
, если они вообще сообщаются, должны быть ненулевыми, когда инструмент касается устройства, и нулевыми в противном случае, чтобы указать, что инструмент зависает.Предоставление информации о давлении не является обязательным , но настоятельно рекомендуется. Приложения могут использовать информацию о давлении для реализации рисования, чувствительного к давлению, и других эффектов.
Значения, сообщаемые
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
илиABS_MT_WIDTH_MINOR
, должны быть ненулевыми, когда инструмент касается устройства, и нулевыми в противном случае, но это не обязательно. Например, сенсорное устройство может измерять размер контактов для касания пальцами, но не для контактов стилуса.Информация о размере отчета не является обязательной , но настоятельно рекомендуется. Приложения могут использовать информацию о давлении для реализации рисования с учетом размера и других эффектов.
Значения, сообщаемые
ABS_DISTANCE
илиABS_MT_DISTANCE
должны приближаться к нулю, когда инструмент касается устройства. Расстояние может оставаться отличным от нуля, даже когда инструмент находится в прямом контакте. Точные значения, сообщаемые, зависят от способа, которым аппаратное обеспечение измеряет расстояние.Передача информации о расстоянии не является обязательной , но рекомендуется для стилусных устройств.
Значения, сообщаемые
ABS_TILT_X
иABS_TILT_Y
должны быть равны нулю, когда инструмент перпендикулярен устройству. Ненулевой наклон указывает на то, что инструмент удерживается под наклоном.Предполагается, что углы наклона по осям X и Y заданы в градусах от перпендикуляра. Центральная точка (идеально перпендикулярная) определяется соотношением
(max + min) / 2
для каждой оси. Значения меньше центральной точки представляют наклон вверх или влево, значения больше центральной точки представляют наклон вниз или вправо.InputReader
преобразует компоненты наклона X и Y в перпендикулярный угол наклона в диапазоне от 0 доPI / 2
радиан и угол плоской ориентации в диапазоне от-PI
доPI
радиан. Результатом этого представления является описание ориентации, совместимое с тем, что используется для описания прикосновений пальцев.Сообщение информации о наклоне не является обязательным , но рекомендуется для стилусных устройств.
Если тип инструмента сообщается
ABS_MT_TOOL_TYPE
, он заменяет любую информацию о типе инструмента, сообщаемуюBTN_TOOL_*
. Если информация о типе инструмента вообще недоступна, тип инструмента по умолчанию равенMotionEvent.TOOL_TYPE_FINGER
.Инструмент считается активным на основании следующих условий:
При использовании протокола одного касания инструмент активен, если
BTN_TOUCH
илиBTN_TOOL_*
равен 1.Это условие подразумевает, что
InputReader
должен иметь хотя бы некоторую информацию о природе инструмента, будь то касание или, по крайней мере, его тип инструмента. Если информация недоступна, предполагается, что инструмент неактивен (вне диапазона).- При использовании протокола мультитач «А» инструмент активен всякий раз, когда он появляется в последнем отчете о синхронизации. Когда инструмент перестает появляться в отчетах о синхронизации, он перестает существовать.
- При использовании протокола мультитач «B» инструмент активен, пока у него есть активный слот. Когда слот очищается, инструмент перестает существовать.
- Инструмент определяется как зависший на основании следующих условий:
- Если это инструмент
BTN_TOOL_MOUSE
илиBTN_TOOL_LENS
, то инструмент не зависает, даже если выполняется любое из следующих условий. - Если инструмент активен и водитель сообщает информацию о давлении, а сообщаемое давление равно нулю, то инструмент зависает.
- Если инструмент активен и драйвер поддерживает код клавиши
BTN_TOUCH
, аBTN_TOUCH
имеет нулевое значение, то инструмент зависает.
- Если это инструмент
-
InputReader
поддерживает протоколы мультитач «A» и «B». Новые драйверы должны использовать протокол «B», но любой из них работает. Начиная с Android 4.0, возможно, потребуется изменить драйверы сенсорного экрана, чтобы они соответствовали спецификации протокола ввода Linux.
Могут потребоваться следующие изменения:
Когда инструмент становится неактивным (палец поднимается вверх), он перестает появляться в последующих отчетах синхронизации мультитач. Когда все инструменты становятся неактивными (все пальцы поднимаются вверх), драйвер должен отправить пустой пакет отчета о синхронизации, например
SYN_MT_REPORT
за которым следуетSYN_REPORT
.В предыдущих версиях Android предполагалось, что о событиях «вверх» будет сообщаться путем отправки значения давления, равного 0. Старое поведение было несовместимо со спецификацией протокола ввода Linux и больше не поддерживается.
Информацию о физическом давлении или силе сигнала следует сообщать с помощью
ABS_MT_PRESSURE
.Предыдущие версии Android получали информацию о давлении из
ABS_MT_TOUCH_MAJOR
. Старое поведение было несовместимо со спецификацией протокола ввода Linux и больше не поддерживается.- Информация о размере сенсорного экрана должна передаваться с помощью
ABS_MT_TOUCH_MAJOR
.Предыдущие версии Android получали информацию о размере из
ABS_MT_TOOL_MAJOR
. Старое поведение было несовместимо со спецификацией протокола ввода Linux и больше не поддерживается.
Управление сенсорным устройством
Ниже приводится краткое описание работы сенсорного устройства на Android.
-
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
Определение: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Указывает тип сенсорного устройства.
Если значение равно
touchScreen
, сенсорное устройство представляет собой сенсорный экран, связанный с дисплеем.Если значение равно
touchPad
, сенсорное устройство представляет собой сенсорную панель, не связанную с дисплеем.Если значением является
pointer
, сенсорное устройство представляет собой сенсорную панель, не связанную с дисплеем, и его движения используются для непрямых мультитач-жестов указателя .Если установлено значение
default
, система автоматически определяет тип устройства в соответствии с алгоритмом классификации.
Обратитесь к разделу «Классификация» для получения более подробной информации о том, как тип устройства влияет на поведение сенсорного устройства.
В Android 3 и более ранних версиях все сенсорные устройства считались сенсорными экранами.
touch.orientationAware
Определение: touch.orientationAware
= 0
| 1
Указывает, должно ли сенсорное устройство реагировать на изменения ориентации экрана.
Если значение равно
1
, положения касания, сообщаемые сенсорным устройством, поворачиваются при каждом изменении ориентации дисплея.Если значение равно
0
, положения касания, сообщаемые сенсорным устройством, невосприимчивы к изменениям ориентации дисплея.
Значение по умолчанию — 1
, если устройство имеет сенсорный экран, 0
в противном случае.
Система различает внутренние и внешние сенсорные экраны и дисплеи. Внутренний сенсорный экран с поддержкой ориентации поворачивается в зависимости от ориентации внутреннего дисплея. Внешний сенсорный экран с поддержкой ориентации поворачивается в зависимости от ориентации внешнего дисплея.
Осведомленность об ориентации используется для поддержки поворота сенсорных экранов на таких устройствах, как Nexus One. Например, когда устройство поворачивается по часовой стрелке на 90 градусов от его естественной ориентации, абсолютные положения касаний переназначаются таким образом, что касание в верхнем левом углу абсолютной системы координат сенсорного экрана регистрируется как касание в верхнем левом углу. угол повернутой системы координат дисплея. Это сделано для того, чтобы сообщения о касаниях регистрировались в той же системе координат, которую приложения используют для рисования своих визуальных элементов.
До Honeycomb предполагалось, что все сенсорные устройства поддерживают ориентацию.
touch.gestureMode
Определение: touch.gestureMode
= pointer
| spots
| default
Указывает режим представления для жестов указателя. Это свойство конфигурации актуально только в том случае, если сенсорное устройство имеет тип указателя .
Если значением является
pointer
, жесты сенсорной панели отображаются в виде курсора, аналогичного указателю мыши.Если значение —
spots
, жесты сенсорной панели представлены привязкой, которая представляет центр тяжести жеста, и набором круглых пятен, которые представляют положение отдельных пальцев.
Значением по умолчанию является pointer
, если задано входное свойство INPUT_PROP_SEMI_MT
, или в противном spots
.
Поля X и Y
Поля X и Y предоставляют информацию о положении центра области контакта.
Расчет
Расчет прост: информация о положении от сенсорного драйвера линейно интерполируется в выходную систему координат.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchMajor, touchMinor,toolMajor,toolMinor, поля размера
Поля touchMajor
и touchMinor
описывают приблизительные размеры области контакта в выходных единицах (пикселях).
toolMajor
toolMinor
описывают примерные размеры самого инструмента в выходных единицах (пикселях).
Поле size
описывает нормализованный размер касания относительно максимально возможного касания, которое может ощутить сенсорное устройство. Наименьший возможный нормализованный размер равен 0,0 (нет контакта или он неизмерим), а максимально возможный нормализованный размер равен 1,0 (область датчика насыщена).
Если можно измерить и приблизительную длину, и ширину, поле touchMajor
указывает более длинный размер, а поле touchMinor
указывает более короткий размер области контакта. Если можно измерить только приблизительный диаметр области контакта, поля touchMajor
и touchMinor
равны.
Аналогично, toolMajor
указывает более длинный размер, а toolMinor
указывает более короткий размер площади поперечного сечения инструмента.
Если сенсорный размер недоступен, но доступен размер инструмента, то размер инструмента устанавливается равным сенсорному размеру. И наоборот, если размер инструмента недоступен, но доступен сенсорный размер, то сенсорный размер устанавливается равным размеру инструмента.
Сенсорные устройства измеряют или сообщают о размере касания и размере инструмента различными способами. Текущая реализация поддерживает три различных типа измерений: диаметр, площадь и геометрическую ограничивающую рамку в единицах поверхности.
Определение: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Указывает тип измерения, используемый драйвером сенсорного экрана для определения размера сенсорного экрана и размера инструмента.
Если значение равно
none
, размер устанавливается равным нулю.Если значение
geometric
, предполагается, что размер указан в тех же единицах площади, что и положение, поэтому он масштабируется таким же образом.Если значение равно
diameter
, предполагается, что размер пропорционален диаметру (ширине) касания или инструмента.Если значением является
area
, предполагается, что размер пропорционален площади касания или инструмента.Если значение равно
default
, система используетgeometric
калибровку, если доступна осьraw.touchMajor
илиraw.toolMajor
, в противном случае она не использует калибровкуnone
.
сенсорный.размер.масштаб
Определение: touch.size.scale
= <неотрицательное число с плавающей запятой>
Указывает постоянный масштабный коэффициент, используемый при калибровке.
Значение по умолчанию — 1.0
.
Touch.size.bias
Определение: touch.size.bias
= <неотрицательное число с плавающей запятой>
Определяет постоянное значение смещения, используемое при калибровке.
Значение по умолчанию — 0.0
.
touch.size.isSummed
Определение: touch.size.isSummed
= 0
| 1
Указывает, будет ли размер сообщаться как сумма размеров всех активных контактов или сообщаться индивидуально для каждого контакта.
Если значение равно
1
, сообщаемый размер делится на количество контактов перед использованием.Если значение равно
0
, указанный размер используется как есть.
Значение по умолчанию — 0
.
Некоторые сенсорные устройства, особенно устройства «Semi-MT», не могут различать отдельные размеры нескольких контактов, поэтому они сообщают об измерении размера, которое представляет их общую площадь или ширину. Для таких устройств это свойство должно иметь значение только 1
. Если вы сомневаетесь, установите это значение на 0
.
Расчет
Расчет полей touchMajor
, touchMinor
, toolMajor
, toolMinor
и size
зависит от заданных параметров калибровки.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
поле давления
Поле pressure
описывает приблизительное физическое давление, приложенное к сенсорному устройству, как нормализованное значение от 0,0 (без прикосновения) до 1,0 (нормальное давление).
Нулевое давление указывает на то, что инструмент зависает.
сенсорное.давление.калибровка
Определение: touch.pressure.calibration
= none
| physical
| amplitude
| default
Указывает тип измерения, используемый сенсорным драйвером для сообщения о давлении.
Если значение равно
none
, давление неизвестно, поэтому оно устанавливается равным 1,0 при касании и 0,0 при наведении курсора.Если значение
physical
, предполагается, что ось давления измеряет фактическую физическую интенсивность давления, приложенного к сенсорной панели.Если значение равно
amplitude
, предполагается, что ось давления измеряет амплитуду сигнала, которая связана с размером контакта и приложенным давлением.Если значение установлено
default
, система используетphysical
калибровку, если доступна ось давления, в противном случаеnone
использует ее.
сенсорное.давление.шкала
Определение: touch.pressure.scale
= <неотрицательный номер с плавающей запятой>
Определяет постоянный масштабный коэффициент, используемый в калибровке.
Значение по умолчанию составляет 1.0 / raw.pressure.max
.
Расчет
Расчет поля pressure
зависит от указанных параметров калибровки.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Поля ориентации и наклона
Поле orientation
описывает ориентацию прикосновения и инструмента как угловое измерение. Ориентация 0
указывает на то, что основная ось ориентирована вертикально, -PI/2
указывает на то, что основная ось ориентирована слева, PI/2
указывает на то, что основная ось ориентирована вправо. Когда присутствует инструмент стилуса, диапазон ориентации можно описать в диапазоне полного круга от -PI
или PI
.
Поле tilt
описывает наклон инструмента как угловое измерение. Наклон 0
указывает на то, что инструмент перпендикулярно поверхности. Наклон PI/2
указывает на то, что инструмент плоский на поверхности.
touch.orientation.calibration
Определение: touch.orientation.calibration
= none
| interpolated
| vector
| default
Определяет тип измерения, используемого сенсорным драйвером, для сообщений о ориентации.
- Если значение
none
, ориентация неизвестна, поэтому она установлена на 0. - Если значение
interpolated
, ориентация линейно интерполируется так, что необработанное значениеraw.orientation.min
карты на-PI/2
и необработанное значениеraw.orientation.max
Карты вPI/2
. Центральное значение(raw.orientation.min + raw.orientation.max) / 2
карты до0
. - Если значение является
vector
, ориентация интерпретируется как упакованное векторное согласие двух подписанных 4-битных полей. Это представление используется в деталях протокола на основе объектов Atmel. При декодировании вектор дает угол ориентации и величину доверия. Величина доверия используется для масштабирования информации о размере, если только она не геометрическая. - Если значение по
default
, система используетinterpolated
калибровку, если доступна ось ориентации, в противном случаеnone
используется.
Расчет
Расчет полей orientation
и tilt
зависит от указанных параметров калибровки и доступного входа.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
Поле расстояния
Поле distance
описывает расстояние между инструментом и поверхностью сенсорного устройства. Значение 0,0 указывает на прямой контакт, а большие значения указывают на увеличение расстояния от поверхности.
touch.distance.calibration
Определение: touch.distance.calibration
= none
| scaled
| default
Определяет тип измерения, используемый драйвером, чтобы сообщить о расстоянии.
Если значение
none
, расстояние неизвестно, поэтому оно установлено на 0.Если значение
scaled
, сообщаемое расстояние умножается на коэффициент постоянного масштаба.Если значение по
default
, система используетscaled
калибровку, если доступна ось расстояния, в противном случаеnone
используется.
touch.distance.scale
Определение: touch.distance.scale
= <неотрицательный номер с плавающей запятой>
Определяет постоянный масштабный коэффициент, используемый в калибровке.
Значение по умолчанию составляет 1.0
.
Расчет
Расчет поля distance
зависит от указанных параметров калибровки.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Пример
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Примечания к совместимости
Свойства конфигурации для сенсорных устройств значительно изменились в Android мороженое Sandwich 4.0. Все файлы конфигурации устройства ввода для сенсорных устройств должны быть обновлены для использования новых свойств конфигурации.
Старые драйверы сенсорных устройств также могут быть обновлены.
Файлы карты виртуальных ключей
Прикосновенные устройства можно использовать для реализации виртуальных ключей.
Есть несколько способов сделать это, в зависимости от возможностей сенсорного контроллера. Некоторые сенсорные контроллеры могут быть напрямую настроены для реализации мягких клавиш путем установки регистров прошивки. В других случаях желательно выполнить отображение от сенсорных координат до кодов ключей в программном обеспечении.
Когда виртуальные ключи реализуются в программном обеспечении, ядро должно экспортировать файл карты виртуальных ключей под названием virtualkeys.<devicename>
как свойство доски. Например, если драйверы устройства сенсорного экрана сообщают о своем имени как «Touchyfeely», тогда файл карты виртуальных ключей должен иметь Path /sys/board_properties/virtualkeys.touchyfeely
.
Файл карты виртуальных ключей описывает координаты и коды ключей Linux виртуальных ключей на сенсорном экране.
В дополнение к файлу карты виртуальных клавиш, должен быть соответствующий файл макета клавиш и файл карты клавиш, чтобы отобразить коды ключей Linux с кодами ключей Android и указать тип устройства клавиатуры (обычно SPECIAL_FUNCTION
).
Синтаксис
Файл карты виртуальных ключей - это простой текстовый файл, состоящий из последовательности описаний макета виртуальных ключей, отделенных новыми линиями или колонами.
Строки комментариев начинаются с «#» и продолжаются до конца строки.
Каждый виртуальный ключ описывается 6 компонентами с разрешением толстой кишки:
-
0x01
: код версии. Всегда должен быть0x01
. - <Код клавиши Linux>: код клавиши Linux виртуального ключа.
- <CenterX>: x пиксельная координата центра виртуального ключа.
- <Centery>: координата пикселя Y Центра виртуального ключа.
- <sidth>: ширина виртуального ключа в пикселях.
- <Высота>: высота виртуального ключа в пикселях.
Все координаты и размеры указаны в терминах системы координат отображения.
Вот файл карты виртуальных ключей, записанный на одной строке.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
Один и тот же файл карты виртуальных ключей также может быть записан на нескольких строках.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
В приведенном выше примере сенсорный экран имеет разрешение 480x800. Соответственно, все виртуальные ключи имеют координату <centerery> 835, что немного ниже видимой области сенсорного экрана.
Первый ключ имеет код сканирования Linux 158
( KEY_BACK
), Centerx 55
, центр 835
, ширина 90
и высота 55
.
Пример
Файл карты виртуальных ключей: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Файл макета ключа: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Ключевой карта символов: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Непрямые жесты указателя с несколькими привязками
В режиме указателя система интерпретирует следующие жесты:
- Нажмите с одним пальцем: нажмите.
- Одиночное движение пальца: переместите указатель.
- Кнопка «Движение с одним пальцем» плюс нажатие: перетащите указатель.
- Два движения пальца Оба пальца движутся в одном направлении: перетащите область под указателем в этом направлении. Сам указатель не движется.
- Два движения пальца оба пальца движутся друг с другом или в разных направлениях: сковорода/масштаб/поверните область, окружающую указатель. Сам указатель не движется.
- Многократное движение пальца: жест свободной формы.
Отказ от пальмы
По состоянию на Android 13 система может автоматически отклонять входы из пальм, когда включена встроенная структура. Внутренние пользовательские решения по-прежнему поддерживаются, хотя их, возможно, нужно изменить, чтобы вернуть флаг TOOL_TYPE_PALM
, когда обнаруживается ладонь. Встроенная структура также работает в сочетании с пользовательскими решениями.
Фактическая модель рассматривает первые 90 мс данных жестов, в текущем указателе и по окружающим указателям, а затем рассматривает, насколько далеко от края дисплея прикосновения. Затем он определяет, для каждого указателя, какие из указателей являются ладонями. Он также учитывает размер каждого контакта, о чем сообщается touchMajor
и touchMinor
. Фреймворк Android затем удаляет указатели, которые отмечены как ладони из сенсорного потока.
Если указатель уже был отправлен в приложения, то система либо:
- (Если есть другие активные указатели) Отменяет указатель с помощью набора
ACTION_POINTER_UP
иFLAG_CANCELED
. - (Если это единственный указатель) отменяет указатель с помощью
ACTION_CANCEL
.
Общественный API, MotionEvent.FLAG_CANCELED
, указывает, что текущее событие не должно запускать действие пользователя. Этот флаг установлен как для ACTION_CANCEL
, так и для ACTION_POINTER_UP
.
Если указатель пальмы не был отправлен в приложения, то система просто бросает указатель.
Включить отказ от пальмы
- В вашем драйвере прикосновения используйте макрос
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