我正在使用GestureRecognizer来检测拖拽和挤压手势。
ManipulationStarted、ManipulationUpdated和ManipulationCompleted事件提供了收缩和拖动所需的平移值和缩放值。
GestureRecognizer中没有关于接触点数量的信息。
如何在GestureRecognizer中区分拖拽和挤压
发布于 2013-10-22 23:41:43
好吧,我觉得它很老套(因为大多数解决方案似乎都是为了一个可用的WinRT应用程序),但你可以创建一个List<uint>来跟踪当前屏幕上指针的数量。您必须在与之交互的任何控件上处理PointerPressed事件(假设您使用的是Canvas),以便在指针被按下时“捕获”它们。这就是您要填充List<uint>的地方。不要忘记在ManipulationCompleted事件结束时清除列表,以及在任何手势结束时触发的任何事件(如PointerReleased、PointerCanceled和PointerCaptureLost)。也许确保在ManipulationStarted事件中清除该列表将是一个好主意。也许你可以试一试,看看它对你有什么效果。
在ManipulationCompleted事件中,您可以检查列表是否恰好包含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();
}发布于 2012-11-20 22:30:22
这个问题我已经纠结了好几个小时了,看起来WinRT平台并没有提供这个功能。相反,它提供的是Delta.Rotation和Delta.Scale值,以及带有ManipulationUpdated回调参数的Delta.Translation。
如果Delta.Rotation为0(或非常接近零-因为它是浮点值)且Delta.Scale为1(或非常接近1),则可以得出结论:不是收缩操作,正在执行拖动操作,否则它是收缩操作。这不是你能得到的最好的,但它看起来是目前唯一可用的。
https://stackoverflow.com/questions/12645524
复制相似问题