现在很多GUI的窗口在显示的时候,都有淡入和淡出的效果. 或者是飞入/飞出的效果(是叫飞入飞出吗?呵呵.). 也就是说1:可以自由控制窗口在两个状态间进行融合. 2: 能自由控制窗口的变换--旋转和缩放等.
为此我把窗口独立成一个个状态:
struct _XUI_API_ xuiWindowState_t
{
char m_Name[32];
xColor_4f m_color;
xColor_4f m_textcolor;
xuiWindowBorder_t m_border;
xuiRegion m_Region;
};
再定义一个混合器
class _XUI_API_ xuiWindowStateBlender
{
xuiWindowState_t m_Start;
xuiWindowState_t m_End;
long m_time;
long m_totalTime;
xuiWindow* m_pWindow;
public:
xuiWindowStateBlender(xuiWindow* pWindow);
virtual ~xuiWindowStateBlender();
virtual bool update(long passedTime);
virtual bool isInBlending() const;
virtual bool stop();
virtual bool setState(xuiWindowState_t* pStartState , xuiWindowState_t* pEndState , long _time);
virtual bool setState(xuiWindowState_t* pEndState , long _time);
};
这些状态都可以写在xml里. 比如"normal"状态, "hide"状态. 那么窗口从隐藏到显示的变换过程就是hide 到 normal的变化过程.
以下为show的代码
xuiDialog::show()
{
xuiWindowState _hideState = findState("hide");
xuiWindowState _normalState = findState("normal");
m_pWinStateBlender->setState(hideState , normalState , 200);//200 ms混合完毕.
}
以下为按钮按下的处理
xuiButton::onLButtonDown()
{
xuiWindowState _pressState = findState("press");
xuiWindowState _normalState = findState("normal");
m_pWinStateBlender->setState(pressState , normalState , 200);//200 ms混合完毕.
}
这样的代码.能够基本把所有状态切换的过程全部统一起来. 已经能完成alpha过渡,位置过渡等. 不过要完成两个图片融合还需要再绘制的时候做一些额外的事情.
对于旋转等效果.我们可以用同样的方式处理xuiWindowTransform . 为窗口引入一个xuiWindowTransform的对象表示窗口的变换, 用xuiWindowTransBlender来控制这个变换. 可以把大部分和窗口变换有关的代码统一起来.