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. (8) openssl rsautl(签名/验证签名/加解密文件)和openssl pkeyutl(文件的非对称加密)

    rsautl是rsa的工具,相当于rsa.dgst的部分功能集合,可用于生成数字签名.验证数字签名.加密和解密文件. pkeyutl是非对称加密的通用工具,大体上和rsautl的用法差不多,所以此处只 ...

  2. LeetCode(42)Trapping Rain Water

    题目 Given n non-negative integers representing an elevation map where the width of each bar is 1, com ...

  3. 【HDU 6006】Engineer Assignment(状压DP)

    Problem Description In Google, there are many experts of different areas. For example, MapReduce exp ...

  4. C#sql语句如何使用占位符

    背景:在程序中,写sql语句时,可能要根据变量的值不同,SQL语句产生相应的变化.比如说存在变量StuName,根据变量值的不同,检索不同姓名的学生记录,这时需用到占位符的知识. 1,{0}占位符,代 ...

  5. 如何在ASP.NET MVC为Action定义筛选器

    在ASP.NET MVC中,经常会用到[Required]等特性,在MVC中,同样可以为Action自定义筛选器,来描述控制器所遵守的规则. 首先,我们在ASP.NET MVC项目中定义一个TestC ...

  6. 大数据学习——java操作hdfs环境搭建以及环境测试

    1 新建一个maven项目 打印根目录下的文件的名字 添加pom依赖 pom.xml <?xml version="1.0" encoding="UTF-8&quo ...

  7. PHP加速之eaccelerator

    eaccelerator简介: eAccelerator是一个自由开放源码php加速器,优化和动态内容缓存,提高了php脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除. 它还 ...

  8. 65.什么是IOC?【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 这个小节吧,是无意当中看了一篇文章,觉得介绍的特别好,引用到我的博客中,让大家也乐下.那么他是怎么解说IOC的呢?看如下: 套用好莱坞的一句名言就 ...

  9. Problem 2125 简单的等式(FZU),,数学题。。。

    Problem 2125 简单的等式 Time Limit: 1000 mSec Memory Limit : 32768 KB  Problem Description 现在有一个等式如下:x^2+ ...

  10. POJ 2553 The Bottom of a Graph 【scc tarjan】

    图论之强连通复习开始- - 题目大意:给你一个有向图,要你求出这样的点集:从这个点出发能到达的点,一定能回到这个点 思路:强连通分量里的显然都可以互相到达 那就一起考虑,缩点后如果一个点有出边,一定不 ...