namespace Yw.WinFrmUI.HydroL2d { /// /// 动画功能图片处理类 /// 使用方法 /// 用Image对象实例化,注册OnFrameChanged事件,在事件中处理图片当前帧改变需要做的事,注意调用Image需要lock,否则容易报错 /// internal class AnimateImage : IDisposable { /// /// 原始图片 /// public Image Image { get { return _img; } } private Image _img = null; /// /// 能否动画 /// public bool CanAnimate { get { return _canAnimate; } } private bool _canAnimate = false; /// /// 总帧数。 /// public int FrameCount { get { return _frameCount; } } private int _frameCount = 1; /// /// 播放的当前帧。 /// public int CurrentFrame { get { return _currentFrame; } } private int _currentFrame = 0; private FrameDimension _frameDimension; /// /// 动画当前帧发生改变时触发。 /// public event EventHandler OnFrameChanged; /// /// 实例化一个AnimateImage。 /// /// 动画图片 public AnimateImage(Image img) { _img = img; lock (_img) { _canAnimate = ImageAnimator.CanAnimate(_img); if (_canAnimate) { Guid[] guid = _img.FrameDimensionsList; _frameDimension = new FrameDimension(guid[0]); _frameCount = _img.GetFrameCount(_frameDimension); } } } /// /// 播放这个动画。 /// public void Play() { if (_canAnimate) { lock (_img) { ImageAnimator.Animate(_img, new EventHandler(FrameChanged)); } } } /// /// 停止播放。 /// public void Stop() { if (_canAnimate) { lock (_img) { ImageAnimator.StopAnimate(_img, new EventHandler(FrameChanged)); } } } /// /// 重置动画,使之停止在第0帧位置上。 /// public void Reset() { if (_canAnimate) { try { ImageAnimator.StopAnimate(_img, new EventHandler(FrameChanged)); lock (_img) { _img.SelectActiveFrame(_frameDimension, 0); _currentFrame = 0; } } catch { return; } } } private void FrameChanged(object sender, EventArgs e) { _currentFrame = _currentFrame + 1 >= _frameCount ? 0 : _currentFrame + 1; try { lock (_img) { var ci = _img.GetFrameCount(_frameDimension); if (ci < _currentFrame) return; _img.SelectActiveFrame(_frameDimension, _currentFrame); } if (OnFrameChanged != null) { OnFrameChanged(_img, e); } } catch { return; } } /// /// 释放图片资源 /// public void Dispose() { if (this.Image != null) { this.Image.Dispose(); } } } }