web-dev-qa-db-ja.com

シンプルなタッチジェスチャを検出する

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");
    }
21
Elmo

MainPageクラスには、個別のGestureRecognizerを作成せずに使用できる独自の操作イベントがあることに気付くでしょう。 this.ManipulationModeManipulationModes.Allに設定することで有効にできます。これにより、MainPages TappedRightTappedManipulationStartingManipulationStartedManipulationDelta、およびManipulationCompletedイベントで応答を確認できます。

GestureRecongnizerをこれに従って動作させる限り ブログ およびこれ MSDNフォーラム投稿 MainPageのPointerMovedPointerReleased、および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;
    }
}

Documentation によると、 CrossSlide イベントをGestureRecongnizerに追加し、 CrossSlideThresholds とDirectionを設定して有効にする必要があります。最後のリンクから:

CrossSlidingをサポートするには、GestureSettingsプロパティでCrossSlideを設定する必要があります。 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;
37
Mark Hall