Подтвердить что ты не робот

Обнаружение простых жестов касания

Может ли кто-нибудь объяснить, как обнаружить простые жесты касания в приложении WinRT? Я попытался использовать класс GestureRecognizer, но он не сработал:

    public MainPage()
    {
        this.InitializeComponent();
        Windows.UI.Input.GestureRecognizer gr = new Windows.UI.Input.GestureRecognizer();
        gr.CrossSliding += gr_CrossSliding;
        gr.Dragging += gr_Dragging;
        gr.Holding += gr_Holding;
        gr.ManipulationCompleted += gr_ManipulationCompleted;
        gr.ManipulationInertiaStarting += gr_ManipulationInertiaStarting;
        gr.ManipulationStarted += gr_ManipulationStarted;
        gr.ManipulationUpdated += gr_ManipulationUpdated;
        gr.RightTapped += gr_RightTapped;
        gr.Tapped += gr_Tapped;
        gr.GestureSettings = Windows.UI.Input.GestureSettings.ManipulationRotate | Windows.UI.Input.GestureSettings.ManipulationTranslateX | Windows.UI.Input.GestureSettings.ManipulationTranslateY |
        Windows.UI.Input.GestureSettings.ManipulationScale | Windows.UI.Input.GestureSettings.ManipulationRotateInertia | Windows.UI.Input.GestureSettings.ManipulationScaleInertia |
        Windows.UI.Input.GestureSettings.ManipulationTranslateInertia | Windows.UI.Input.GestureSettings.Tap;

    }

    void gr_Tapped(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.TappedEventArgs args)
    {
        Debug.WriteLine("gr_Tapped");
    }
    void gr_RightTapped(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.RightTappedEventArgs args)
    {
        Debug.WriteLine("gr_RightTapped");
    }
    void gr_Holding(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.HoldingEventArgs args)
    {
        Debug.WriteLine("gr_Holding");
    }
    void gr_Dragging(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.DraggingEventArgs args)
    {
        Debug.WriteLine("gr_Dragging");
    }
    void gr_CrossSliding(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.CrossSlidingEventArgs args)
    {
        Debug.WriteLine("gr_CrossSliding");
    }
    void gr_ManipulationUpdated(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.ManipulationUpdatedEventArgs args)
    {
        Debug.WriteLine("gr_ManipulationUpdated");
    }
    void gr_ManipulationStarted(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.ManipulationStartedEventArgs args)
    {
        Debug.WriteLine("gr_ManipulationStarted");
    }
    void gr_ManipulationCompleted(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.ManipulationCompletedEventArgs args)
    {
        Debug.WriteLine("gr_ManipulationCompleted");
    }
    void gr_ManipulationInertiaStarting(Windows.UI.Input.GestureRecognizer sender, Windows.UI.Input.ManipulationInertiaStartingEventArgs args)
    {
        Debug.WriteLine("gr_ManipulationInertiaStarting");
    }
4b9b3361

Ответ 1

Если вы заметите, что класс MainPage имеет свои собственные события манипуляции, которые вы можете использовать, не создавая отдельный GestureRecognizer. Вы можете включить его, установив this.ManipulationMode на ManipulationModes.All. Это позволит вам видеть ответы на события MainPages Tapped, RightTapped, ManipulationStarting, ManipulationStarted, ManipulationDelta и ManipulationCompleted.

Что касается того, чтобы GestureRecongnizer работал в соответствии с этим Blog, и этот Публикация форума MSDN вам нужно будет обрабатывать события MainPage PointerMoved, PointerReleased и PointerPressed.

Windows.UI.Input.GestureRecognizer gr = new Windows.UI.Input.GestureRecognizer();  

public MainPage()
{
    this.InitializeComponent();
    this.PointerPressed += MainPage_PointerPressed;
    this.PointerMoved += MainPage_PointerMoved;
    this.PointerReleased += MainPage_PointerReleased;
    gr.CrossSliding += gr_CrossSliding;    
    gr.Dragging += gr_Dragging;    
    gr.Holding += gr_Holding;    
    gr.ManipulationCompleted += gr_ManipulationCompleted;    
    gr.ManipulationInertiaStarting += gr_ManipulationInertiaStarting;    
    gr.ManipulationStarted += gr_ManipulationStarted;    
    gr.ManipulationUpdated += gr_ManipulationUpdated;    
    gr.RightTapped += gr_RightTapped;    
    gr.Tapped += gr_Tapped;    
    gr.GestureSettings = Windows.UI.Input.GestureSettings.ManipulationRotate | Windows.UI.Input.GestureSettings.ManipulationTranslateX | Windows.UI.Input.GestureSettings.ManipulationTranslateY |    
    Windows.UI.Input.GestureSettings.ManipulationScale | Windows.UI.Input.GestureSettings.ManipulationRotateInertia | Windows.UI.Input.GestureSettings.ManipulationScaleInertia |    
    Windows.UI.Input.GestureSettings.ManipulationTranslateInertia | Windows.UI.Input.GestureSettings.Tap; 
}

void MainPage_PointerReleased(object sender, PointerRoutedEventArgs e)
{
    var ps = e.GetIntermediatePoints(null);
    if (ps != null && ps.Count > 0)
    {
        gr.ProcessUpEvent(ps[0]);
        e.Handled = true;
        gr.CompleteGesture();
    }
}

void MainPage_PointerMoved(object sender, PointerRoutedEventArgs e)
{
    gr.ProcessMoveEvents(e.GetIntermediatePoints(null));
    e.Handled = true;
}

void MainPage_PointerPressed(object sender, PointerRoutedEventArgs e)
{
    var ps = e.GetIntermediatePoints(null);
    if (ps != null && ps.Count > 0)
    {
        gr.ProcessDownEvent(ps[0]);
        e.Handled = true;
    }
}

В соответствии с Документация вам необходимо включить CrossSlide Событие, добавив его в свой GestureRecongnizer и настроив CrossSlideThresholds и Direction. Из последней ссылки:

CrossSlide должен быть установлен в свойстве GestureSettings для поддержки CrossSliding. По умолчанию пороговые значения CrossSliding отключены. Используйте CrossSlideThresholds для установки этих значений.

Пример:

Windows.UI.Input.CrossSlideThresholds cst = new Windows.UI.Input.CrossSlideThresholds();
cst.SelectionStart = 2;
cst.SpeedBumpStart = 3;
cst.SpeedBumpEnd = 4;
cst.RearrangeStart = 5;
gr.CrossSlideHorizontally = true;
gr.CrossSlideThresholds = cst;
gr.CrossSliding += gr_CrossSliding;

и убедитесь, что он добавлен в ваш GestureSettings

gr.GestureSettings = Windows.UI.Input.GestureSettings.ManipulationRotate | Windows.UI.Input.GestureSettings.ManipulationTranslateX |
                     Windows.UI.Input.GestureSettings.ManipulationScale | Windows.UI.Input.GestureSettings.ManipulationRotateInertia |
                     Windows.UI.Input.GestureSettings.ManipulationScaleInertia | Windows.UI.Input.GestureSettings.ManipulationTranslateInertia |
                     Windows.UI.Input.GestureSettings.Tap | Windows.UI.Input.GestureSettings.CrossSlide;