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ò)誤的解決方法

