Поделиться через


GestureRecognizer Класс

Определение

Обеспечивает распознавание жестов и манипуляций, прослушивателей событий и параметров.

public ref class GestureRecognizer sealed
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
class GestureRecognizer final
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class GestureRecognizer final
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class GestureRecognizer final
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
public sealed class GestureRecognizer
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
public sealed class GestureRecognizer
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.None)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class GestureRecognizer
function GestureRecognizer()
Public NotInheritable Class GestureRecognizer
Наследование
Object Platform::Object IInspectable GestureRecognizer
Атрибуты

Требования к Windows

Семейство устройств
Windows 10 (появилось в 10.0.10240.0)
API contract
Windows.Foundation.UniversalApiContract (появилось в v1.0)

Примеры

Здесь мы настроим объект GestureRecognizer с коллекцией обработчиков входных событий для обработки ввода указателя и жеста ввода. Дополнительные сведения о том, как прослушивать и обрабатывать события среда выполнения Windows, см. в статье Общие сведения о событиях и перенаправленных событиях. Полную реализацию см. в примере базовых входных данных .

class ManipulationInputProcessor
{
    GestureRecognizer recognizer;
    UIElement element;
    UIElement reference;
    TransformGroup cumulativeTransform;
    MatrixTransform previousTransform;
    CompositeTransform deltaTransform;

    public ManipulationInputProcessor(GestureRecognizer gestureRecognizer, UIElement target, UIElement referenceFrame)
    {
        recognizer = gestureRecognizer;
        element = target;
        reference = referenceFrame;
        // Initialize the transforms that will be used to manipulate the shape
        InitializeTransforms();
        // The GestureSettings property dictates what manipulation events the
        // Gesture Recognizer will listen to.  This will set it to a limited
        // subset of these events.
        recognizer.GestureSettings = GenerateDefaultSettings();
        // Set up pointer event handlers. These receive input events that are used by the gesture recognizer.
        element.PointerPressed += OnPointerPressed;
        element.PointerMoved += OnPointerMoved;
        element.PointerReleased += OnPointerReleased;
        element.PointerCanceled += OnPointerCanceled;
        // Set up event handlers to respond to gesture recognizer output
        recognizer.ManipulationStarted += OnManipulationStarted;
        recognizer.ManipulationUpdated += OnManipulationUpdated;
        recognizer.ManipulationCompleted += OnManipulationCompleted;
        recognizer.ManipulationInertiaStarting += OnManipulationInertiaStarting;
    }

    public void InitializeTransforms()
    {
        cumulativeTransform = new TransformGroup();
        deltaTransform = new CompositeTransform();
        previousTransform = new MatrixTransform() { Matrix = Matrix.Identity };
        cumulativeTransform.Children.Add(previousTransform);
        cumulativeTransform.Children.Add(deltaTransform);
        element.RenderTransform = cumulativeTransform;
    }

    // Return the default GestureSettings for this sample
    GestureSettings GenerateDefaultSettings()
    {
        return GestureSettings.ManipulationTranslateX |
            GestureSettings.ManipulationTranslateY |
            GestureSettings.ManipulationRotate |
            GestureSettings.ManipulationTranslateInertia |
            GestureSettings.ManipulationRotateInertia;
    }

    // Route the pointer pressed event to the gesture recognizer.
    // The points are in the reference frame of the canvas that contains the rectangle element.
    void OnPointerPressed(object sender, PointerRoutedEventArgs args)
    {
        // Set the pointer capture to the element being interacted with so that only it
        // will fire pointer-related events
        element.CapturePointer(args.Pointer);
        // Feed the current point into the gesture recognizer as a down event
        recognizer.ProcessDownEvent(args.GetCurrentPoint(reference));
    }

    // Route the pointer moved event to the gesture recognizer.
    // The points are in the reference frame of the canvas that contains the rectangle element.
    void OnPointerMoved(object sender, PointerRoutedEventArgs args)
    {
        // Feed the set of points into the gesture recognizer as a move event
        recognizer.ProcessMoveEvents(args.GetIntermediatePoints(reference));
    }

    // Route the pointer released event to the gesture recognizer.
    // The points are in the reference frame of the canvas that contains the rectangle element.
    void OnPointerReleased(object sender, PointerRoutedEventArgs args)
    {
        // Feed the current point into the gesture recognizer as an up event
        recognizer.ProcessUpEvent(args.GetCurrentPoint(reference));
        // Release the pointer
        element.ReleasePointerCapture(args.Pointer);
    }

    // Route the pointer canceled event to the gesture recognizer.
    // The points are in the reference frame of the canvas that contains the rectangle element.
    void OnPointerCanceled(object sender, PointerRoutedEventArgs args)
    {
        recognizer.CompleteGesture();
        element.ReleasePointerCapture(args.Pointer);
    }

    // When a manipulation begins, change the color of the object to reflect
    // that a manipulation is in progress
    void OnManipulationStarted(object sender, ManipulationStartedEventArgs e)
    {
        Border b = element as Border;
        b.Background = new SolidColorBrush(Windows.UI.Colors.DeepSkyBlue);
    }

    // Process the change resulting from a manipulation
    void OnManipulationUpdated(object sender, ManipulationUpdatedEventArgs e)
    {
        previousTransform.Matrix = cumulativeTransform.Value;
        // Get the center point of the manipulation for rotation
        Point center = new Point(e.Position.X, e.Position.Y);
        deltaTransform.CenterX = center.X;
        deltaTransform.CenterY = center.Y;
        // Look at the Delta property of the ManipulationDeltaRoutedEventArgs to retrieve
        // the rotation, X, and Y changes
        deltaTransform.Rotation = e.Delta.Rotation;
        deltaTransform.TranslateX = e.Delta.Translation.X;
        deltaTransform.TranslateY = e.Delta.Translation.Y;
    }

    // When a manipulation that's a result of inertia begins, change the color of the
    // the object to reflect that inertia has taken over
    void OnManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e)
    {
        Border b = element as Border;
        b.Background = new SolidColorBrush(Windows.UI.Colors.RoyalBlue);
    }

    // When a manipulation has finished, reset the color of the object
    void OnManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
    {
        Border b = element as Border;
        b.Background = new SolidColorBrush(Windows.UI.Colors.LightGray);
    }

    // Modify the GestureSettings property to only allow movement on the X axis
    public void LockToXAxis()
    {
        recognizer.CompleteGesture();
        recognizer.GestureSettings |= GestureSettings.ManipulationTranslateY | GestureSettings.ManipulationTranslateX;
        recognizer.GestureSettings ^= GestureSettings.ManipulationTranslateY;
    }

    // Modify the GestureSettings property to only allow movement on the Y axis
    public void LockToYAxis()
    {
        recognizer.CompleteGesture();
        recognizer.GestureSettings |= GestureSettings.ManipulationTranslateY | GestureSettings.ManipulationTranslateX;
        recognizer.GestureSettings ^= GestureSettings.ManipulationTranslateX;
    }

    // Modify the GestureSettings property to allow movement on both the X and Y axes
    public void MoveOnXAndYAxes()
    {
        recognizer.CompleteGesture();
        recognizer.GestureSettings |= GestureSettings.ManipulationTranslateX | GestureSettings.ManipulationTranslateY;
    }

    // Modify the GestureSettings property to enable or disable inertia based on the passed-in value
    public void UseInertia(bool inertia)
    {
        if (!inertia)
        {
            recognizer.CompleteGesture();
            recognizer.GestureSettings ^= GestureSettings.ManipulationTranslateInertia | GestureSettings.ManipulationRotateInertia;
        }
        else
        {
            recognizer.GestureSettings |= GestureSettings.ManipulationTranslateInertia | GestureSettings.ManipulationRotateInertia;
        }
    }

    public void Reset()
    {
        element.RenderTransform = null;
        recognizer.CompleteGesture();
        InitializeTransforms();
        recognizer.GestureSettings = GenerateDefaultSettings();
    }
}

Примеры

Архивные примеры

Комментарии

Вы можете создать объект жеста для каждого соответствующего элемента при запуске приложения. Однако этот подход может не очень хорошо масштабироваться в зависимости от количества объектов жестов, которые необходимо создать (например, головоломка с сотнями частей).

В этом случае можно динамически создавать объекты жестов в событии указателя и уничтожать их в событии MSGestureEnd . Такой подход хорошо масштабируется, но приводит к некоторым издержкам из-за создания и освобождения этих объектов.

Кроме того, можно статически выделять и динамически управлять пулом многократно используемых объектов жестов.

Примечание

Этот класс не является гибким, что означает, что необходимо учитывать его потоковую модель и поведение маршалинга. Дополнительные сведения см. в разделах Потоки и маршалинг (C++/CX) и Использование объектов среда выполнения Windows в многопоточной среде (.NET).

Дополнительные сведения об использовании функций перекрестного слайда см. в разделе Рекомендации по перекрестному слайду. Пороговые расстояния, используемые при взаимодействии в форме скольжения по диагонали, показаны на схеме ниже.

Снимок экрана, показывающий процессы выбора и перетаскивания.

Свойства PivotRadius и PivotCenter используются только при обнаружении входных данных с одним указателем. Они не влияют на ввод нескольких указателей. Значение этих свойств должно регулярно обновляться во время взаимодействия.

Поворот поддерживается GestureRecognizer только в том случае, если manipulationRotate задается с помощью свойства GestureSettings .

Поворот не поддерживается для входных данных с одним указателем, если значение PivotRadius равно 0.

Журнал версий

Версия Windows Версия пакета SDK Добавленная стоимость
2004 19041 HoldMaxContactCount
2004 19041 HoldMinContactCount
2004 19041 HoldRadius
2004 19041 HoldStartDelay
2004 19041 TapMaxContactCount
2004 19041 TapMinContactCount
2004 19041 TranslationMaxContactCount
2004 19041 TranslationMinContactCount

Конструкторы

GestureRecognizer()

Инициализирует новый экземпляр объекта GestureRecognizer .

Свойства

AutoProcessInertia

Возвращает или задает значение, указывающее, создаются ли манипуляции во время инерции автоматически.

CrossSlideExact

Возвращает или задает значение, указывающее, сообщается ли точное расстояние от начального контакта до конца взаимодействия между слайдами. По умолчанию пороговое значение небольшого расстояния вычитается из первой позиции, сообщаемой системой для взаимодействия между слайдами. Если этот флаг установлен, пороговое значение расстояния не вычитается из начальной позиции.

Примечание

Это пороговое значение расстояния предназначено для учета любого небольшого перемещения контакта после первоначального обнаружения. Это помогает системе различать перекрестное скольжение и сдвиг, а также гарантирует, что жест касания не интерпретируется как .

CrossSlideHorizontally

Возвращает или задает значение, указывающее, является ли ось перекрестного слайда горизонтальной.

CrossSlideThresholds

Возвращает или задает значения, указывающие пороговые значения расстояния для взаимодействия CrossSliding .

GestureSettings

Возвращает или задает значение, указывающее параметры жеста и манипуляции, поддерживаемые приложением.

HoldMaxContactCount

Возвращает или задает максимальное количество точек контакта, необходимое для распознавания события Windows.UI.Input.GestureRecognizer.Holding .

HoldMinContactCount

Возвращает или задает минимальное количество точек контакта, необходимое для распознавания события Windows.UI.Input.GestureRecognizer.Holding .

HoldRadius

Возвращает или задает радиус точек контакта, распознаваемых для события Windows.UI.Input.GestureRecognizer.Holding .

HoldStartDelay

Возвращает или задает пороговое значение времени, в течение которого контакты распознаются для события Windows.UI.Input.GestureRecognizer.Holding .

InertiaExpansion

Возвращает или задает значение, указывающее относительное изменение размера объекта от начала инерции до конца инерции (когда изменение размера или масштабирование завершено).

InertiaExpansionDeceleration

Возвращает или задает значение, указывающее скорость замедления от начала инерции до конца инерции (когда манипуляция с изменением размера или расширением завершена).

InertiaRotationAngle

Возвращает или задает значение, указывающее окончательный угол поворота объекта в конце инерции (когда манипуляция поворота завершена).

InertiaRotationDeceleration

Возвращает или задает значение, указывающее скорость замедления от начала инерции до конца инерции (когда манипуляция поворотом завершена).

InertiaTranslationDeceleration

Возвращает или задает значение, указывающее скорость замедления от начала инерции до конца инерции (когда манипуляция преобразования завершена).

InertiaTranslationDisplacement

Возвращает или задает значение, указывающее относительное изменение расположения на экране объекта от начала инерции до конца инерции (когда манипуляция с преобразованием завершена).

IsActive

Возвращает значение, указывающее, обрабатывается ли взаимодействие.

IsInertial

Возвращает значение, указывающее, обрабатывается ли манипуляция во время инерции (входные точки не активны).

ManipulationExact

Возвращает или задает значение, указывающее, сообщается ли точное расстояние от начального контакта до конца взаимодействия. По умолчанию пороговое значение небольшого расстояния вычитается из первой разницы, сообщаемой системой. Это пороговое значение расстояния предназначено для учета незначительных перемещений контакта при обработке жеста касания. Если этот флаг установлен, пороговое значение расстояния не вычитается из первого разностного значения.

MouseWheelParameters

Возвращает набор свойств, связанных с кнопкой колесика устройства мыши.

PivotCenter

Возвращает или задает центральную точку для взаимодействия с поворотом при обнаружении входных данных с одним указателем.

PivotRadius

Возвращает или задает радиус от центра PivotCenter до входных данных указателя для взаимодействия с поворотом при обнаружении одного входного указателя.

ShowGestureFeedback

Возвращает или задает значение, указывающее, отображается ли визуальная обратная связь во время взаимодействия.

TapMaxContactCount

Возвращает или задает максимальное количество точек контакта, необходимое для распознавания события Windows.UI.Input.GestureRecognizer.Tapped .

TapMinContactCount

Возвращает или задает минимальное количество точек контакта, необходимое для распознавания события Windows.UI.Input.GestureRecognizer.Tapped .

TranslationMaxContactCount

Возвращает или задает максимальное количество точек контакта, необходимое для распознавания события преобразования (или сдвига).

TranslationMinContactCount

Возвращает или задает минимальное количество точек контакта, необходимое для распознавания события преобразования (или сдвига).

Методы

CanBeDoubleTap(PointerPoint)

Определяет, можно ли интерпретировать касание как второе касание жеста двойного касания.

CompleteGesture()

Заставляет распознаватель жестов завершить взаимодействие.

ProcessDownEvent(PointerPoint)

Обрабатывает входные данные указателя и вызывает события GestureRecognizer , соответствующие действию указателя вниз для жестов и манипуляций, заданных свойством GestureSettings .

ProcessInertia()

Выполняет вычисления инерции и вызывает различные события инерции.

ProcessMouseWheelEvent(PointerPoint, Boolean, Boolean)

Обрабатывает входные данные указателя и вызывает события GestureRecognizer , соответствующие действию колесика мыши для жестов и манипуляций, заданных свойством GestureSettings .

ProcessMoveEvents(IVector<PointerPoint>)

Обрабатывает входные данные указателя и вызывает события GestureRecognizer , соответствующие действию перемещения указателя для жестов и манипуляций, заданных свойством GestureSettings .

ProcessUpEvent(PointerPoint)

Обрабатывает входные данные указателя и вызывает события GestureRecognizer , соответствующие действию указателя вверх для жестов и манипуляций, заданных свойством GestureSettings .

События

CrossSliding

Происходит, когда пользователь выполняет слайд или жест прокрутки (через один сенсорный контакт) в области содержимого, которая поддерживает сдвиг только по одной оси. Жест должен выполняться в направлении, перпендикулярном этой оси сдвига.

Примечание

Прокрутка — это короткий жест скользящего движения, который приводит к выделению, в то время как жест более длинного слайда пересекает пороговое значение расстояния и приводит к переупорядочению действия. Жесты прокрутки и скольжения показаны на следующей схеме. Схема, показывающая действия выбора и перетаскивания.

Dragging

Происходит, когда пользователь выполняет слайд или жест прокрутки с помощью мыши, пера или пера (один контакт).

Holding

Происходит при выполнении пользователем жеста нажатия и удержания (одним касанием, мышью или контактом пера или пера).

ManipulationCompleted

Происходит, когда входные точки поднимаются и все последующие движения (преобразование, расширение или поворот) через инерцию заканчиваются.

ManipulationInertiaStarting

Происходит, когда во время манипуляции поднимаются все точки контакта и скорость манипуляции достаточно значительна, чтобы инициировать поведение инерции (преобразование, расширение или поворот продолжаются после подъема входных указателей).

ManipulationStarted

Происходит при инициировании одной или нескольких входных точек и начале последующего движения (преобразование, расширение или поворот).

ManipulationUpdated

Происходит после запуска одной или нескольких точек ввода и последующего перемещения (преобразования, расширения или поворота).

RightTapped

Происходит, когда входные данные указателя интерпретируются как жест касания правой кнопкой мыши, независимо от устройства ввода.

  • Щелчок правой кнопкой мыши
  • Нажатие кнопки пера
  • Нажатие и удержание касанием или пером
Tapped

Происходит, когда входные данные указателя интерпретируются как жест касания.

Применяется к

См. также раздел