一般我们播放视频时是直接播放相应的视频文件,但有时候需要播放的素材并不是视频文件格式,而是对应的每一帧图片所组成的序列图,此时使用storyboard可以实现序列图的播放。
1.首先要在窗口中添加一个控件,用于显示这些图片,我用的是Rectangle,当然也可以用其它控件
<Grid>
<Rectangle Name="RectDis"/>
</Grid>
2.然后要写后台代码了,就是加载这些图片并设置如何播放
private Storyboard _sbDisappear;
public void LoadPictures()
{
_sbDisappear = new Storyboard();
for (int i = 0; i < 100; i++)
{
string fileName = AppDomain.CurrentDomain.BaseDirectory + "Resources\\Glow\\" + "Glow_" +
String.Format("{0:D3}", i) + ".png";
//因为要依次加载所有图片,所以这些图片的命名要有规律,且顺序应该与动画的播放顺序一致
if (System.IO.File.Exists(fileName))
{
ObjectAnimationUsingKeyFrames oauf = new ObjectAnimationUsingKeyFrames();
//ObjectAnimationUsingKeyFrames 可以对指定 Duration 内的一组 KeyFrames 中的 Object 属性值进行动画处理
ImageBrush imgBrush = new ImageBrush();
BitmapImage bmpImge = new BitmapImage(new Uri(fileName));
imgBrush.ImageSource = bmpImge;
//读取图片文件
DiscreteObjectKeyFrame dokf = new DiscreteObjectKeyFrame();
//DiscreteObjectKeyFrame 通过使用离散内插,可以在前一个关键帧的 Object 值及其自己的 Value 之间进行动画处理。
dokf.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(i*40));
//KeyTime 获取或设置应到达关键帧的目标 Value 的时间
//这里每隔40毫秒设置一张图片,也就是每秒1000/40=25帧
dokf.Value = imgBrush;
oauf.KeyFrames.Add(dokf);
Storyboard.SetTargetProperty(oauf, new PropertyPath("(Rectangle.Fill)"));
//把动画应用到窗体的Rectangle中
Storyboard.SetTarget(oauf, RectDis);
//RectDis是Rectangle的名称
_sbDisappear.Children.Add(oauf);
//把ObjectAnimationUsingKeyFrames动画添加到Storyboard中
}
}
//_sbDisappear.Completed += _sbDisappear_Completed;
}
播放动画时,使用Storyboard.Begin()方法就可以了。