WPFは、より高度なモデルを提供し、我々は関係なく、レンダリングの、このモデルの定義アニメーションに焦点を当てることができます。このモデルは、依存関係プロパティインフラストラクチャに基づいています。基本的に、WPFのアニメーションは、いくつかの時間間隔のためだけの修理染めの方法です。このモデルは、依存関係プロパティインフラストラクチャに基づいています。基本的に、WPFのアニメーションは、単に時間間隔内通行の依存関係プロパティの値を変更します。
WPFが3つの方法(アニメーションとして使用することができる線形補間、及びパスキーフレームは)だけでなく、アニメーションクラスの値を変更するより完全な使用完全に異なる方法を作成する。唯一の要件は、カスタムアニメーションクラスはに基づいていなければならないということです時間の値を変更します。
アニメーションクラスの値を変更するために多くの全く異なる方法。唯一の要件は、カスタムアニメーションクラスは、時間値に応じて修正しなければならないということです。
アニメーションのカテゴリ
すべてのアニメーションクラスは、「あるタイプ名+アニメーションアプローチ命名します」。このビューには、非常に正確な実際の状況に非常に近いですが、ありません。
- 17補間を使用して、「タイプ名+アニメーション」クラス== ==。
- 22「タイプ名+ AnimationUsingKeyFrames」クラスその使用== ==キーフレームアニメーション。
3「タイプ名+ AnimationUsingPath」== ==ベースのアニメーションパスを使用したクラス。
「タイプ名+ AnimationBase」カテゴリの抽象アニメーションを継承するすべてのこれらのクラスは、これらの基底クラスは、カスタムアニメーションクラスを作成するためのショートカットを提供し、いくつかの基本的な機能を実装しています。データ型は、アニメーションの複数のタイプをサポートする場合は、すべてのアニメーションクラスは抽象基底クラスアニメーションを継承します。- コンテンツ - この42クラスは専用の名前空間System.Windows.Media.Animationではありません。各キーフレームアニメーションキーフレームはまた、これらの2つの分類が混乱につながることができ、独自のクラスとキーフレームのコレクションを使用します。要するに、100の以上のクラス== System.Windows.Media.Animation ==名前空間があります。
BooleanAnimationUsingKeyFrames | ByteAnimation |
---|---|
ByteAnimationUsingKeyFrames | CharAnimationUsingKeyFrames |
ColorAnimation | ColorAnimationUsingKeyFrames |
DecimalAnimation | DecimalAnimationUsingKeyFrames |
DoubleAnimation | DoubleAnimationUsingKeyFrames |
DoubleAnimationUsingPath | Int16Animation |
国際6AnimationUsingKeyFrames | Int32Animation |
Int32AnimationUsingKeyFrames | Int64Animation |
Int64AnimationUsingKeyFrames | MatrixAnimationUsingKeyFrames |
MatrixAnimationUsingPath | ObjectAnimationUsingKeyFrames。 |
Fointanimtion | PointAnimationUsingKeyFrames |
Fointanimtionusidagfth | Point3DAnimation |
Point3DAnimationUsingKeyFrames | QuarternionAnimation |
QuarternionAnimationUsingKeyFrames | RectAnimation |
RectAnimationUsingKeyFrames | Rotation3DAnimation |
Rotation3DAnimationUsingKeyFrames | SingleAnimation |
SingleAnimationUsingKeyFrames | SizeAnimation |
SizeAnimationUsingKeyFrames | StringAnimationUsingKeyFrames |
ThicknessAnimation | ThicknessAnimationUsingKeyFrames |
VectorAnimation | VectorAnimationUsingKeyFrames |
Vector3DAnimation | Vector3DAnimationUsingKeyFrames |
これは、谷の名前空間内の42個のオープンクラスのシステム。Windows.Media.Animation固有のものではありません。各キーフレームアニメーションは
また、独自のキーフレームとキーフレームクラスのコレクションを使用して、これらの二つの分類は、いくつかの混乱につながることができます。要するに、System.Windowsで
Media.Animation名前空間100の以上のカテゴリ。
線形補間のいずれかを使用アニメーションは3つの事実の最小値が必要です:
== ==、== end値(TO)時間(期間)と== == ==実行アニメーション全体(から)の値を開始します。
使用せずにプロパティに、プロパティで使用されてもよいです。属性ではなく、与えられた目標の値を変更することにより、数値の値を変更することにより、アニメーションを作成するために使用されます。
プロパティを使用し、組み合わせることができますが、これはすべての作業を軽減しません。値によっては、単に値にまで到達するために、値に加算されます。
ほとんどの補間アニメーションクラスは、多くの場合、属性は、すべてではない場合では提供しています。例えば、非数値データ・タイプについて,,プロパティとは、クラスがColorAnimation Color構造体を使用するような、無意味です。
この方法は、他の同様の挙動は、プロパティを使用せずに得ることができるIsAdditiveプロパティを設定することによって値を増加させることにより、アニメーション作成することができます。このアニメーションを作成する場合は、現在の値が自動的からの値にし、値に加算されます。
ライフサイクルのアニメーション
アニメーションが新たな価値のためのボタンの幅を維持する必要があるため、実行の終わりに(例えばアニメーション成長ボタンなど)の片道アニメーションは、アクティブのままになります。アニメーションが完了した後にプロパティ値を変更するために、コードを使用しようとすると、次のこのリードは、コードは動作しません、一般的な問題ではありません。コードは唯一のプロパティの新しいローカル値を指定しますが、アニメーション後のプロパティの値は依然として優先されますので。
次のようにこの問題を解決するために、いくつかの方法で作業を完了する準備よると:
●要素を作成すると、アニメーションの元の状態にリセットされます。目的は、属性のアニメーションに設定しないで作成することによって達成することができます。
例えば、ボタンの幅が低減され、最後のセットのボタンのアニメーションのサイズに縮小され、その後、コードの変更のこのプロパティを使用することができます。
フリップアニメーションを作成●。オートリバースプロパティでフリップアニメーションを作成するにはtrueに設定されています。例えば、ボタンの成長時に-アニメーションボタンの幅の増加は、逆元の幅に戻ってアニメーションを再生。アニメーションの全持続時間を2倍にすることであろう。
●FillBehaviorプロパティを変更します。通常、FillBehaviorプロパティはアニメーションの最後には、ターゲット要素の最終的な値を適用し続けることを意味HoldEnd、に設定されています。FillBehaviorプロパティを停止する場合は、限り、アニメーションの最後として、プロパティが元の値に戻ります。
●アニメーションはアニメーションオブジェクトアニメーションCompletedイベントハンドラオブジェクトを削除して終了した場合。
トップ3つの方法は、アニメーションの動作を変更するには。いずれにせよ、彼らはその元の値にアニメーションを属性します。方法-これが望ましくない場合、それは最後を使用する必要があります。
まず、アニメーションイベントの完了に応答して、アニメーション、関連するイベント・ハンドラを開始する前に:
widthAnimation完成+ = animation_完成;.
==注:==
完了イベントは、付加情報をオブジェクト従来のEventArgsを使用することなく、従来のイベント.NETです。イベントは、ルーティングイベントをされていません。
タイムラインのクラス
名前 | 説明 |
---|---|
スタート時間 | 設定は、映画が始まるまでの遅延時間(のTimeSpanタイプ)に追加されます。これは、 - アニメーションは5秒、5秒の遅延を有するように、全時間遅延に加算され、合計時間は10秒です。同期が同時に開始、しかし、順序の異なるアニメーションアプリケーションの効果場合は、開始時間プロパティが便利です |
期間 | 使用時間のアニメーションが実行されている時間の最初から最後までオブジェクト |
速度比 | 速度を上げるか、アニメーションを遅くします。一般的に、速度比の属性値は1です。プロパティ値が増加する場合、アニメーションを加速する(例えば、属性値速度比5は、アニメーション速度が5倍になった場合)、属性値を小さくすると場合、アニメーションは、例えば、(遅くなり項目速度比0.5の値は、アニメーション時間)を2回元となります。アニメーションDurationプロパティを変更することにより、同じ結果の価値があると。属性速度比の値に関わらず、開始時間遅延を適用した場合 |
AccclerationRatio; DecelerationRatio | だから、アニメーションが直線的ではなく、起動が遅い、と(AcelerationRatio属性値を増加させることにより)成長率ということ:速度は、(DecelerationRatio属性値を増やすことによって)減少または終了されます。これらの2つの属性が0と1の間の値であり、最初に0に設定されています。また、この2つのプロパティの合計が1を超えることはできません |
オートリバース | trueの場合、プレイヤーは自動的に反転し、元の値に戻りますと、アニメーションが完了しています。また、実行時間が2倍になるアニメーションを行います。プロパティ値は速度比を増加させた場合、それは元のアニメーションに適用し、アニメーションを逆にします。開始時間のプロパティ値は、逆アニメーションの始まりを遅らせていないだけでアニメーションに適用されます |
FillBehavior | 移動が完了したときに何をすべきかを決定します。典型的には、プロパティの値が一定終了値(FillBchavior。HoldEnd)を保つことができるだけでなく、属性数の元の値に戻るように選択することができ(FillBehavior停止) |
RepeatBehavior | このプロパティによって、あなたは間隔や繰り返しアニメーションの数を指定するために使用することができます。RepeatBehaviorオブジェクトは、この属性を設定するために使用されることは、正確な動作を決定します |
ストーリボード
在所有声明式动画中都会用到如下两个要素:
故事板: 故事板是BeginAnimation( )方法的XAML等价物。通过故事板将动画指定到合适的元素和属性。
事件触发器: 事件触发器响应属性变化或事件(如按钮的Click事件),并控制故事板。例如,为了开始动画,事件触发器必须开始故事板。
小案例:
以上小案例为点单击按钮时,原形先向右移动到达To值后继续向左移动,矩形向右下角移动,当到达To值后原路返回向左上角移动,此动画为重复执行动画
首先需要引入动画类命名空间;
using System.Windows.Media.Animation;
创建故事板:
Storyboard sto = new Storyboard(); // 故事板
Storyboard stt = new Storyboard(); // 向下故事板
初始化图形大小,位置:
Border bod = new Border(); // 圆形
bod.Width = 100;
bod.Height = 100;
bod.BorderThickness =new Thickness(10); // 设置原形边框厚度
bod.BorderBrush = Brushes.Yellow; // 边框颜色
bod.Background = Brushes.Purple; // 圆形背景色
bod.CornerRadius = new CornerRadius(50); // 画圆
BG.Children.Add(bod);
Border boo = new Border(); // 矩形
boo.Width = 100;
boo.Height = 100;
boo.Background = Brushes.Cyan;
Canvas.SetLeft(boo, 100);
Canvas.SetTop(boo, 300);
boo.CornerRadius = new CornerRadius(20);
BG.Children.Add(boo);
动画情节:
DoubleAnimation move = new DoubleAnimation(); // 移动情节
move.From = 0; // 初始值
move.To = 400; // 结束值
move.Duration = new Duration(new TimeSpan(0, 0, 0, 3, 0)); // 需要的时间
move.AutoReverse = true; // 设置成返回
move.RepeatBehavior = RepeatBehavior.Forever; // 重复执行
Storyboard.SetTarget(move,bod); // 情节添加给对象
//Storyboard.SetTargetProperty(move, new PropertyPath(Canvas.LeftProperty)); // 改变lef位置
Storyboard.SetTargetProperty(move, new PropertyPath("(Canvas.Left)"));
sto.Children.Add(move);
ColorAnimation bianSe = new ColorAnimation(Colors.Purple,Colors.Orange,TimeSpan.FromMilliseconds(300)); // 改背景色情节
Storyboard.SetTarget(bianSe, bod);
Storyboard.SetTargetProperty(bianSe, new PropertyPath("(Border.Background).(SolidColorBrush.Color)"));
sto.Children.Add(bianSe);
ColorAnimation biankuSe = new ColorAnimation(Colors.Blue, Colors.DarkViolet,TimeSpan.FromSeconds(3)); // 改变边框颜色
Storyboard.SetTarget(biankuSe, bod);
Storyboard.SetTargetProperty(biankuSe, new PropertyPath("(Border.BorderBrush).(SolidColorBrush.Color)"));
sto.Children.Add(biankuSe);
ThicknessAnimation kuang=new ThicknessAnimation(new Thickness(10),new Thickness(20),TimeSpan.FromMilliseconds(30)); // 改变边框厚度
Storyboard.SetTarget(kuang, bod);
Storyboard.SetTargetProperty(kuang, new PropertyPath("BorderThickness"));
sto.Children.Add(kuang);
DoubleAnimation zhuan = new DoubleAnimation(0, 360, new Duration(TimeSpan.FromSeconds(3))); // 旋转情节
Storyboard.SetTarget(zhuan, bod);
zhuan.AutoReverse = true;
zhuan.RepeatBehavior = RepeatBehavior.Forever;
Storyboard.SetTargetProperty(zhuan, new PropertyPath("RenderTransform.Angle"));
sto.Children.Add(zhuan);
RotateTransform xuanZhuan = new RotateTransform(); // 旋转对象
bod.RenderTransform = xuanZhuan;
bod.RenderTransformOrigin = new Point(0.5,0.5);
// 控制boo 向下移动并 旋转
DoubleAnimation yidong = new DoubleAnimation();// 移动右
yidong.From = 0;
yidong.To = 500;
yidong.Duration = new Duration(TimeSpan.FromSeconds(3)); // 设置毫秒数
yidong.AutoReverse = true; // 返回原路
yidong.RepeatBehavior = RepeatBehavior.Forever; // 重复执行
Storyboard.SetTarget(yidong, boo);
Storyboard.SetTargetProperty(yidong, new PropertyPath("(Canvas.Left)"));
stt.Children.Add(yidong);
DoubleAnimation yidong_ = new DoubleAnimation(Canvas.GetTop(boo),(Canvas.GetTop(boo)+400),new Duration(TimeSpan.FromSeconds(3))); // 移动下
yidong_.AutoReverse = true;
yidong_.RepeatBehavior = RepeatBehavior.Forever;
Storyboard.SetTarget(yidong_, boo);
Storyboard.SetTargetProperty(yidong_,new PropertyPath("(Canvas.Top)"));
stt.Children.Add(yidong_);
DoubleAnimation xiazhuan = new DoubleAnimation(0, 360, new Duration(TimeSpan.FromSeconds(3))); //旋转情节
Storyboard.SetTarget(xiazhuan, boo);
xiazhuan.AutoReverse = true; //可原路返回
xiazhuan.RepeatBehavior = RepeatBehavior.Forever;// 重复执行
Storyboard.SetTargetProperty(xiazhuan, new PropertyPath("RenderTransform.Angle"));
stt.Children.Add(xiazhuan);
RotateTransform xuanzhuan = new RotateTransform(); // 旋转对象
boo.RenderTransform = xuanzhuan;
boo.RenderTransformOrigin = new Point(0.5, 0.5);
点击按钮:
private void btn_Click(object sender, RoutedEventArgs e)
{
sto.Begin(); // 开启动画
stt.Begin();
}