捏缩放 - 获取触摸坐标

问题描述:

我正在开发使用WinJS的Windows 8应用程序。我正在尝试获取捏和缩放的触摸坐标。我已经通过Windows.UI.Input.GestureRecognizer实现了手势操作处理程序。当触发“操作更新”事件时,我触发了我的捏和缩放逻辑,event.delta.scale不是1.当操作发生在“操作更新”事件对象内部时,我发现只有1个位置的坐标。我如何从这些信息中计算出手指触摸坐标?捏缩放 - 获取触摸坐标

另外我怎么知道哪个触摸坐标位置属于?我发现这个位置在事件对象内重复多次 - 在event.position和event.detail [0] .position

我想要实现的是捏放和放大图表(很像地图)。请帮助我解决这些问题。

公共类PZBehavior:行为 {

bool _isDragging; 
    bool _isPinching; 
    Point _ptPinchPositionStart; 

    private Image _imgZoom; 
    private ScaleTransform _scaleTransform; 
    private RotateTransform _rotateTransform; 
    private TranslateTransform _translateTransform; 
    private MatrixTransform _previousTransform; 

    private TransformGroup _parentGroup; 
    private TransformGroup _currentTransform; 



    protected override void OnAttached() 
    { 
     _imgZoom = AssociatedObject; 
     _imgZoom.RenderTransform = BuildTrasnformGroup(); 
     var listener = GestureService.GetGestureListener(AssociatedObject); 
     listener.DragStarted += DragStarted; 
     listener.DragDelta += DragDelta; 
     listener.DragCompleted += DragCompleted; 
     listener.PinchStarted += PinchStarted; 
     listener.PinchDelta += PinchDelta; 
     listener.PinchCompleted += PinchCompleted; 
    } 


    private TransformGroup BuildTrasnformGroup() 
    { 
     _parentGroup = new TransformGroup(); 
     _currentTransform = new TransformGroup(); 

     _previousTransform = new MatrixTransform(); 

     _scaleTransform = new ScaleTransform(); 
     _rotateTransform = new RotateTransform(); 
     _translateTransform = new TranslateTransform(); 

     _currentTransform.Children.Add(_scaleTransform); 
     _currentTransform.Children.Add(_rotateTransform); 
     _currentTransform.Children.Add(_translateTransform); 

     _parentGroup.Children.Add(_previousTransform); 
     _parentGroup.Children.Add(_currentTransform); 

     return _parentGroup; 

    } 


    void PinchCompleted(object sender, PinchGestureEventArgs e) 
    { 
     if (_isPinching) 
     { 
      TransferTransforms(); 
      _isPinching = false; 
     } 
    } 

    void PinchDelta(object sender, PinchGestureEventArgs e) 
    { 
     if (_isPinching) 
     { 
      // Set scaling 
      _scaleTransform.ScaleX = e.DistanceRatio; 
      _scaleTransform.ScaleY = e.DistanceRatio; 

      // Optionally set rotation 

      _rotateTransform.Angle = e.TotalAngleDelta; 

      // Set translation 
      Point ptPinchPosition = new Point(0,0); 
      _translateTransform.X = ptPinchPosition.X - _ptPinchPositionStart.X; 
      _translateTransform.Y = ptPinchPosition.Y - _ptPinchPositionStart.Y; 
     } 
    } 

    void PinchStarted(object sender, PinchStartedGestureEventArgs e) 
    { 
     _isPinching = e.OriginalSource == _imgZoom; 

     if (_isPinching) 
     { 
      // Set transform centers 
      Point ptPinchCenter = e.GetPosition(_imgZoom); 
      ptPinchCenter = _previousTransform.Transform(ptPinchCenter); 

      _scaleTransform.CenterX = ptPinchCenter.X; 
      _scaleTransform.CenterY = ptPinchCenter.Y; 

      _rotateTransform.CenterX = ptPinchCenter.X; 
      _rotateTransform.CenterY = ptPinchCenter.Y; 

      _ptPinchPositionStart = new Point(0,0); 
     } 
    } 

    void DragCompleted(object sender, DragCompletedGestureEventArgs e) 
    { 
     if (_isDragging) 
     { 
      TransferTransforms(); 
      _isDragging = false; 
     } 
    } 

    void DragDelta(object sender, DragDeltaGestureEventArgs e) 
    { 
     if (_isDragging) 
     { 
      _translateTransform.X += e.HorizontalChange; 
      _translateTransform.Y += e.VerticalChange; 
     } 
    } 

    void DragStarted(object sender, DragStartedGestureEventArgs e) 
    { 
     _isDragging = e.OriginalSource == _imgZoom; 

    } 

    void TransferTransforms() 
    { 
     _previousTransform.Matrix = Multiply(_previousTransform.Matrix, _currentTransform.Value); 

     // Set current transforms to default values 
     _scaleTransform.ScaleX = _scaleTransform.ScaleY = 1; 
     _scaleTransform.CenterX = _scaleTransform.CenterY = 0; 

     _rotateTransform.Angle = 0; 
     _rotateTransform.CenterX = _rotateTransform.CenterY = 0; 

     _translateTransform.X = _translateTransform.Y = 0; 
    } 

    Matrix Multiply(Matrix a, Matrix b) 
    { 
     return new Matrix(a.M11 * b.M11 + a.M12 * b.M21, 
          a.M11 * b.M12 + a.M12 * b.M22, 
          a.M21 * b.M11 + a.M22 * b.M21, 
          a.M21 * b.M12 + a.M22 * b.M22, 
          a.OffsetX * b.M11 + a.OffsetY * b.M21 + b.OffsetX, 
          a.OffsetX * b.M12 + a.OffsetY * b.M22 + b.OffsetY); 
    } 
}