2

我正在使用GestureRecognizer来检测拖动和捏合手势。

,ManipulationStarted和事件提供捏和拖动所需的平移和缩放值ManipulationUpdatedManipulationCompleted

但是我不知道如何区分拖动(1 个触摸点)和捏合(2 个触摸点)手势。中没有关于接触点数量的信息GestureRecognizer

如何区分拖动和捏合GestureRecognizer

4

2 回答 2

2

我已经为同一个问题苦苦挣扎了几个小时,看起来 WinRT 平台不提供。它提供的是 Delta.Rotation 和 Delta.Scale 值以及 Delta.Translation 以及 ManipulationUpdated 回调的参数。

如果 Delta.Rotation 为 0(或非常接近于零 - 因为它是一个浮点值)且 Delta.Scale 为 1(或非常接近 1),您可以得出结论,捏合操作不是这种情况,而拖动操作是被携带,否则它是一个捏操作。这不是你能得到的最好的,但它看起来是目前唯一可用的。

于 2012-11-20T14:30:21.903 回答
2

好吧,我觉得它非常 hacky(因为大多数解决方案似乎都是针对可用的 WinRT 应用程序),但是您可以创建一个List<uint>来跟踪当前在屏幕上的指针数量。您必须在PointerPressed与之交互的任何控件上处理事件(假设您正在使用 a Canvas)以在按下指针时“捕获”指针。那是您将填充List<uint>. 不要忘记在事件结束时清除列表ManipulationCompleted以及在任何手势结束时触发的任何事件(如PointerReleasedPointerCanceledPointerCaptureLost)。确保在ManipulationStarted事件中清除列表可能是个好主意。也许您可以尝试一下,看看它对您有用。

在这种情况ManipulationCompleted下,您可以检查您的 List 是否正好包含 2 个元素(PointerIds)。如果是这样,那么你知道这是一个捏/缩放。

这是它的样子:

private void Canvas_PointerPressed(object sender, PointerRoutedEventArgs e)
{
    var ps = e.GetIntermediatePoints(null);
    if (ps != null && ps.Count > 0)
    {
        this.gestureRecognizer.ProcessDownEvent(ps[0]);
        this.pointerList.Add(e.Pointer.PointerId);
        e.Handled = true;
    }
}

private void gestureRecognizer_ManipulationCompleted(GestureRecognizer sender, ManipulationCompletedEventArgs args)
{         
    if (this.pointerList.Count == 2)
    {
       // This could be your pinch or zoom.
    }
    else
    {
       // This could be your drag.
    }

    // Don't forget to clear the list.
    this.pointerList.Clear();
}

// Make sure you clear your list in whatever events make sense.
private void Canvas_PointerReleased(object sender, PointerRoutedEventArgs e)
{
    this.pointerList.Clear();
}

private void Canvas_PointerCanceled(object sender, PointerRoutedEventArgs e)
{
    this.pointerList.Clear();
}
于 2013-10-22T15:41:43.227 回答