2009-08-18 8 views
3

Salutations!Comment animer un polygone? (Lire: Animer le contour pour changer de forme)

Je travaille actuellement sur un projet Silverlight et j'aimerais animer une forme de polygone simple (en fait un trapèze). Plus précisément, je voudrais déplacer dynamiquement deux des quatre points après qu'un événement se soit produit. J'ai besoin de/redimensionner et déplacer l'un des côtés parallèles vers une autre position. Je reconnais que je suis plutôt nouveau à Silverlight et que je n'ai pas trouvé de source qui pourrait me dire si c'est même possible, sans parler de comment cela peut être fait.

J'ai déjà utilisé des animations, donc le concept général de storyboards et d'animations n'est pas nouveau pour moi. Mais comment puis-je déplacer les points d'un polygone dans une animation? Existe-t-il des alternatives qui ont un effet optique similaire (par exemple l'animation d'un chemin)?
Y at-il un PropertyPath je peux utiliser, semblable à

P3AnimBack.SetValue(Storyboard.TargetPropertyProperty, 
    new PropertyPath("(Path.Data). 
     (PathGeometry.Figures)[0].(PathFigure.Segments)[0]. 
     (BezierSegment.Point3)")); 

, que l'on trouve dans un Point Animation in Silverlight 3 tutorial?

Merci d'avance. :)

Répondre

4

je ne sais pas quoi que ce soit sur Silverlight, ou des animations dans .NET en général, mais quelque chose de similaire Charles Petzold fait:

+0

Wow c'était rapide. Je dois aimer ce site. :) Merci pour votre réponse rapide. Le code est très facilement adapté aux polygones au lieu des polylignes - et plus ou moins exactement ce que j'ai cherché. – Cornelius

+0

Alors, que diriez-vous d'un upvote, hein hein hein? :) –

+0

... Là vous allez ^.^Merci encore – Cornelius

1

Comme demandé dans un commentaire, j'explique ce que j'ai finalement utilisé pour faire mon anima J'ai suivi sur Animated Polyline Interpolations in Silverlight et plus ou moins directement utilisé ce code - "voler" la classe PointCollectionInterpolator.cs.

J'avais ma méthode pour créer des polygones dont j'ai besoin et préparer des animations:

private void CreatePolygon(TextBox txtbx, string prop, Color curcol) 
    { 
     PointCollectionInterpolator pci = new PointCollectionInterpolator(); 
     pci.Points1 = new PointCollection() // Start Points 
      { 
       new Point(...), 
       new Point(...), 
       new Point(...), 
       new Point(...), 
      }; 

     pci.Points2 = new PointCollection() // End Points 
      { 
       new Point(...), 
       new Point(...), 
       new Point(...), 
       new Point(...), 
      }; 

     Polygon tmpply = new Polygon(); 
     LayoutRoot.Children.Add(tmpply); 

     tmpply.Points = pci.InterpolatedPoints; 

     DoubleAnimation animpci = new DoubleAnimation(); 
     animpci.Duration = someDuration; 
     animpci.From = 0.0; 
     animpci.To = 1.0; 
     Storyboard.SetTarget(animpci, pci); 
     Storyboard.SetTargetProperty(animpci, new PropertyPath("(Progress)")); 
     myStoryBoard.Children.Add(animpci); 
    } 

Et puis dans certains gestionnaire d'événements au hasard, je commence l'animation. En outre, afin de pouvoir réutiliser la méthode, j'ai déplacé la collection de points de terminaison dans la collection de points de départ et mis à jour l'interpolateur avec de nouveaux points de terminaison. (Rappelez-vous de mettre la progression à 0.0 ...) Ainsi, chaque fois que le gestionnaire se déclenche, le polygone se transforme en un nouveau.

private void SomeEventHandler(object sender, RoutedEventArgs e) 
{ 
    PointCollectionInterpolator polygonPCI = 
      this.referenceToPointCollectionInterpolator; 
    polygonPCI.Points1 = polygonPCI.Points2; 
    polygonPCI.Progress = 0.0; 
    polygonPCI.Points2 = getNewEndPoints(); 
    myStoryBoard.Begin(); 
} 

Rétrospectivement, je voudrais changer les noms de Points1 et Points2 à StartPoints et EndPoints resp. J'espère que cela a aidé. :)