GestureRecognizer滑动手势

时间:2014-04-11 09:06:34

标签: c# windows-runtime microsoft-metro windows-store-apps

我正在尝试通过挂钩GestureRecognizer事件来检测CrossSliding的水平滑动手势。

        _gr = new GestureRecognizer
        {
            GestureSettings = GestureSettings.ManipulationTranslateX |
                              GestureSettings.ManipulationTranslateY |
                              GestureSettings.CrossSlide
        };

        _gr.CrossSliding += OnSwipe;
        _gr.ManipulationStarted += OnManipulationStarted;
        _gr.ManipulationUpdated += OnManipulationUpdated;
        _gr.ManipulationCompleted += OnManipulationCompleted;

        _gr.CrossSlideHorizontally = true;

从上面的代码中可以看出,不仅要检测滑动,还要拖动手势。

我的问题是我似乎无法自定义滑动手势。

我想自定义用户在将手势视为滑动之前拖动指针的最小速度和距离。在当前状态下,即使最慢和最小的水平拖动动作也会触发CrossSliding事件。

我看到允许自定义手势的CrossSlideThresholds类,但我看不出它如何用于配置滑动手势的速度和距离。

CrossSliding事件是否是检测滑动的正确方法?如果是这样,我该如何配置速度和滑动距离?

如果没有,我该如何检测滑动手势?

1 个答案:

答案 0 :(得分:0)

我找不到任何内置方法来检测滑动,因此我实施了自己的检测方法。

代码检测水平滑动。

显示的方法是GestureRecognizer事件的事件处理程序:

readonly Stopwatch _manipulationTimer = new Stopwatch();

public void OnManipulationStarted(ManipulationStartedEventArgs e)
{
    _manipulationTimer.Restart();
}

public void OnManipulationCompleted(ManipulationCompletedEventArgs e)
{
    var millis = _manipulationTimer.ElapsedMilliseconds;

    if (Math.Abs(e.Cumulative.Translation.Y) < MaxVerticalSwipeDistanceInPix &&
        Math.Abs(e.Cumulative.Translation.X) > MinHorizontalSwipeDistanceInPix && 
        millis > MinSwipeDurationInMillis && 
        millis < MaxSwipeDurationInMillis && 
        Math.Abs(e.Cumulative.Scale - 1) < 0.01 // 1 touch point 
        )
    { 
        var leftSwipe = e.Cumulative.Translation.X < 0;
        if (leftSwipe)
        {
        }
        else // right swipe
        {               
        }
    }

    _manipulationTimer.Stop();
    _manipulationTimer.Reset();
}