我正在使用GestureRecognizer
来检测拖动和捏合手势。
,ManipulationStarted
和事件提供捏和拖动所需的平移和缩放值ManipulationUpdated
。ManipulationCompleted
但是我不知道如何区分拖动(1 个触摸点)和捏合(2 个触摸点)手势。中没有关于接触点数量的信息GestureRecognizer
。
如何区分拖动和捏合GestureRecognizer
?
我正在使用GestureRecognizer
来检测拖动和捏合手势。
,ManipulationStarted
和事件提供捏和拖动所需的平移和缩放值ManipulationUpdated
。ManipulationCompleted
但是我不知道如何区分拖动(1 个触摸点)和捏合(2 个触摸点)手势。中没有关于接触点数量的信息GestureRecognizer
。
如何区分拖动和捏合GestureRecognizer
?
我已经为同一个问题苦苦挣扎了几个小时,看起来 WinRT 平台不提供。它提供的是 Delta.Rotation 和 Delta.Scale 值以及 Delta.Translation 以及 ManipulationUpdated 回调的参数。
如果 Delta.Rotation 为 0(或非常接近于零 - 因为它是一个浮点值)且 Delta.Scale 为 1(或非常接近 1),您可以得出结论,捏合操作不是这种情况,而拖动操作是被携带,否则它是一个捏操作。这不是你能得到的最好的,但它看起来是目前唯一可用的。
好吧,我觉得它非常 hacky(因为大多数解决方案似乎都是针对可用的 WinRT 应用程序),但是您可以创建一个List<uint>
来跟踪当前在屏幕上的指针数量。您必须在PointerPressed
与之交互的任何控件上处理事件(假设您正在使用 a Canvas
)以在按下指针时“捕获”指针。那是您将填充List<uint>
. 不要忘记在事件结束时清除列表ManipulationCompleted
以及在任何手势结束时触发的任何事件(如PointerReleased
、PointerCanceled
和PointerCaptureLost
)。确保在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();
}