Общие сведения о манипуляциях и инерции
Манипуляции позволяют пользователям перемещать, поворачивать элементы пользовательского интерфейса, а также менять их размеры с помощью манипуляторов. Манипулятором является мышь или (в сенсорном сценарии) перо либо палец.
Инерция эмулирует поведение реального мира для движущихся элементов пользовательского интерфейса, имитируя силы трения для этих элементов. Это позволяет элементам перед остановкой постепенно замедлять свое движение (как линейное, так и вращательное). Этот раздел представляет собой введение в манипуляции и инерцию для платформы .NET Framework.
Манипуляции
При манипуляции коллекция манипуляторов рассматривается как составной объект. Приложение может отслеживать изменения составного объекта вместо изменений отдельных компонентов.
Рассмотрим изображение на приведенном ниже рисунке. Пользователь может использовать два манипулятора для перемещения, поворота и масштабирования изображения. Изменения, вызванные каждым манипулятором, обрабатываются вместе с изменениями, вызванными другими манипуляторами.
Например, если на изображении есть два манипулятора (1 и 2), и манипулятор 1 перемещается в направлении +Y (вниз), изменение изображения зависит от манипулятора 2. Если манипулятор 2 также перемещается в направлении +Y (вниз), изображение просто перемещается в направлении +Y. Но если манипулятор 2 не меняется или перемещается в направлении -Y (вверх), изображение уменьшается или поворачивается.
Изображение, управляемое двумя манипуляторами
Обработка манипуляции создает среду, которая следит за подмножеством манипуляторов и интерпретирует их, как действующие совместно, а не независимо. Можно создать одновременно несколько объектов процессоров манипуляции, по одному для каждого элемента пользовательского интерфейса, управление которым применяется в приложении. Процессору манипуляции сообщается, за какими устройствами ввода он будет следить, а он сообщает о манипуляциях с помощью событий .NET.
Процессор манипуляции не получает данных о конкретном элементе, над которым выполняется манипуляция. Приложение независимо применяет изменения к элементу, связанному с конкретным приложением. Например, приложение может применить к изображению преобразование или перерисовывать его для отображения в новом месте либо с новыми размерами или ориентацией.
Манипуляции предназначены для двумерных (2-D) аффинных преобразований. К этим преобразованиям относятся перемещение, поворот и масштабирование.
Части манипуляции
Манипуляция является коллекцией объектов Manipulator2D. Эта агрегатная манипуляция представляется начальной точкой и эллипсом. Начальная точка — это среднее положение всех манипуляторов, используемых для манипуляции элементом. Эллипс обладает радиусом, представляющим собой среднее расстояние от начальной точки до каждого из объектов Manipulator2D.
Манипуляция задается двумя манипуляторами (1 и 2), начальной точкой и эллипсом
При добавлении, перемещении или удалении манипуляторов для элемента пользовательского интерфейса приложение обновляет объект ManipulationProcessor2D, вызывая метод ProcessManipulators(). В момент начала манипуляции возникает событие Started.
Примечание |
---|
Обработка манипуляции более эффективна при использовании среды покадрового обновления.При использовании обработки манипуляции в приложении Microsoft XNA это не является проблемой, так как платформа XNA обеспечивает покадровые обновления с помощью метода Game.Update.В другой среде (например, в WinForms) может понадобиться, чтобы разработчик обеспечил собственную покадровую логику для сбора манипуляций и их периодической отправки в метод ProcessManipulators() в виде пакета. |
При изменении числа манипуляторов или их положения возникает событие Delta. Свойства объекта Manipulation2DDeltaEventArgs, передаваемые обработчику события Delta, определяют изменения начала координат, масштаба, поворота и перемещения, произошедшие с момента последнего события. Начало координат манипуляции изменяется при перемещении манипуляторов, а также при добавлении и удалении манипуляторов. Значения перемещения определяют, какое перемещение по оси X или Y содержит манипуляция.
Приложение перерисовывает элемент пользовательского интерфейса, используя новые значения.
Манипулятор 1 перемещается и вызывает изменение начала координат
Когда из объекта ManipulationProcessor2D удаляется последний манипулятор, связанный с манипуляцией, возникает событие Completed.
Модель обработки манипуляции
Процессор манипуляции использует модель прямого использования. В этой простой модели приложение должно передавать процессору манипуляции данные о любом событии ввода. Событие ввода может быть вызвано любым примитивом ввода, таким как устройство мыши, перо или палец. Этот процесс обеспечивает механизм прямой фильтрации и простую модель использования, поэтому приложение при необходимости может передавать события ввода пакетным образом.
Приложение, чтобы включить примитив ввода в процесс манипуляции, создает из данных примитива ввода структуру Manipulator2D и передает ее процессору манипуляции, используя метод ProcessManipulators(). Затем процессор манипуляции инициирует события, которые приложение должно обработать, чтобы соответствующим образом обновить визуальный компонент.
Модель обработки манипуляции
Инерция
Процессор инерции разрешает приложениям экстраполировать положение, ориентацию и другие свойства элемента пользовательского интерфейса, имитируя поведение реального мира.
Например, когда пользователь дергает элемент, этот элемент может продолжить движение, замедляясь, а затем медленно останавливаясь. Процессор инерции реализует это поведение, вызывая изменение аффинных двумерных значений (начало координат, масштаб, перемещение и поворот) спустя заданное время с заданной скоростью замедления.
Как и в случае обработки манипуляции, процессор манипуляции не использует данных ни о каком конкретном элементе пользовательского интерфейса. Реагируя на события, возникающие для объекта InertiaProcessor2D, приложение независимо применяет изменения к элементу, связанному с этим приложением.
Обработка инерции и обработка манипуляции часто используются совместно. Их интерфейсы похожи, а вызываемые ими события (в некоторых случаях) одинаковы. Обычно обработка инерции начинается после окончания манипуляции элементами пользовательского интерфейса. Это выполняется с помощью прослушивания события Completed запуска обработки инерции из обработчика этого события.