Android поддерживает различные сенсорные экраны и сенсорные панели, в том числе планшеты со стилусом.
Сенсорные экраны — это сенсорные устройства, которые связаны с дисплеем таким образом, что у пользователя создается впечатление, что он непосредственно манипулирует элементами на экране.
Сенсорные панели — это сенсорные устройства, которые не связаны с дисплеем, например планшетный дигитайзер. Сенсорные панели обычно используются для указания или для абсолютного непрямого позиционирования или управления пользовательским интерфейсом на основе жестов.
Сенсорные устройства могут иметь кнопки, функции которых аналогичны кнопкам мыши.
Сенсорными устройствами иногда можно манипулировать с помощью различных инструментов, таких как пальцы или стилус, в зависимости от базовой технологии сенсорного датчика.
Сенсорные устройства иногда используются для реализации виртуальных клавиш. Например, на некоторых устройствах Android область датчика сенсорного экрана выходит за край дисплея и выполняет двойную функцию как часть чувствительной к прикосновениям клавиатуры.
Из-за большого разнообразия сенсорных устройств Android использует большое количество свойств конфигурации для описания характеристик и желаемого поведения каждого устройства.
Классификация сенсорных устройств
Устройство ввода классифицируется как мультисенсорное , если выполняются оба следующих условия:
Устройство ввода сообщает о наличии абсолютных осей
ABS_MT_POSITION_X
иABS_MT_POSITION_Y
.На устройстве ввода нет кнопок геймпада. Это условие устраняет неоднозначность с некоторыми геймпадами, которые сообщают оси с кодами, перекрывающимися с кодами осей MT.
Устройство ввода классифицируется как устройство с одним касанием , если выполняются оба следующих условия:
Устройство ввода не классифицируется как мультисенсорное. Устройство ввода классифицируется либо как устройство с одним касанием, либо как устройство с несколькими касаниями, а не как то и другое одновременно.
Устройство ввода сообщает о наличии абсолютных осей
ABS_X
иABS_Y
, а также о наличии кода клавишиBTN_TOUCH
.
После того как устройство ввода было классифицировано как сенсорное, наличие виртуальных клавиш определяется путем попытки загрузить файл сопоставления виртуальных клавиш для устройства. Если доступна карта виртуальных клавиш, то также загружается файл раскладки клавиш для устройства.
Обратитесь к разделу ниже о расположении и формате файлов карты виртуальных ключей.
Затем система загружает файл конфигурации устройства ввода для сенсорного устройства.
Все встроенные сенсорные устройства должны иметь файлы конфигурации устройств ввода. Если файл конфигурации устройства ввода отсутствует, система выберет конфигурацию по умолчанию, подходящую для типичных сенсорных периферийных устройств общего назначения, таких как внешние сенсорные экраны 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
.
Наведение и прикосновение к инструментам
Инструменты могут либо соприкасаться с сенсорным устройством, либо находиться в пределах досягаемости и парить над ним. Не все сенсорные устройства способны обнаруживать присутствие инструмента, зависшего над сенсорным устройством. Те, которые это делают, например дигитайзеры со стилусом на основе радиочастот, часто могут обнаруживать, когда инструмент находится в ограниченном диапазоне дигитайзера.
Компонент 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
должен иметь хотя бы некоторую информацию о характере инструмента, будь то касание или, по крайней мере, его тип инструмента. Если информация недоступна, предполагается, что инструмент неактивен (вне диапазона).При использовании протокола multi-touch «A» инструмент активен всякий раз, когда он появляется в самом последнем отчете о синхронизации. Когда инструмент перестает отображаться в отчетах о синхронизации, он перестает существовать.
При использовании мультисенсорного протокола «B» инструмент активен до тех пор, пока у него есть активный слот. Когда слот очищается, инструмент перестает существовать.
Инструмент определяется как зависший на основании следующих условий:
Если инструмент
BTN_TOOL_MOUSE
илиBTN_TOOL_LENS
, то инструмент не зависает, даже если выполняется одно из следующих условий.Если инструмент активен и водитель сообщает информацию о давлении, а сообщаемое давление равно нулю, то инструмент зависает.
Если инструмент активен и драйвер поддерживает код клавиши
BTN_TOUCH
, аBTN_TOUCH
имеет нулевое значение, инструмент зависает.
InputReader
поддерживает оба протокола multi-touch «A» и «B». Новые драйверы должны использовать протокол «B», но любой из них будет работать.Начиная с Android Ice Cream Sandwich 4.0, возможно, потребуется изменить драйверы сенсорного экрана, чтобы они соответствовали спецификации протокола ввода Linux.
Могут потребоваться следующие изменения:
Когда инструмент становится неактивным (палец идет «вверх»), он должен перестать появляться в последующих отчетах мультитач-синхронизации. Когда все инструменты становятся неактивными (все пальцы идут «вверх»), драйвер должен отправить пустой пакет отчета о синхронизации, такой как
SYN_MT_REPORT
, за которым следуетSYN_REPORT
.В предыдущих версиях Android ожидалось, что о событиях «вверх» будет сообщаться путем отправки значения давления, равного 0. Старое поведение было несовместимо со спецификацией протокола ввода Linux и больше не поддерживается.
Информация о физическом давлении или силе сигнала должна сообщаться с использованием
ABS_MT_PRESSURE
.Предыдущие версии Android извлекали информацию о давлении из
ABS_MT_TOUCH_MAJOR
. Старое поведение было несовместимо со спецификацией протокола ввода Linux и больше не поддерживается.Информация о размере касания должна сообщаться с использованием
ABS_MT_TOUCH_MAJOR
.Предыдущие версии Android извлекали информацию о размере из
ABS_MT_TOOL_MAJOR
. Старое поведение было несовместимо со спецификацией протокола ввода Linux и больше не поддерживается.
Драйверы сенсорных устройств больше не нуждаются в настройке для Android. Опираясь на стандартный протокол ввода Linux, Android может поддерживать более широкий спектр сенсорных периферийных устройств, таких как внешние мультисенсорные сенсорные экраны HID, с использованием немодифицированных драйверов.
Сенсорное управление устройством
Ниже приведен краткий обзор работы сенсорного устройства на Android.
EventHub
считывает необработанные события из драйвераevdev
.InputReader
использует необработанные события и обновляет внутреннее состояние о положении и других характеристиках каждого инструмента. Он также отслеживает состояния кнопок.Если кнопки НАЗАД или ВПЕРЕД были нажаты или отпущены,
InputReader
уведомляетInputDispatcher
о событии клавиши.InputReader
определяет, произошло ли нажатие виртуальной клавиши. Если это так, он уведомляетInputDispatcher
о ключевом событии.InputReader
определяет, было ли касание инициировано в пределах границ дисплея. Если это так, он уведомляетInputDispatcher
о событии касания.Если нет инструментов касания, но есть хотя бы один инструмент с наведением,
InputReader
уведомляетInputDispatcher
о событии наведения.Если тип сенсорного устройства — pointer ,
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
, система автоматически определяет тип устройства в соответствии с алгоритмом классификации.
Дополнительные сведения о том, как тип устройства влияет на поведение сенсорного устройства, см. в разделе « Классификация ».
До Honeycomb все сенсорные устройства считались сенсорными экранами.
touch.orientationAware
Определение: touch.orientationAware
= 0
| 1
Указывает, должно ли сенсорное устройство реагировать на изменение ориентации дисплея.
Если значение равно
1
, положения касания, о которых сообщает сенсорное устройство, поворачиваются всякий раз, когда изменяется ориентация дисплея.Если значение равно
0
, положения касания, о которых сообщает сенсорное устройство, не подвержены изменениям ориентации дисплея.
Значение по умолчанию — 1
, если устройство с сенсорным экраном, в противном случае — 0
.
Система различает внутренние и внешние сенсорные экраны и дисплеи. Внутренний сенсорный экран, учитывающий ориентацию, поворачивается в зависимости от ориентации внутреннего дисплея. Внешний сенсорный экран, учитывающий ориентацию, поворачивается в зависимости от ориентации внешнего дисплея.
Осведомленность об ориентации используется для поворота сенсорных экранов на таких устройствах, как Nexus One. Например, когда устройство поворачивается по часовой стрелке на 90 градусов от его естественной ориентации, абсолютные положения касаний переназначаются таким образом, что касание в верхнем левом углу абсолютной системы координат сенсорного экрана регистрируется как касание в верхнем левом углу. углу повернутой системы координат дисплея. Это сделано для того, чтобы о касаниях сообщалось в той же системе координат, которую приложения используют для отрисовки своих визуальных элементов.
До Honeycomb предполагалось, что все сенсорные устройства учитывают ориентацию.
touch.gestureMode
Определение: 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
, Size
полей
TouchMajor
и TouchMinor
описывают приблизительные размеры области контакта в выходных единицах (пикселях).
ToolMajor
и ToolMinor
описывают приблизительные размеры самого инструмента в выходных единицах (пикселях).
Поле « Size
» описывает нормализованный размер касания относительно максимально возможного касания, которое может воспринимать сенсорное устройство. Наименьший возможный нормализованный размер равен 0,0 (контакт отсутствует или его невозможно измерить), а максимально возможный нормализованный размер равен 1,0 (зона датчика насыщена).
Когда можно измерить и приблизительную длину, и ширину, то поле TouchMajor
указывает более длинный размер, а поле TouchMinor
указывает более короткий размер контактной области. Когда можно измерить только приблизительный диаметр контактной площадки, поля TouchMajor
и TouchMinor
будут равны.
Аналогично, поле ToolMajor
указывает более длинный размер, а поле ToolMinor
указывает более короткий размер площади поперечного сечения инструмента.
Если размер касания недоступен, но доступен размер инструмента, то размер инструмента будет установлен равным размеру касания. И наоборот, если размер инструмента недоступен, но доступен размер касания, то размер касания будет установлен равным размеру инструмента.
Сенсорные устройства измеряют или сообщают о размере касания и размере инструмента различными способами. Текущая реализация поддерживает три различных типа измерений: диаметр, площадь и геометрическую ограничительную рамку в поверхностных единицах.
touch.size.calibration
Определение: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Определяет тип измерения, используемого драйвером сенсорного экрана для сообщения размера касания и размера инструмента.
Если значение равно
none
, размер устанавливается равным нулю.Если значение равно
geometric
, предполагается, что размер указан в тех же единицах поверхности, что и положение, поэтому он масштабируется таким же образом.Если значение равно
diameter
, предполагается, что размер пропорционален диаметру (ширине) касания или инструмента.Если значение равно
area
, предполагается, что размер пропорционален площади касания или инструмента.Если значение по
default
, система используетgeometric
калибровку, если доступна осьraw.touchMajor
илиraw.toolMajor
, в противном случае онаnone
использует калибровку.
touch.size.scale
Определение: 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
Поле « Pressure
» описывает приблизительное физическое давление, прикладываемое к сенсорному устройству, как нормализованное значение от 0,0 (без касания) до 1,0 (полная сила).
Нулевое давление указывает на то, что инструмент зависает.
touch.pressure.calibration
Определение: touch.pressure.calibration
= none
| physical
| amplitude
| default
Указывает тип измерения, используемого драйвером сенсорного экрана для сообщения о давлении.
Если значение равно
none
, давление неизвестно, поэтому оно устанавливается равным 1,0 при касании и 0,0 при наведении.Если значение равно
physical
, предполагается, что ось давления измеряет фактическую физическую интенсивность давления, приложенного к сенсорной панели.If the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses thephysical
calibration if the pressure axis available, otherwise usesnone
.
touch.pressure.scale
Definition: touch.pressure.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0 / raw.pressure.max
.
Calculation
The calculation of the Pressure
field depends on the specified calibration parameters.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Orientation
and Tilt
Fields
The Orientation
field describes the orientation of the touch and tool as an angular measurement. An orientation of 0
indicates that the major axis is oriented vertically, -PI/2
indicates that the major axis is oriented to the left, PI/2
indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI
or PI
.
The Tilt
field describes the inclination of the tool as an angular measurement. A tilt of 0
indicates that the tool is perpendicular to the surface. A tilt of PI/2
indicates that the tool is flat on the surface.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifies the kind of measurement used by the touch driver to report the orientation.
If the value is
none
, the orientation is unknown so it is set to 0.If the value is
interpolated
, the orientation is linearly interpolated such that a raw value ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
.If the value is
vector
, the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.If the value is
default
, the system uses theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Calculation
The calculation of the Orientation
and Tilt
fields depends on the specified calibration parameters and available input.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
Distance
Field
The Distance
field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Specifies the kind of measurement used by the touch driver to report the distance.
If the value is
none
, the distance is unknown so it is set to 0.If the value is
scaled
, the reported distance is multiplied by a constant scale factor.If the value is
default
, the system uses thescaled
calibration if the distance axis available, otherwise usesnone
.
touch.distance.scale
Definition: touch.distance.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
Calculation
The calculation of the Distance
field depends on the specified calibration parameters.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Example
# 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 will 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
Compatibility Notes
The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.
Older touch device drivers may also need to be updated.
Virtual Key Map Files
Touch devices are often used to implement virtual keys.
There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.
When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename>
as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely
.
A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.
In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION
).
Syntax
A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.
Comment lines begin with '#' and continue to the end of the line.
Each virtual key is described by 6 colon-delimited components:
-
0x01
: A version code. Must always be0x01
. - <Linux key code>: The Linux key code of the virtual key.
- <centerX>: The X pixel coordinate of the center of the virtual key.
- <centerY>: The Y pixel coordinate of the center of the virtual key.
- <width>: The width of the virtual key in pixels.
- <height>: The height of the virtual key in pixels.
All coordinates and sizes are specified in terms of the display coordinate system.
Here is a virtual key map file all written on one line.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
The same virtual key map file can also be written on multiple lines.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.
The first key has a Linux scan code of 158
( KEY_BACK
), centerX of 55
, centerY of 835
, width of 90
and height of 55
.
Example
Virtual key map file: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Key layout file: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key character map file: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirect Multi-touch Pointer Gestures
In pointer mode, the system interprets the following gestures:
Single finger tap: click.
Single finger motion: move the pointer.
Single finger motion plus button presses: drag the pointer.
Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
Multiple finger motion: freeform gesture.