现在流行的界面,基本都会支持动画效果,如果你的界面库没有这方面的支持,可以使用layered窗口,实现一些动画效果。
先来介绍下常用的几个基本的动画效果:
1.闪动的图标,用于指引用户点击。
2.播放一个简单的动画:比如一个垃圾桶按钮点击后,会动态打开,甚至会从里面飞出来一个图标到界面上指定的位置,然后变成按钮出现。
3窗口从一个位置移动到界面上,关闭后渐隐
首先,创建一个layered窗口,支持几个简单的接口:
class CLayeredWnd : public CWindowImpl<CLayeredWnd, CWindow>
{
public:
BOOL Init(HWND hParent);
void SetBitmap(HBITMAP hBmp, enumStretchType Stretch);
void Show();
void Hide();
void SetAlpha(BYTE byAlpha);
void SetBounds(RECT rc);
void Refresh();
}
通过组合的方法,可以实现movingwnd(移动窗口,可以指定起点位置大小,终点位置大小,移动持续时长,移动过程alpha的改变),flickerwnd(在一个位置上下(左右)晃动的窗口),SequenceImageWnd(播放多帧图片,支持倒序播放,循环播放)
这几个基本的窗口,组合起来,可以实现很多的动画效果,而且不需要修改界面本身的逻辑,是完全脱离在界面之外的动画。
基于上面的想法,我实现了一个动画系统,现在的做法是对每个动画,写了一个类来控制整个过程:比如先用movingwnd放大窗口,然后用flickerwnd闪烁。
后续还会完善这个动画系统,对动画的过程通过task来描述,每个task指定要做的动画以及动画结束后要执行的操作,将动画的过程一般化。