C# Winform中如何绘制动画示例详解
前言
这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnimate可以判断一个图片是否为动画,调用ImageAnimator.Animate可以开始播放动画,即每经过一帧的时间触发一次OnFrameChanged委托,我们只要在该委托中将Image的活动帧选至下一帧再迫使界面重绘就可以实现动画效果了。
为了方便以后的使用,我将这些代码整合到了一起,形成一个AnimateImage类,该类提供了CanAnimate、FrameCount、CurrentFrame等属性,以及Play()、Stop()、Reset()等动画常用的方法,代码如下
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Drawing;
usingSystem.Drawing.Imaging;
namespaceGifTest
{
///
///表示一类带动画功能的图像。
///
publicclassAnimateImage
{
Imageimage;
FrameDimensionframeDimension;
///
///动画当前帧发生改变时触发。
///
publiceventEventHandlerOnFrameChanged;
///
///实例化一个AnimateImage。
///
///动画图片。
publicAnimateImage(Imageimg)
{
image=img;
lock(image)
{
mCanAnimate=ImageAnimator.CanAnimate(image);
if(mCanAnimate)
{
Guid[]guid=image.FrameDimensionsList;
frameDimension=newFrameDimension(guid[0]);
mFrameCount=image.GetFrameCount(frameDimension);
}
}
}
boolmCanAnimate;
intmFrameCount=1,mCurrentFrame=0;
///
///图片。
///
publicImageImage
{
get{returnimage;}
}
///
///是否动画。
///
publicboolCanAnimate
{
get{returnmCanAnimate;}
}
///
///总帧数。
///
publicintFrameCount
{
get{returnmFrameCount;}
}
///
///播放的当前帧。
///
publicintCurrentFrame
{
get{returnmCurrentFrame;}
}
///
///播放这个动画。
///
publicvoidPlay()
{
if(mCanAnimate)
{
lock(image)
{
ImageAnimator.Animate(image,newEventHandler(FrameChanged));
}
}
}
///
///停止播放。
///
publicvoidStop()
{
if(mCanAnimate)
{
lock(image)
{
ImageAnimator.StopAnimate(image,newEventHandler(FrameChanged));
}
}
}
///
///重置动画,使之停止在第0帧位置上。
///
publicvoidReset()
{
if(mCanAnimate)
{
ImageAnimator.StopAnimate(image,newEventHandler(FrameChanged));
lock(image)
{
image.SelectActiveFrame(frameDimension,0);
mCurrentFrame=0;
}
}
}
privatevoidFrameChanged(objectsender,EventArgse)
{
mCurrentFrame=mCurrentFrame+1>=mFrameCount?0:mCurrentFrame+1;
lock(image)
{
image.SelectActiveFrame(frameDimension,mCurrentFrame);
}
if(OnFrameChanged!=null)
{
OnFrameChanged(image,e);
}
}
}
}
使用如下方法调用:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Drawing.Imaging;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceGifTest
{
publicpartialclassForm1:Form
{
AnimateImageimage;
publicForm1()
{
InitializeComponent();
image=newAnimateImage(Image.FromFile(@"C:\DocumentsandSettings\Administrator\MyDocuments\MyPictures\未命名.gif"));
image.OnFrameChanged+=newEventHandler(image_OnFrameChanged);
SetStyle(ControlStyles.OptimizedDoubleBuffer|ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint,true);
}
voidimage_OnFrameChanged(objectsender,EventArgse)
{
Invalidate();
}
privatevoidForm1_Load(objectsender,EventArgse)
{
image.Play();
}
privatevoidForm1_Paint(objectsender,PaintEventArgse)
{
lock(image.Image)
{
e.Graphics.DrawImage(image.Image,newPoint(0,0));
}
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
if(button1.Text.Equals("Stop"))
{
image.Stop();
button1.Text="Play";
}
else
{
image.Play();
button1.Text="Stop";
}
Invalidate();
}
privatevoidbutton2_Click(objectsender,EventArgse)
{
image.Reset();
button1.Text="Play";
Invalidate();
}
}
}
总结
到此这篇关于C#Winform中如何绘制动画的文章就介绍到这了,更多相关C#Winform绘制动画内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!