C# Winform中如何繪制動畫示例詳解
前言
這里介紹一個.net自身攜帶的類ImageAnimator,這個類類似于控制動畫的時間軸,使用ImageAnimator.CanAnimate可以判斷一個圖片是否為動畫,調(diào)用ImageAnimator.Animate可以開始播放動畫,即每經(jīng)過一幀的時間觸發(fā)一次OnFrameChanged委托,我們只要在該委托中將Image的活動幀選至下一幀再迫使界面重繪就可以實現(xiàn)動畫效果了。
為了方便以后的使用,我將這些代碼整合到了一起,形成一個AnimateImage類,該類提供了CanAnimate、FrameCount、CurrentFrame等屬性,以及Play()、Stop()、Reset()等動畫常用的方法,代碼如下
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
namespace GifTest
{
/// <summary>
/// 表示一類帶動畫功能的圖像。
/// </summary>
public class AnimateImage
{
Image image;
FrameDimension frameDimension;
/// <summary>
/// 動畫當前幀發(fā)生改變時觸發(fā)。
/// </summary>
public event EventHandler<EventArgs> OnFrameChanged;
/// <summary>
/// 實例化一個AnimateImage。
/// </summary>
/// <param name="img">動畫圖片。</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>
/// 是否動畫。
/// </summary>
public bool CanAnimate
{
get { return mCanAnimate; }
}
/// <summary>
/// 總幀數(shù)。
/// </summary>
public int FrameCount
{
get { return mFrameCount; }
}
/// <summary>
/// 播放的當前幀。
/// </summary>
public int CurrentFrame
{
get { return mCurrentFrame; }
}
/// <summary>
/// 播放這個動畫。
/// </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>
/// 重置動畫,使之停止在第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中如何繪制動畫的文章就介紹到這了,更多相關(guān)C# Winform繪制動畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# Winfrom實現(xiàn)Skyline畫直線功能的示例代碼
這篇文章主要介紹了C# Winfrom實現(xiàn)Skyline畫直線功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
C#爬蟲基礎(chǔ)之HttpClient獲取HTTP請求與響應(yīng)
這篇文章介紹了C#使用HttpClient獲取HTTP請求與響應(yīng)的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
C#中接口的顯式實現(xiàn)與隱式實現(xiàn)及其相關(guān)應(yīng)用案例詳解
最近在學習演化一款游戲項目框架時候,框架作者巧妙使用接口中方法的顯式實現(xiàn)來變相對接口中方法進行“密封”,增加實現(xiàn)接口的類訪問方法的“成本”,這篇文章主要介紹了C#中接口的顯式實現(xiàn)與隱式實現(xiàn)及其相關(guān)應(yīng)用案例,需要的朋友可以參考下2024-05-05

