C# Winform中绘制动画的方法

最近在做一个图片查看器,由于使用一般的PctureBox,在性能和缩放控制上都无法满足预期的要求,因此所有组件的呈现均是通过重写控件的OnPaint事件来绘制。在查看gif图片时发现Graphics.DrawImage只呈现第一帧,无法满足预期要求,因此经过摸索寻找到了解决自绘gif的较好办法。

这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnimate可以判断一个图片是否为动画,调用ImageAnimator.Animate可以开始播放动画,即每经过一帧的时间触发一次OnFrameChanged委托,我们只要在该委托中将Image的活动帧选至下一帧再迫使界面重绘就可以实现动画效果了。

为了方便以后的使用,我将这些代码整合到了一起,形成一个AnimateImage类,该类提供了CanAnimate、FrameCount、CurrentFrame等属性,以及Play()、Stop()、Reset()等动画常用的方法,代码如下

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Drawing;
5 using System.Drawing.Imaging;
6
7 namespace GifTest
8 {
9 /**//// <summary>
10 /// 表示一类带动画功能的图像。
11 /// </summary>
12 public class AnimateImage
13 {
14 Image image;
15 FrameDimension frameDimension;
16 /**//// <summary>
17 /// 动画当前帧发生改变时触发。
18 /// </summary>
19 public event EventHandler<EventArgs> OnFrameChanged;
20
21 /**//// <summary>
22 /// 实例化一个AnimateImage。
23 /// </summary>
24 /// <param name="img">动画图片。</param>
25 public AnimateImage(Image img)
26 {
27 image = img;
28
29 lock (image)
30 {
31 mCanAnimate = ImageAnimator.CanAnimate(image);
32 if (mCanAnimate)
33 {
34 Guid[] guid = image.FrameDimensionsList;
35 frameDimension = new FrameDimension(guid[0]);
36 mFrameCount = image.GetFrameCount(frameDimension);
37 }
38 }
39 }
40
41 bool mCanAnimate;
42 int mFrameCount = 1, mCurrentFrame = 0;
43
44 /**//// <summary>
45 /// 图片。
46 /// </summary>
47 public Image Image
48 {
49 get { return image; }
50 }
51
52 /**//// <summary>
53 /// 是否动画。
54 /// </summary>
55 public bool CanAnimate
56 {
57 get { return mCanAnimate; }
58 }
59
60 /**//// <summary>
61 /// 总帧数。
62 /// </summary>
63 public int FrameCount
64 {
65 get { return mFrameCount; }
66 }
67
68 /**//// <summary>
69 /// 播放的当前帧。
70 /// </summary>
71 public int CurrentFrame
72 {
73 get { return mCurrentFrame; }
74 }
75
76 /**//// <summary>
77 /// 播放这个动画。
78 /// </summary>
79 public void Play()
80 {
81 if (mCanAnimate)
82 {
83 lock (image)
84 {
85 ImageAnimator.Animate(image, new EventHandler(FrameChanged));
86 }
87 }
88 }
89
90 /**//// <summary>
91 /// 停止播放。
92 /// </summary>
93 public void Stop()
94 {
95 if (mCanAnimate)
96 {
97 lock (image)
98 {
99 ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged));
100 }
101 }
102 }
103
104 /**//// <summary>
105 /// 重置动画,使之停止在第0帧位置上。
106 /// </summary>
107 public void Reset()
108 {
109 if (mCanAnimate)
110 {
111 ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged));
112 lock (image)
113 {
114 image.SelectActiveFrame(frameDimension, 0);
115 mCurrentFrame = 0;
116 }
117 }
118 }
119
120 private void FrameChanged(object sender, EventArgs e)
121 {
122 mCurrentFrame = mCurrentFrame + 1 >= mFrameCount ? 0 : mCurrentFrame + 1;
123 lock (image)
124 {
125 image.SelectActiveFrame(frameDimension, mCurrentFrame);
126 }
127 if (OnFrameChanged != null)
128 {
129 OnFrameChanged(image, e);
130 }
131 }
132 }
133}
134

时间: 2024-12-02 05:30:18

C# Winform中绘制动画的方法的相关文章

Python使用matplotlib绘制动画的方法

  本文实例讲述了Python使用matplotlib绘制动画的方法.分享给大家供大家参考.具体分析如下: matplotlib从1.1.0版本以后就开始支持绘制动画 下面是几个的示例: 第一个例子使用generator,每隔两秒,就运行函数data_gen: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as p

Android编程根据系列图片绘制动画实例总结_Android

本文实例讲述了Android编程根据系列图片绘制动画的方法.分享给大家供大家参考,具体如下: 一.采用系统提供的Animation类,用自带的方法 其中的animation.xml文件如下: <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@

Android编程根据系列图片绘制动画实例总结

本文实例讲述了Android编程根据系列图片绘制动画的方法.分享给大家供大家参考,具体如下: 一.采用系统提供的Animation类,用自带的方法 其中的animation.xml文件如下: <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@

coreldraw中画表格的方法

问:Coreldraw中如何插入表格? 答:在Coreldraw中绘制表格的方法很多,并没有绝对的画法,根据各人掌握的方法不同均可以采取不同的措施,只要最终结果达到我们想要的就可以了,当然还要注意效率. 下面介绍几种常用的方法: 1.用方格纸工具画,然后解散群组,再更改自己想要的大小就可以了!这对于比较简单的表格比较适用. 2.是用手绘工具,按cbrl 键,你想画什么就画什么,如如果要画正规,就要配用对齐和变形工具,这方法比较老土,但优点是随意性比较强,缺点是把握性比较差. 3.先打好表头文字,

PowerPoint 2013中创建自定义路径动画的方法

  PowerPoint 2013中创建自定义路径动画的方法            1.在幻灯片中选择对象,在"动画"选项卡的"高级动画"组中单击"添加动画"按钮,在打开的下拉列表中选择"自定义路径"选项,如图1所示. 图1 选择"自定义路径"选项 2.此时鼠标指针变为十字形,在幻灯片中单击创建路径起点,然后按住左键移动鼠标,在适当位置单击创建拐点,绘制到路径终点后双击结束路径的绘制,此时动画会预览一次,幻

ZBrush中绘制纹理的两种方法

  利用ZBrush的内置插件"投影大师"和"Polypainting"纹理贴图能够快速实现纹理的绘制.本文将对这两种方法的应用流程做一个介绍. 在ZBrush中绘制纹理的两种方法: Projection Master(投影大师):这是基于投影的基本纹理系统.用户将他们的模型"投下"到画布接着绘制,最后从画布拾取. Projection Master(投影大师)的概念是比较简单的.当开始3D模型工作时,你激活Projection Master,这

WPS演示中自定义动画功能制作神奇万花筒的方法

  WPS演示中自定义动画功能制作神奇万花筒的方法 1.打开WPS演示,新建一个演示文稿,右键单击选中背景,把颜色设置为黑色. 2.往演示文稿中添加文本框,在其中输入内容,可以随意填写.将文字颜色设置为白色,便于观看. 3.鼠标右键点击文本框,在菜单中选择自定义动画. 4.在右侧自定义动画栏,点击添加效果按钮,选择强调--陀螺旋. 5.点击该演示文稿标题右侧的三角形箭头,选择效果选项. 6.在数量栏中设置为720度逆时针. 7.切换到计时栏,按照下图进行选择设置,完毕之后,确定. 8.按下键盘上

Flash动画“闪”在PowerPoint中的4种方法

Flash是大名鼎鼎的美国Macromedia公司推出的一款优秀的矢量动画制作软件,它简单易学,功能强大,能制出声图文并茂的多媒体文件,并且文件体积小,所以深受广大教师的欢迎,那么如何让Flash动画(*.swf)"闪"在为广大教师所熟悉的PowerPoint中,让这两款各有所长的优秀软件联袂打造出一种摄人心魄的效果,从而更好地提高课堂教学质量呢?笔者通过让一个保存在"我的文档"中的名为"我的文件"的Flash动画实现在PowerPoint 20

在Word中绘制表格的简单方法

  在Word中,如果要绘制简单的表格,其实方法还是挺多的.今天,我们就从工具栏和菜单栏出发,来学习一下如何绘制出简单的表格. Word 方法一:利用菜单栏中工具绘制表格 单击Word2003菜单栏上的"表格"按钮,在弹出的下拉菜单中选择"表格"-->插入-->表格,然后在弹出的"插入表格"对话框中设置好表格的"列数"与"行数"即可. 方法二:使用"常用"工具栏插入表格 点击