3

ご挨拶!

現在、Silverlight プロジェクトに取り組んでおり、単純な多角形 (実際には台形) をアニメーション化したいと考えています。具体的には、何らかのイベントが発生した後に、4 つのポイントのうち 2 つを動的に移動したいと考えています。平行な辺の 1 つをサイズ変更して別の位置に移動する必要があります。

私は Silverlight にかなり慣れていないことを認め、それが可能かどうかはもちろん、それがどのように行われるかを教えてくれる情報源を見つけられませんでした。

以前にアニメーションを使用したことがあるので、ストーリーボードとアニメーションの一般的な概念は私にとって新しいものではありません。しかし、アニメーションでポリゴンのポイントを移動するにはどうすればよいでしょうか? 同様の光学効果を持つ代替手段はありますか (パスのアニメーション化など)?
私が使用できるPropertyPathはありますか?

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

、 Silverlight 3チュートリアルのポイントアニメーションに見られるように?

よろしくお願いします。:)

4

2 に答える 2

4

Silverlight、または一般的な.NETのアニメーションについては何も知りませんが、CharlesPetzoldは同様のことをしました。

于 2009-08-18T14:09:50.960 に答える
1

コメントで要求されたように、アニメーションを作成するために最終的に使用したものを説明します。

は 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 それぞれに変更します。これが役に立ったことを願っています。:)

于 2009-08-20T10:22:01.240 に答える