using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media.Animation;
namespace SJ.Controls.Helpers
{
public class StoryboardHelper
{
///
/// 播放动画
///
/// 控件源
/// 开始值
/// 结束值
/// 时间间隔
/// 是否反向播放
/// 是否重复播放
/// 动画类型
/// 回调函数
/// 动画属性
public static void _PlayDoubleAnimation(FrameworkElement fe, double from, double to, TimeSpan duration, bool IsAutoReverse, bool RepeatPlay, IEasingFunction ef, Action Callback, string PropertyPath)
{
Storyboard _sb = new Storyboard();
_sb.Completed += new EventHandler((s, e) =>
{
if (Callback != null)
Callback();
_sb.Stop();
_sb.Children.Clear();
_sb = null;
});
DoubleAnimation daRotation = new DoubleAnimation();
daRotation.From = from;
daRotation.To = to;
daRotation.EasingFunction = ef;
daRotation.Duration = duration;
Storyboard.SetTargetProperty(daRotation, new PropertyPath(PropertyPath));
Storyboard.SetTarget(daRotation, fe);
_sb.Children.Add(daRotation);
_sb.AutoReverse = IsAutoReverse;
if (RepeatPlay)
_sb.RepeatBehavior = RepeatBehavior.Forever;
_sb.Begin();
}
public static void _PlayAnimationUsingKeyFrames(IList AnimationUsingKeyFrameList, bool IsAutoReverse, bool IsRepeayPlay, Action Callback)
{
if (AnimationUsingKeyFrameList == null || AnimationUsingKeyFrameList.Count == 0)
return;
Storyboard _sb = new Storyboard();
_sb.Completed += new EventHandler((s, e) =>
{
if (Callback != null)
Callback();
_sb.Stop();
_sb.Children.Clear();
_sb = null;
});
_sb.AutoReverse = IsAutoReverse;
if (IsRepeayPlay)
_sb.RepeatBehavior = RepeatBehavior.Forever;
foreach (AnimationModel am in AnimationUsingKeyFrameList)
{
AnimationTimeline animationTimeLine = null;
switch (am._KeyFrameType)
{
case KeyFrameType.DoubleKeyFrame:
animationTimeLine = CreateDoubleAnimationUsingKeyFrames(am);
break;
case KeyFrameType.ColorKeyFrame:
animationTimeLine = CreateColorAnimationUsingKeyFrames(am);
break;
case KeyFrameType.ObjectKeyFrame:
animationTimeLine = CreateObjectAnimationUsingKeyFrames(am);
break;
}
_sb.Children.Add(animationTimeLine);
}
_sb.Begin();
}
private static AnimationTimeline CreateDoubleAnimationUsingKeyFrames(AnimationModel am)
{
DoubleAnimationUsingKeyFrames animationTimeline = new DoubleAnimationUsingKeyFrames();
Storyboard.SetTargetProperty(animationTimeline, new PropertyPath(am.PropertyPath));
Storyboard.SetTarget(animationTimeline, am.Element);
foreach (BaseKeyFrame baseKeyFrame in am.KeyFrames)
{
animationTimeline.KeyFrames.Add(
new EasingDoubleKeyFrame(
Convert.ToInt32(baseKeyFrame.Value),
baseKeyFrame._KeyTime,
baseKeyFrame.EasingFunction)
);
}
return animationTimeline;
}
private static AnimationTimeline CreateColorAnimationUsingKeyFrames(AnimationModel am)
{
ColorAnimationUsingKeyFrames animationTimeline = new ColorAnimationUsingKeyFrames();
Storyboard.SetTargetProperty(animationTimeline, new PropertyPath(am.PropertyPath));
Storyboard.SetTarget(animationTimeline, am.Element);
foreach (BaseKeyFrame baseKeyFrame in am.KeyFrames)
{
animationTimeline.KeyFrames.Add(
new EasingColorKeyFrame(
(System.Windows.Media.Color)baseKeyFrame.Value,
baseKeyFrame._KeyTime,
baseKeyFrame.EasingFunction)
);
}
return animationTimeline;
}
private static AnimationTimeline CreateObjectAnimationUsingKeyFrames(AnimationModel am)
{
ObjectAnimationUsingKeyFrames animationTimeline = new ObjectAnimationUsingKeyFrames();
Storyboard.SetTargetProperty(animationTimeline, new PropertyPath(am.PropertyPath));
Storyboard.SetTarget(animationTimeline, am.Element);
foreach (BaseKeyFrame baseKeyFrame in am.KeyFrames)
{
animationTimeline.KeyFrames.Add(
new DiscreteObjectKeyFrame(
baseKeyFrame.Value,
baseKeyFrame._KeyTime)
);
}
return animationTimeline;
}
}
///
/// 关键帧动画类型
///
public enum KeyFrameType
{
DoubleKeyFrame = 1,
ColorKeyFrame = 2,
ObjectKeyFrame = 3
}
public class AnimationModel
{
public AnimationModel()
{
this.KeyFrames = new List();
}
///
/// 执行动画的对象
///
public FrameworkElement Element;
///
/// 作用于动画的属性
///
public string PropertyPath;
///
/// 动画类型枚举
///
public KeyFrameType _KeyFrameType;
///
/// 关键帧动画帧集合
///
public IList KeyFrames;
}
public class BaseKeyFrame
{
///
/// 动画触发时间
///
public TimeSpan _KeyTime;
///
/// 值
///
public object Value;
///
/// 缓动函数类型
///
public IEasingFunction EasingFunction;
}
}