自定义控件 播放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 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);

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 19:10:09

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

android 拓展ImageView播放GIF动画

原生Android控件ImageView并不能支持播放GiF格式的图片.如果将一张GIF的图片放入ImageView中,它只会显示图片的第一帧,不会产生任何动画效果. Android中播放GIF动画实现方法还是用多种的,最常用的就是使用   Frame动画, 但局限性较多,所以下面用一种拓展的ImageView实现效果. 1.要用到自定义控件,就要使用自定义控件的属性,因此需要在values下新建一个attrs.xml,可以为这个文件中添加任何需要自定义的属性. 这里只需要一个auto_play

自定义控件三部曲之动画篇(九)——联合动画的代码实现

前言:为了梦想,行色匆匆,是否会错过眼前的风景?有时也会懊悔,为何当时没能好好享受时光,但如果当时真的跟他人一样,是否现在也会跟他人一样羡慕现在的自己? 相关博客: <Android自定义控件三部曲文章索引> 上几篇给大家分别讲了ValueAnimator和ObjectAnimator,相比而言ObjectAnimator更为方便而且由于set函数是在控件类内部实现,所以封装性更好.而且在现实使用中一般而言都是使用ObjectAnimator的机率比较大. 但ValueAnimator和Obj

cocos2d 播放GIF动画类

cocos2d 播放GIF动画类 以前项目中曾经用到过,后来因为GIF图像的质量较差,被弃用了,把公司名字去掉分享下,根据网上资料改编的cocos2d-iphone版的. // // CCSpriteGif.h // // Created by Yuming on 13-1-23. // Copyright 2013年 __MyCompanyName__. All rights reserved. // // 本类需要导入ImageIO.framework #import <Foundation

【v2.x OGE-example 第三节 播放精灵动画】

1. 位置:Drawing_example --> SpriteAnimated 2. 类名:SpriteAnimated 3.利用AnimatedSprite动画精灵类能够实现多种多种动作. 比如: (1).播放精灵动画,指定播放速度: (2).播放特定帧,指定特定每一帧的帧速,能够实现慢放,快进,跳帧.倒放等. (3).能够循环播放,也能够仅仅播放一次,也能够指定播放次数: (4).增加监听器.全然掌握动画的播放状态,開始?结束?播到第几帧?是否播放完?循环了几次: 4.一下是Animate

Unity3D中播放序列帧动画

[狗刨学习网] class FrameAnimation { private float fps = 10.0f; private Rect drawPos; private float time = 0; private int currentIndex = 0; public void DrawFrameAnimation(Texture[] frameTex) { int length = frameTex.Length; GUI.DrawTexture(drawPos, frameTex

关于Cocos Creator用js脚本代码播放骨骼动画的步骤和注意事项

1.用cc.find()方法找到相应的骨骼动画节点,并把这个对象赋值给一个var出来的新对象. 具体代码:var spineboy_anim = cc.find("UI_Root/anchor_lb/spineboy"); 2.用getComponent()方法找到相应骨骼动画节点的骨骼动画组件,并把这个对象赋值给一个var出来的新对象. 具体代码:var ske_anim_comp = spineboy_anim.getComponent(sp.Skeleton); 3.把第二点的新

iOS 播放Gif动画

// //  loadGifView.h //  PlayGif // //  Created by 寒竹子 on 15/4/27. //  Copyright (c) 2015年 寒竹子. All rights reserved. // #import <UIKit/UIKit.h> @interface loadGifView : UIView /** *  @brief 初始化 * *  @return */ - (instancetype)initWithFrame:(CGRect)f

能够播放gif动画的ImageView

一般ImageView并不能播放gif动画. 此处播放gif动画的核心是: 1.将gif中的每一帧拿出来,然后使用Movie类的setTime()和draw()这两个方法来实时的画界面. 2.在ondraw中来处理这些绘制操作.进行逻辑推断,是否自己主动播放,假设不是自己主动播放的话就须要绘制一个開始button,同事设置画面定位到gif动画的第一帧 其它在代码中查看.主要类GifImageView.java凝视比較全.应该看懂问题不大. 注意的是,须要values目录下创建attrs,由于须要

【原创】测试不同浏览器播放canvas动画的平滑程度

Canvas无疑是HTML5开放式网络平台最激动人心的技术之一.目前,除了IE8以外,各类浏览器的新版本都支持HTML5 Canvas. 程序员需要通过Javascript调用Canvas API.基本的Canvas API包括一个2D环境,该环境允许程序员绘制各种图形和渲染文本,并将图像显示在浏览器窗口的定义区域.实现Canvas动画时,程序员需要在下一帧渲染前设置屏幕内容,重绘图像以实现动画效果.Canvas动画的实现有点儿像“翻页动画”,在绘本上的每页绘制不同图像,快速翻过时每一帧都连续起