C# Winform中如何繪制動(dòng)畫示例詳解
前言
這里介紹一個(gè).net自身攜帶的類ImageAnimator,這個(gè)類類似于控制動(dòng)畫的時(shí)間軸,使用ImageAnimator.CanAnimate可以判斷一個(gè)圖片是否為動(dòng)畫,調(diào)用ImageAnimator.Animate可以開始播放動(dòng)畫,即每經(jīng)過一幀的時(shí)間觸發(fā)一次OnFrameChanged委托,我們只要在該委托中將Image的活動(dòng)幀選至下一幀再迫使界面重繪就可以實(shí)現(xiàn)動(dòng)畫效果了。
為了方便以后的使用,我將這些代碼整合到了一起,形成一個(gè)AnimateImage類,該類提供了CanAnimate、FrameCount、CurrentFrame等屬性,以及Play()、Stop()、Reset()等動(dòng)畫常用的方法,代碼如下
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing.Imaging; namespace GifTest { /// <summary> /// 表示一類帶動(dòng)畫功能的圖像。 /// </summary> public class AnimateImage { Image image; FrameDimension frameDimension; /// <summary> /// 動(dòng)畫當(dāng)前幀發(fā)生改變時(shí)觸發(fā)。 /// </summary> public event EventHandler<EventArgs> OnFrameChanged; /// <summary> /// 實(shí)例化一個(gè)AnimateImage。 /// </summary> /// <param name="img">動(dòng)畫圖片。</param> public AnimateImage(Image img) { image = img; lock (image) { mCanAnimate = ImageAnimator.CanAnimate(image); if (mCanAnimate) { Guid[] guid = image.FrameDimensionsList; frameDimension = new FrameDimension(guid[0]); mFrameCount = image.GetFrameCount(frameDimension); } } } bool mCanAnimate; int mFrameCount = 1, mCurrentFrame = 0; /// <summary> /// 圖片。 /// </summary> public Image Image { get { return image; } } /// <summary> /// 是否動(dòng)畫。 /// </summary> public bool CanAnimate { get { return mCanAnimate; } } /// <summary> /// 總幀數(shù)。 /// </summary> public int FrameCount { get { return mFrameCount; } } /// <summary> /// 播放的當(dāng)前幀。 /// </summary> public int CurrentFrame { get { return mCurrentFrame; } } /// <summary> /// 播放這個(gè)動(dòng)畫。 /// </summary> public void Play() { if (mCanAnimate) { lock (image) { ImageAnimator.Animate(image, new EventHandler(FrameChanged)); } } } /// <summary> /// 停止播放。 /// </summary> public void Stop() { if (mCanAnimate) { lock (image) { ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged)); } } } /// <summary> /// 重置動(dòng)畫,使之停止在第0幀位置上。 /// </summary> public void Reset() { if (mCanAnimate) { ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged)); lock (image) { image.SelectActiveFrame(frameDimension, 0); mCurrentFrame = 0; } } } private void FrameChanged(object sender, EventArgs e) { mCurrentFrame = mCurrentFrame + 1 >= mFrameCount ? 0 : mCurrentFrame + 1; lock (image) { image.SelectActiveFrame(frameDimension, mCurrentFrame); } if (OnFrameChanged != null) { OnFrameChanged(image, e); } } } }
使用如下方法調(diào)用:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.Text; using System.Windows.Forms; namespace GifTest { public partial class Form1 : Form { AnimateImage image; public Form1() { InitializeComponent(); image = new AnimateImage(Image.FromFile(@"C:\Documents and Settings\Administrator\My Documents\My Pictures\未命名.gif")); image.OnFrameChanged += new EventHandler<EventArgs>(image_OnFrameChanged); SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); } void image_OnFrameChanged(object sender, EventArgs e) { Invalidate(); } private void Form1_Load(object sender, EventArgs e) { image.Play(); } private void Form1_Paint(object sender, PaintEventArgs e) { lock (image.Image) { e.Graphics.DrawImage(image.Image, new Point(0, 0)); } } private void button1_Click(object sender, EventArgs e) { if (button1.Text.Equals("Stop")) { image.Stop(); button1.Text = "Play"; } else { image.Play(); button1.Text = "Stop"; } Invalidate(); } private void button2_Click(object sender, EventArgs e) { image.Reset(); button1.Text = "Play"; Invalidate(); } } }
總結(jié)
到此這篇關(guān)于C# Winform中如何繪制動(dòng)畫的文章就介紹到這了,更多相關(guān)C# Winform繪制動(dòng)畫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章

WinForm實(shí)現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能

一文詳解C#中重寫(override)及覆蓋(new)的區(qū)別

C# 微信支付 wx.chooseWXPay 簽名錯(cuò)誤的解決方法