自定义控件 播放GIF动画

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

代码如下:

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);

 

新学期领福利!购实物周边送年卡会员! T恤、键盘、双肩包等周边任选!还能解锁资源下载、VIP文章等多重会员权益! 阅读详情

相关推荐

基于LabVIEWGIF动画显示范例.zip

有没有想实现LabVIEW动画显示的,这个是基于LabVIEW加载显示GIF动画文件的源码范例,欢迎大家讨论学习。

LABVIEW 插入flash动画播放 源文件 vi

可用于毕设 在LABVIEW界面播放视频

C#写的gif控件

利用.net的ImageAnimator类写了一个简单的Gif控件,可以随时暂停和启动

Labview加载gif图显示的一些方法

第一种方法: 直接拖拽Gif图片到Labview前面板;优点是方便快捷,但是缺点很明显,GIF图的显示不是受控制的,Labview占用Cpu偏高,不停的刷新界面,可能会导致程序有些卡顿。 第二种方法:使用ocx控件,AniGIF.ocx 打开LabVIEW,新建VI,前面板-控件-.NET与ActiveX-ActiveX容器; 选择ActiveX-右击选择插入A...

QingNing3028的博客 1万+

labview自定义控件动画_Android 属性动画

一、ValueAnimator ValueAnimator是值的变动,可以控制控件的一些值,从而达到变化动画的效果。 public void doAnimation() { // final ValueAnimator valueAnimatorInt = ValueAnimator.ofInt(0,400,100,555,250); //输入需要变化的值,是...

weixin_39693295的博客 780

LabVIEW中如何使用Flash动画

LabVIEW中如何使用Flash动画 已经用Macromedia Flash创建了一个动画。我想在LabVIEW中用ActiveX控件来观看这个动画,该如何实现? 解答: 利用LabVIEW 中的ActiveX container,您可以选择和Flash相关联的ActiveX控件。在您插入目标之前必须要做的第一件事情是要有实际的ActiveX 文件。当您从Macromedia(参见下面的链接)网站安装Macromedia Flash Player时这个文件已经被加载。和Flash相关联的具体.

bjcyck的博客 1287

LabVIEW如何加载显示GIF动画

先下载Animation GIF Control控件,安装说明如下: X86表示32位系统x64表示64位系统 dll控件常规安装方法(仅供参考): 一、如果在运行某软件或编译程序时提示缺少、找不到dll等类似提示,您可将从脚本之家下载来的dll拷贝到指定目录即可(一般是system系统目录或放到软件同级目录里面),或者重新添加文件引用。 二、直接拷贝该文件到系统目录里:   1、Win...

LcVong的博客 1741

android 自定义控件gif视频教程,自定义控件 播放GIF动画

代码如下: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 Sy...

weixin_30497687的博客 192

android 自定义控件gif压缩包,Android实现可播放GIF动画的ImageView

Android的原生控件并不支持播放GIF格式的图片。我们都知道,在Android中如果想要显示一张图片,可以借助ImageView来完成,但是如果将一张GIF图片设置到ImageView里,它只会显示这张图片的第一帧,不会产生任何的动画效果。今天我们来编写一个自定义的增强型ImageView(继承ImageView),可以播放GIF格式的图片,暂且叫做GifImageView吧。1.自定义属性2...

weixin_42522400的博客 241

Android自定义控件播放GIF动画

转自:http://www.ilovn.com/topic/android-custom-control-play-gif-animation/ 谢谢原作者 ============================================================================================ Andr...

weixin_30861459的博客 147

android中播放gif动画之一

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 在android中默认的控件是不支持gif格式的图片的,只能显示图片的第一帧,这里需要借助于Movie类。将图片进行解析播放。下面使用一种纯代码的自定义控件,这种方式使用方便,但不支持像ImageView之类的组件...

孤云博客 3296

android gif 简书,Android播放Gif动画自定义ImageView)

Code:package com.android.launcher2;import android.annotation.FloatRange;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.Bitm...

weixin_39749243的博客 416

LABVIEW-动画界面设计(小触摸屏APP).rar

LABVIEW前面板UI设计中,动画效果比不可少,此程序为自己参考国外文献后自行编写,希望为正在进行此方面研发的小伙伴们提供一些借鉴。

labview控件4套+页面加载动画.rar

资源中包含4套Labview控件加一个页面加载动画效果的demo,很好的控件工具。开发界面更好看更快,还节约时间,亲测有用。

LabVIEW动画效果

通过LabVIEW写了一个动画界面,效果非常好,相信对你很有帮助!

android 播放gif方案集合

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100315 我个人是比较喜欢逛贴吧的,贴吧里总是会有很多搞笑的动态图片,经常看一看就会感觉欢乐很多,可以释放掉不少平时的压力。确实,比起一张单调的图片,动态图片明显更加的有意思。一般动态图片都是GIF格式的,浏览器中可以直接将这种格式的图片播放动画。 不过很可惜

我的专栏 3137

自己定义控件 播放GIF动画

代码例如以下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Wind...

diandingyin9417的博客 162

Android PowerImageView实现,可以播放动画的强大ImageView

http://blog.csdn.net/guolin_blog/article/details/11100315 我个人是比较喜欢逛贴吧的,贴吧里总是会有很多搞笑的动态图片,经常看一看就会感觉欢乐很多,可以释放掉不少平时的压力。确实,比起一张单调的图片,动态图片明显更加的有意思。一般动态图片都是GIF格式的,浏览器中可以直接将这种格式的图片播放动画。 不过很可惜的是

thinkinwm的专栏 5761

android image 位移动画_Android使用PowerImageView实现播放强大的ImageView动画效果

Android使用PowerImageView实现播放强大的ImageView动画效果发布时间:2020-08-19 22:01:53来源:脚本之家阅读:109作者:guolin我个人是比较喜欢逛贴吧的,贴吧里总是会有很多搞笑的动态图片,经常看一看就会感觉欢乐很多,可以释放掉不少平时的压力。确实,比起一张单调的图片,动态图片明显更加的有意思。一般动态图片都是GIF格式的,浏览器中可以直接将这种格式...

weixin_32841641的博客 277
上一篇: c# 自定义属性 属性类型为枚举
下一篇: CheckButton、CalcEdit
Jia_ShengJie
博客等级 码龄13年 91粉丝 139原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值