watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

代码例如以下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//debug 引用
using System.Diagnostics; namespace CYSoft.TS.UI.StudentInfo
{
public partial class PicboxPlayGif : UserControl
{
private Image m_imgImage = null;
private EventHandler m_evthdlAnimator = null;
public PicboxPlayGif()
{
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
//为托付关联一个处理方法
m_evthdlAnimator = new EventHandler(OnImageAnimate);
Debug.Assert(m_evthdlAnimator != null); } private bool isPicboxFit = true;
[Description("pic 的宽和高和 真实gif的宽和高 是否要一致 ture=一致 false=不一致 ")]
public bool _isPicboxFit {
get { return isPicboxFit; }
set { this.isPicboxFit = value;
this.Invalidate();
}
} private int picWidth = 0;
[Description("图片宽度(假设isPicboxFit=true 这个參数无意义)")]
public int _picWidth {
get { return picWidth; }
set {
if (!isPicboxFit) {
if(value!=0)
{
this.picWidth = value;
this.Invalidate();
}
}
}
} private int picHeight = 0;
[Description("图片高度(假设isPicboxFit=true 这个參数无意义)")]
public int _picHeight {
get { return picHeight; }
set {
if (!isPicboxFit)
{
if (value != 0)
{
this.picHeight = value;
this.Invalidate();
}
}
}
} private string imagePath = "C:\\Users\\Thinkpad\\Desktop\\素材\\WaitLoading.gif";
[Description("图片路径")]
public string _imagePath {
get { return imagePath; }
set { this.imagePath = value;
this.Invalidate();
}
} private AA imageLayout = AA.Stretch;
[Description("图片在picbox中的显示方式")]
public AA _imageLayout {
get { return imageLayout; }
set {
this.imageLayout = value;
this.Invalidate();
}
} public enum AA {
None,
Title,
Center,
Stretch,
Zoom
} protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (m_imgImage != null)
{
UpdateImage();
//不用picbox 直接输出
// e.Graphics.DrawImage(m_imgImage, new Rectangle(100, 100, m_imgImage.Width, m_imgImage.Height)); //image 格式
if(imageLayout==AA.None)
{
pic.BackgroundImageLayout = ImageLayout.None;
}else if(imageLayout==AA.Title)
{
pic.BackgroundImageLayout = ImageLayout.Tile;
}
else if (imageLayout == AA.Stretch)
{
pic.BackgroundImageLayout = ImageLayout.Stretch;
}
else if (imageLayout == AA.Zoom)
{
pic.BackgroundImageLayout = ImageLayout.Zoom;
}
else {
pic.BackgroundImageLayout = ImageLayout.Center;
} pic.BackgroundImage = m_imgImage;
}
} protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//载入图片
m_imgImage = Image.FromFile(imagePath);
if (isPicboxFit)
{
this.Width = m_imgImage.Width;
this.Height = m_imgImage.Height;
}
else
{
this.Width = picWidth;
this.Height = picHeight;
} //pic设置
pic.BackColor = Color.Transparent;
pic.Dock = DockStyle.Fill; //BeginAnimate();
} /// <summary>
/// 播放或停止 动画
/// </summary>
/// <param name="isPlay">true=播放 false=停止</param>
public void _PlayOrEndGif(bool isPlay) {
if (isPlay)
{
BeginAnimate();
}
else {
if (m_imgImage != null)
{
StopAnimate();
//m_imgImage = null;
}
}
} //開始动画
private void BeginAnimate()
{
if (m_imgImage == null)
return; if (ImageAnimator.CanAnimate(m_imgImage))
{
//当gif动画每隔一定时间后,都会变换一帧。那么就会触发一事件,
//该方法就是将当前image每变换一帧时,都会调用当前这个托付所关联的方法。
ImageAnimator.Animate(m_imgImage,m_evthdlAnimator);
}
} //结束动画
private void StopAnimate()
{
if (m_imgImage == null)
return; if (ImageAnimator.CanAnimate(m_imgImage))
{
ImageAnimator.StopAnimate(m_imgImage,m_evthdlAnimator);
}
} //切换图片(帧图片)
private void UpdateImage()
{
if (m_imgImage == null)
return; if (ImageAnimator.CanAnimate(m_imgImage))
{
//获得当前gif动画的下一步须要渲染的帧。当下一步不论什么对当前gif动画的操作都是对该帧进行操作)
ImageAnimator.UpdateFrames(m_imgImage);
}
} private void OnImageAnimate(Object sender,EventArgs e)
{
//使得当前这个winfor重绘,然后去调用该winform的OnPaint()方法进行重绘
this.Invalidate();
} private void PicboxPlayGif_Load(object sender, EventArgs e)
{ }
}
}

调用:

上图右边是属性设置:

播放gif:

picboxPlayGif2._PlayOrEndGif(true);

停止gif:

picboxPlayGif2._PlayOrEndGif(true);

自己定义控件 播放GIF动画的更多相关文章

  1. 自己定义控件三部曲之动画篇(七)——ObjectAnimator基本使用

    前言: 假如生活欺骗了你, 不要悲伤,不要心急! 忧郁的日子里须要镇静: 相信吧,快乐的日子终将会来临! 心儿永远向往着未来: 如今却常是忧郁. 一切都是瞬息,一切都将会过去: 而那过去了的,就会成为 ...

  2. 自己定义控件三部曲之动画篇(十三)——实现ListView Item进入动画

    前言:宝剑锋从磨砺出,梅花香自苦寒来 相关文章: <Android自己定义控件三部曲文章索引>: http://blog.csdn.net/harvic880925/article/det ...

  3. BillBoardView自己定义控件广告板轮播

    BillBoardView自己定义控件广告板轮播 GitHub地址 compile 'com.march.billboardview:billboardview:2.0.6-beta4' BillBo ...

  4. Android自己定义控件之应用程序首页轮播图

    如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...

  5. Android自己定义控件:进度条的四种实现方式

    前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://down ...

  6. Android自己定义控件

    今天我们来讲一下 Android中自己定义控件的介绍,在Android中, 我们一般写xml都是用的是单个的控件来完毕的 ,但是.往往在一些项目中.单个控件有时是满足不了的.故此我们能够自己定义控件 ...

  7. 自己定义控件事实上非常easy1/6

    尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 上一节我们粗略地讲了下怎样去实现我 ...

  8. android 自己定义控件

    Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...

  9. Android 实现形态各异的双向側滑菜单 自己定义控件来袭

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39670935.本文出自:[张鸿洋的博客] 1.概述 关于自己定义控件側滑已经写了 ...

随机推荐

  1. java 定时任务-servlet

    在web.xml中配置监听类. <listener> <listener-class>com.skin.generate.action.TaskManager</list ...

  2. Visual Studio 安装VS10x CodeMAP

    最近出差,用的是公司电脑,电脑安装的是Visual Studio 2017 VS10x CodeMap 支持Visual Studio 2010, 2012, 2013, 2015,不支持Visual ...

  3. POJ-1011(sticks,深搜)

    Description George took sticks of the same length and cut them randomly until all parts became at mo ...

  4. 【02】SASS与SCSS

    SASS语法 SASS语法也称之为SASS的缩进语法,其目的是担供一个更简洁的语法.对于一些人来说,更多的是基于于CSS的美学吸引力,用SASS来代替SCSS语法. SASS语法和CSS语法不一样,他 ...

  5. POJ2926-Requirements,曼哈顿距离。去掉绝对值符号暴力枚举所有情况,神薙!

                                                         Requirements 好吧,这题我实在想不到什么优化的方法,看了看讨论区,顺便膜拜了一下大 ...

  6. 洛谷P3973 - [TJOI2015]线性代数

    Portal Description 给定一个\(n\times n\)的矩阵\(B\)和一个\(1×n\)的矩阵\(C\).求出一个\(1×n\)的01矩阵\(A\),使得\(D=(A×B-C)×A ...

  7. 制作U盘Puppy-Live启动盘

    制作U盘Puppy-Live启动盘 准备工具和材料:Puppy的ISO镜像文件.UltraISO工具.100M以上的U盘 开始: 1.用Ultraiso打开下载的镜像文件,然后选择菜单栏里面的&quo ...

  8. CodeForces - 743B Chloe and the sequence

    暴力肯定是无法做的 当时做的时候 当成一道递推来做的 用到分治的思想 想象一串长度为2n+1的列 那么前n个为前一串数 后n个是前一串数的reverse 第n+1个数 为第几串的编号 例如 第几串 中 ...

  9. input文本框的value属性在页面中不随输入的数据而变化

    今天,在做试验遇到这么一个需求: 一个input文本框,输入值后将标签传到后台,在后台解析标签,发现value仍然是初值,不是我们改变后的值. 例如: <input name="&qu ...

  10. Swift--错误集:Class controller has not initializers

    bug错误图 解决方法: 如下图所示,visitor这个属性并没有拆包处理,及将UIViewController的子类中的变量全部进行拆包处理,就是在变量声明的时候加一个?号,在使用的时候拆包处理,加 ...