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基础——网络编程之网络链接

    一.网络编程基本概念 1.OSI与TCP/IP体系模型 2.IP和端口 解决了文章最开始提到的定位的问题. IP在互联网中能唯一标识一台计算机,是每一台计算机的唯一标识(身份证):网络编程是和远程计算 ...

  2. Shell转大写为小写

    #!/bin/bash # read a a=$(echo "$a" | awk '{print tolower($0)}') #转大写为小写 if [[ $a = 'y' || ...

  3. luogu P1519 穿越栅栏 Overfencing

    题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...

  4. centos7 中源码安装nginx

    使用nginx有一段时间了,还是有很多东西不懂的,在这里做一下自己学习过程中的一些整理,能使自己得到提升. 1.环境:centos7 1511  最小化安装 2.下载nginx,可以在系统中下载,也可 ...

  5. js 函数节流和防抖

    js 函数节流和防抖 throttle 节流 事件触发到结束后只执行一次. 应用场景 触发mousemove事件的时候, 如鼠标移动. 触发keyup事件的情况, 如搜索. 触发scroll事件的时候 ...

  6. POJ 3122 pie (二分法)

    Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have ...

  7. 一道在CF上WA了9次才AC的A题题目与10个版本的代码代码

    题目(题目链接:https://codeforces.com/problemset/problem/733/A):   A. Grasshopper And the String time limit ...

  8. 七、整合SQL基础和PL-SQL基础

    --Oracle数据库重要知识点整理 2017-01-24 soulsjie 目录 --一.创建及维护表... 2 --1.1 创建... 2 --1.2 维护表... 2 --二.临时表的分类.创建 ...

  9. java常见问题集锦

    Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案 Eclipse ...

  10. [luoguP2184] 贪婪大陆(树状数组)

    传送门 用两个树状数组,cr 维护 1....x 中 r 的数量 cl 维护 1....x 中 l 的数量 求答案的时候只需要求 y 前面 被作为左端点 的个数 - x 前面 被作为右端点的个数 —— ...