Ввод данных и сенсоры
Унифицированные события указателя
В любой ситуации, когда вы хотите напрямую работать с сенсорным экраном, мышью или пером, возможно, для реализации части языка касаний подобным образом, используйте события MSPointer*. Большинство приложений для рисования или художественной обработки изображений, например, используют эти события для отслеживания и отображения на экране результатов взаимодействия с пользователем. Снова напомню, что указатель – это способ для рассмотрения ввода данных, имеющий более низкий уровень, чем жесты, что мы увидим в следующем разделе. Какие модели ввода данных вы испоьзуете, зависит от типа событий, с которыми вы хотите работать.
Совет. События указателей не вызываются, если система пытается выполнить манипуляцию наподобие сдвига или масштабирования. Для того чтобы отключить у элемента манипуляции, задайте -ms-content-zooming: none или -ms-touch-action: none, и избегайте использования стилей -ms-touch-action в pan-x, pan-y, pinch-zoom, и manipulation.
Как и в слудчае с другими событиями, вы можете прослушивать события MSPointer* для любых подходящих элементов, помня, опять же, что эти события транслируются в традиционные события мыши, поэтому не следует прослушивать и те и другие. Специальные события, которые описаны ниже, даны в порядке их типичной последовательности:
- MSPointerOver (http://msdn.microsoft.com/library/windows/apps/hh465907.aspx) указатель перемещен в пределы границ элемента из внешнего пространства.
- MSPointerHover (http://msdn.microsoft.com/library/windows/apps/hh465895.aspx) указатель завис над элементом (обычно – только для пера или мыши).
- MSPointerDown (http://msdn.microsoft.com/library/windows/apps/hh465891.aspx) указатель опустился на элемент.
- MSPointerMove (http://msdn.microsoft.com/library/windows/apps/hh465899.aspx) указатель переместился по элементу.
- MSPointerUp (http://msdn.microsoft.com/library/windows/apps/hh465912.aspx) указатель был освобожден над элементом. (Если элемент ранее захватил касание, автоматически вызывается msReleasePointerCapture.) Обратите внимание на то, что если указатель был перемещен за пределы элемента и освобожден, элемент получит событие MSPointerOut, но не MSPointerUp.
- MSPointerCancel (http://msdn.microsoft.com/library/windows/apps/hh868516.aspx) событие указателя отменено системой.
- MSPointerOut (http://msdn.microsoft.com/library/windows/apps/hh465904.aspx) указатель вышел за пределы элемента, что так же происходит с событием MSPointerUp. Это последнее событие указателя, которое примет элемент.
- MSGotPointerCapture (http://msdn.microsoft.com/library/windows/apps/hh465875.aspx) указатель захвачен элементом.
- MSLostPointerCapture (http://msdn.microsoft.com/library/windows/apps/hh465883.aspx) захват указателя потерян элементом.
Это – те имена, которые используют с addEventListener. Эквивалентные имена свойств имеют, как обычно, форму onmspointerdown. Должно быть очевидным то, что некоторые из этих событий могут не вызываться указателями всех типов. Сенсорные экраны, например, обычно не вызывают события зависания указателя над элементом, хотя некоторые из них, те, что могут определять близость пальца, способны на это.
Совет. Если по каким-то причинам вы хотите предотвратить трансляцию события MSPointer* в традиционное событие мыши, вызовите метод eventArgs.preventDefault внутри соответствующего обработчика события.
Упражнение PointerEvents, которое можно найти среди дополнительной информации к курсу, как показано на рис. 3.1., позволяет вам увидеть, что происходит с событиями мыши, указателей, жестов, выборочно показывая группы событий на экране.
Внутри обработчиков для всех событий MSPointer*, объект eventArgs содержит полный набор свойств. Одно из них, pointerType, идентифицирует тип устройства ввода: серсорная панель (2), ручка (3), и мышь (4). Эти свойства позволяют вам, если нужно, реализовывать различное поведение для различных способов ввода. Каждый объект события так же содержит укникальное значение pointerId, которое содержит информацию о штрихе или линии для конкретной точки контакта, что позволяет согласовывать первоначальное событие MSPointerDown с последующими событиями. Когда мы взглянем, в следующем разделе, на жесты, мы так же увидим, как ипользовать pointerId события MSPointerDown для сопоставления жеста с указателем.
Полный набор свойств, который поступает вместе с событием, на самом деле, слишком велик, чтобы его здесь приводить, так как он содержит множество обычных свойств DOM (http://msdn.microsoft.com/library/windows/apps/hh831236.aspx) вместе со свойствами, имеющими отношение к указателю, из объекта типа MSPointerEvent (http://msdn.microsoft.com/library/windows/apps/hh441233.aspx). Лучший способ посмотреть, что там находится – это запустить какой-нибудь код, наподобие примера "Ввод данных: обработка события указателя DOM" (http://code.msdn.microsoft.com/windowsapps/Input-DOM-pointer-and-2e5697ed) (это – приложение для рисования на элементе управления canvas), установить точку останова внутри обработчика одного из событий, и посмотреть на объект события. Нижеприведенная таблица описывает некоторые из свойсвт (и несколько методов), имеющих отношение к нашей беседе.
Свойства | Описание |
---|---|
currentPoint | Объект типа Windows.UI.Input.PointerPoint (http://msdn.microsoft.com/library/windows/apps/windows.ui.input.pointerpoint.aspx) . Он содержит множество других свойств, таких, как pointerDevice (объект Windows.Input.Device.PointerDevice как онисано ранее в этой лекции) и свойство, имеющее название properties, являющееся объектом типа Windows.UI.Input.PointerPointProperties. |
pointerType | Источником события может быть сенсорная панель, перо или мышь: MSPOINTER_TYPE_TOUCH (2), MSPOINTER_TYPE_PEN (3), and MSPOINTER_TYPE_MOUSE (4). Вы можете использовать это, если необходимы различные действия в зависимости от типа устройства ввода. |
pointerId | Уникальный идентификатор контакта. Он остается тем же самым в течение времени существования указателя. Если нужно, вы можете вызвать Windows.Devices.Input.getPointerDevice (http://msdn.microsoft.com/library/windows/apps/windows.devices.input.pointerdevice.getpointerdevice.aspx) с этим идинтификатором для получения объекта PointerDevice (http://msdn.microsoft.com/library/windows/apps/windows.devices.input.pointerdevice.aspx), который описывает возможности устройства ввода, как описано выше в данной лекции. |
type | Имя события, как, например, "MSPointerDown". |
x, screenX, y, screenY | Координаты X и Y центральной точки указателя, спозиционированные относительно экрана. |
clientX, clientY | Координаты X и Y центральной точки указателя, спозиционированные относительно пользовательской области приложения. |
offsetX, offsetY | Координаты X и Y центральной точки указателя, спозиционированные относительно элемента. |
button | Определяет кнопку, нажатую пользователем (на мыши или другом устройстве ввода с кнопками). Левой кнопке соответствует значение 0, средней – 1, правой – 2. Эти значения могут комбинироваться с помощью побитовой операции OR для одновременного нажатия нескольких кнопок (chord). |
ctrlKey, altKey, shiftKey | Показывает, была ли нажата определенная клавиша клавиатуры, когда произошло событие указателя. |
hwTimestamp | Отметка времени (в микросекундах), показывающая время, когда событие было получено от устройства. |
relatedTarget | Предоставляет элемент, соответствующий текущему событию Provides the element related to the current event, например, событие MSPointerOut. Предоставляет элемент, к которому было осуществлено перемещение точки касания. Может иметь значение null. |
isPrimary | Показывает, является ли данный указатель основным в сценарии с несколькими касания (как указатель мыши). |
Свойства, присутствующие в зависимости от поддержки устройством (если поддержки нет, будут иметь значение 0) | |
width, height | Ширина контактной точки и высота, заданная pointerId. |
pressure | Нажим ручки, нормализованное к диапазону значений 0 – 255. |
rotation | Движение курсора по часовой стрелке вокруг собственной основной оси в диапазоне 0 – 359. |
tiltX | Наклон влево-вправо от нормального положения датчика (обычно – от перпендикуляра к поверхности), значение в диапазоне от -90 (влево), до 90 (вправо). |
tiltY | Наклон вперед-назад от нормального положения датчика (обычно – от перпендикуляра к поверхности) в диапазоне от -10 (вперед, от пользователя), до 90 (назад, к пользователю). |
Методы | |
currentPoint, getCurrentPoint | Предоставляет объект типа Windows.UI.Input.PointerPoint (http://msdn.microsoft.com/library/windows/apps/windows.ui.input.pointerpoint.aspx) для текущего указателя ввода, соответствующее целевому элементу (currentPoint) или заданному элементу (getCurrentPoint) |
intermediatePoints,getIntermediatPoints | Предоставляет историю PointerPoint для текущего указателя по отношению к целевому элементу (intermediatePoint) или заданному элементу (getIntermediatePoints) |
Весьма поучительно запустить вышеупомянутый пример на устройстве, поддерживающем несколько одновременных касаний, так как раздельная обработка каждого pointerId позволяет вам рисовать несколькими пальцами одновременно.