2012-10-15 7 views
5

Je développe une application Windows 8 en utilisant WinJS. J'essaie d'obtenir les coordonnées tactiles pour le pincement et le zoom. J'ai implémenté les gestionnaires de manipulation de gestes via Windows.UI.Input.GestureRecognizer. Je déclenche ma logique de pincement et de zoom lorsque pour l'événement "manipulationupdated", event.delta.scale n'est pas 1. Lorsque la manipulation se produit dans l'objet événement "mannerupdated", je trouve les coordonnées d'une seule position. Comment puis-je calculer les deux coordonnées tactiles de cette information?Pinch Zoom - Obtenir des coordonnées tactiles

De même, comment savoir à quelle coordonnée tactile appartient la position? Je trouve la position répétée plusieurs fois à l'intérieur de l'objet d'événement - à event.position et event.detail [0] .position

Ce que j'essaie de réaliser est de pincer et de zoomer dans un graphique (un peu comme une carte). Veuillez m'aider avec ces questions.

Répondre

1

public class PZBehavior: Comportement {

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); 
    } 
} 
Questions connexes