2009-08-18 81 views
3

問候!如何動畫多邊形? (閱讀:動畫輪廓改變形狀)

我目前正在開發一個Silverlight項目,我想動畫一個簡單的多邊形形狀(實際上是一個梯形)。具體來說,我想在事件發生後動態調整四點中的兩點。我需要/想要調整大小並將其中一個平行邊移動到另一個位置。

我承認我對Silverlight來說比較新,而且還沒有找到可以告訴我的來源,甚至有可能,更不用說它是如何實現的。

我之前使用過動畫,所以故事板和動畫的一般概念對我來說並不陌生。但是,如何在動畫中移動多邊形的點?是否有替代品具有類似的光學效果(例如製作路徑)?
是否有一個的PropertyPath我可以使用,類似於

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

,如在Point Animation in Silverlight 3 tutorial發現了什麼?

謝謝大家提前。 :)

回答

4

我不知道有關Silverlight的東西,或者在一般的.NET動畫,但Charles Petzold沒有類似的東西:

+0

哇,這很快。喜歡這個網站。 :) 感謝您的快速回復。 該代碼很容易適應多邊形而不是折線 - 並且或多或少地完全符合我的要求。 – Cornelius 2009-08-18 14:44:09

+0

那麼upvote怎麼樣,呵呵呵? :) – 2009-08-18 14:55:39

+0

...你去^。^再次感謝 – Cornelius 2009-08-19 12:25:06

1

按照評論中的要求,我解釋了我最終用來製作我的動物重刑:

我依靠Animated Polyline Interpolations in Silverlight和或多或少直接使用此代碼 - 「竊取」PointCollectionInterpolator.cs類。

然後,我有我的方法來創建我需要的多邊形,並準備動畫:

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

然後在一些隨機事件處理,我開始動畫。另外,所以我可以重複使用該方法,將端點集合移動到起點集合中,並用新的端點更新插補器。 (記住設置進度爲0.0 ...)因此,每當處理程序觸發時,多邊形將無縫地變形爲新的。

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

回想起來,我將名稱從Points1和Points2更改爲StartPoints和EndPoints resp。 希望這有助於。 :)