动画(animation)
动画在InoneGUI里分为窗口动画和控件动画两部分。
1.窗口动画是指窗口跳转时的变换动效,如A窗口跳转到B窗口。
typedef enum _WndAnimatorType{
EWND_ANIMATOR_NONE,
EWND_ANIMATOR_HTRANSLATE,
EWND_ANIMATOR_VTRANSLATE,
EWND_ANIMATOR_FADE,
EWND_ANIMATOR_CENTERSCALE,
EWND_ANIMATOR_LTOR,
EWND_ANIMATOR_RTOL,
EWND_ANIMATOR_TTOB, //top to bottom
EWND_ANIMATOR_BTOT,
EWND_ANIMATOR_SLIDEUP,
EWND_ANIMATOR_SLIDEDOWN,
EWND_ANIMATOR_SLIDELEFT,
EWND_ANIMATOR_SLIDERIGHT,
MAX_EWND_ANIMATOR,
}EWndAnimatorType;
设置窗口动画有两种方式:
全局动画配置,通过InoneGUI全局配置文件(inogui.cfg)设置,"anim"用于设置动画类型(值参考上面的枚举定义),"cttrt"用于配置动画窗口的位置信息。
例如设置全局动画配置为中间放大EWND_ANIMATOR_CENTERSCALE
"cttrt" : "0,45,800,435", "anim" : 4,
页面动画配置,用户在程序代码中配置窗口动画值。
例如设置主页的动画为水平平移EWND_ANIMATOR_HTRANSLATE(动画是在页面START前处理,所以配置页面的动画建议在OnPageCreate里处理).
VOID MainCtrl::OnPageCreate() { CLog::LogU("[%s:%s] \n",__FILE__,__FUNCTION__); mpPage->SetPageWndAnim(EWND_ANIMATOR_HTRANSLATE); }
优先级: 页面动画配置 > 全局动画配置,即用户有配置页面动画,使用用户配置,否则使用全局动画配置值。
2.控件动画是指控件运动动效,常用在控件的显示和消失等场景,让用户体验到现实中物体的效果。
2.1 创建控件动画控制对象
控件动画系统已经实现了其控制函数,用户仅需要配置相关参数来达成的期望效果,主要参数如下:
/** * @brief Brief description * 创建控件的动画控制类 * @param [in] pCtrl 需要动画控制的控件指针 * @param [in] eAnimType 控件动画实现的动画类型 * @param [in] eEasing 控件动画的动效曲线控制类型 * @param [in] iDelay 控件动画的启动延时时间Ms * @param [in] iDuration 控件动画的运行周期时间Ms * @return Return description * FAIL:返回NULL, OK:返回动画控制类对象指针 * @details More details */ CtrlAnimator* CreateCtrlAnimator(InoControl *pCtrl, ECtrlAnimType eAnimType = DEF_CTRLANIM_TYPE, EEasingType eEasing = DEF_CTRLANIM_EASING, UINT32 iDelay = DEF_CTRLANIM_DELAY, UINT32 iDuration = DEF_CTRLANIM_DURATION);
例如:创建控件(mpWindow1)动画控制对象pbottomctrlanim,pbottomctrlanim = CAM->CreateCtrlAnimator(mpWindow1, ECTRL_ANIMATOR_MOVE, EEASING_BOUNCE_OUT);
ECtrlAnimType动画类型,当前仅实现ECTRL_ANIMATOR_MOVE
typedef enum _CtrlAnimType{ ECTRL_ANIMATOR_NONE, ECTRL_ANIMATOR_MOVE, ECTRL_ANIMATOR_FADE, MAX_ECTRL_ANIMATOR, }ECtrlAnimType;
EEasingType动效类型
typedef enum _EasingType { EEASING_LINEAR = 0, EEASING_QUADRATIC_IN, EEASING_QUADRATIC_OUT, EEASING_QUADRATIC_INOUT, EEASING_CUBIC_IN, EEASING_CUBIC_OUT, EEASING_CUBIC_INOUT, EEASING_QUARTIC_IN, EEASING_QUARTIC_OUT, EEASING_QUARTIC_INOUT, EEASING_QUINTIC_IN, EEASING_QUINTIC_OUT, EEASING_QUINTIC_INOUT, EEASING_SIN_IN, EEASING_SIN_OUT, EEASING_SIN_INOUT, EEASING_POW_IN, EEASING_POW_OUT, EEASING_POW_INOUT, EEASING_CIRCULAR_IN, EEASING_CIRCULAR_OUT, EEASING_CIRCULAR_INOUT, EEASING_ELASTIC_IN, EEASING_ELASTIC_OUT, EEASING_ELASTIC_INOUT, EEASING_BACK_IN, EEASING_BACK_OUT, EEASING_BACK_INOUT, EEASING_BOUNCE_IN, EEASING_BOUNCE_OUT, EEASING_BOUNCE_INOUT, EEASING_FUNC_NR } EEasingType;
动效对应的曲线图
2.2 设置控件动画监听函数
/**
* @brief 设置控件动画监听函数
*
* @param [in] CbCtrlAnimListener: 回调函数
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT SetCtrlAnimatorListener(CbCtrlAnimListener pEventCb);
例如:设置控件动画监听函数CtrlAnimPageCallback, pbottomctrlanim->SetCtrlAnimatorListener(CtrlAnimPageCallback);
2.3 启动控件动画
/**
* @brief 启动控件动画
*
* @param [in] VOID
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT StartCtrlAnimator();
例如:启动控件(pbottomctrlanim)动画, pbottomctrlanim->StartCtrlAnimator();
2.4 停止控件动画
/**
* @brief 停止控件动画
*
* @param [in] VOID
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT StopCtrlAnimator();
例如:停止控件(pbottomctrlanim)动画, pbottomctrlanim->StopCtrlAnimator();
2.5 暂停控件动画
/**
* @brief 暂停控件动画
*
* @param [in] VOID
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT PauseCtrlAnimator();
例如:暂停控件(pbottomctrlanim)动画, pbottomctrlanim->PauseCtrlAnimator();
2.6 设置控件动画时间缩放
/**
* @brief 设置控件动画时间缩放
*
* @param [in] VOID
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT SetCtrlAnimator_TimeScale(FLOAT fTimeScale);
例如:设置控件(pbottomctrlanim)动画时间放大1.2倍, pbottomctrlanim->SetCtrlAnimator_TimeScale(1.2);
2.7 设置控件动画正反向播放
/**
* @brief 设置控件动画正反向播放
*
* @param [in] bReversed: TRUE:反向播放/FALSE:正向播放
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT SetCtrlAnimator_Reversed(BOOL bReversed);
例如:设置控件(pbottomctrlanim)动画反向, pbottomctrlanim->SetCtrlAnimator_Reversed(TRUE);
2.8 设置控件动画重复次数
/**
* @brief 设置控件动画重复次数
*
* @param [in] iRepeatTimes: 重复次数
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT SetCtrlAnimator_Repeat(UINT32 iRepeatTimes);
例如:设置控件(pbottomctrlanim)动画重复2次, pbottomctrlanim->SetCtrlAnimator_Repeat(2);
2.9 设置控件动画往返次数
/**
* @brief 设置控件动画往返次数
*
* @param [in] iYoyoTimes: 往返次数
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT SetCtrlAnimator_Yoyo(UINT32 iYoyoTimes);
例如:设置控件(pbottomctrlanim)动画往返2次, pbottomctrlanim->SetCtrlAnimator_Yoyo(2);
2.10 设置控件动画控件对象
/**
* @brief 设置控件动画控件对象
*
* @param [in] pCtrl: 控件对象
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT SetCtrlAnimator_Object(InoControl *pCtrl);
例如:设置控件(pbottomctrlanim)动画对象mpWindow2, pbottomctrlanim->SetCtrlAnimator_Object(mpWindow2);
2.11 设置控件动画动效类型
/**
* @brief 设置控件动画动效类型
*
* @param [in] eEasing: 动效类型
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT SetCtrlAnimator_Easing(EEasingType eEasing);
例如:设置控件(pbottomctrlanim)动画动效EEASING_POW_OUT, pbottomctrlanim->SetCtrlAnimator_Easing(EEASING_POW_OUT);
2.12 设置控件动画参数
/**
* @brief 设置控件动画参数
*
* @param [in] strName: 动画参数键值(CTRLANIM_YRANG/CTRLANIM_XRANG)
* @param [in] strVal: 动画参数值
* @return [out] ERR_OK: 成功,其它NG
*
* @details More details
*/
INT SetCtrlAnimator_PrivParam(STRING strName, STRING strVal);
例如:设置控件(pbottomctrlanim)动画参数CTRLANIM_YRANG为"480,334", pbottomctrlanim->SetCtrlAnimator_PrivParam(CTRLANIM_YRANG, "480,334");
控件动画示例代码,实现底部控制菜单和右边文件列表动态显示
//1. 控件动画初始化
CtrlAnimator *pbottomctrlanim = NULL;
CtrlAnimator *prightmctrlanim = NULL;
STATIC INT CtrlAnimPageCallback(CtrlAnimator *mpAnimCtrl, EAnimEventType eEventType, WPARAM wParam, LPARAM lParam)
{
//CLog::LogU("[%s:%s] mpAnimCtrl:%p eEventType:%d \n",__FILE__,__FUNCTION__, mpAnimCtrl, eEventType));
switch(eEventType){
case ECTRLANIM_EVENT_START:
break;
case ECTRLANIM_EVENT_STOP:
break;
case ECTRLANIM_EVENT_PAUSE:
break;
case ECTRLANIM_EVENT_END:
break;
default:
break;
}
return ERR_OK;
}
VOID CtrlanimCtrl::OnPageCreate()
{
pbottomctrlanim = CAM->CreateCtrlAnimator(mpWindow1, ECTRL_ANIMATOR_MOVE, EEASING_BOUNCE_OUT);
prightmctrlanim = CAM->CreateCtrlAnimator(mpList1, ECTRL_ANIMATOR_MOVE, EEASING_BOUNCE_OUT);
prightmctrlanim->SetCtrlAnimatorListener(CtrlAnimPageCallback);
pbottomctrlanim->SetCtrlAnimatorListener(CtrlAnimPageCallback);
//pbottomctrlanim->SetCtrlAnimator_Repeat(2);
//prightmctrlanim->SetCtrlAnimator_Repeat(2);
pbottomctrlanim->SetCtrlAnimator_PrivParam(CTRLANIM_YRANG, "480,334");
prightmctrlanim->SetCtrlAnimator_PrivParam(CTRLANIM_XRANG, "800,544");
}
//2. 控件动画启动
VOID CtrlanimCtrl::start_OnClick(InoControl *pControl, WPARAM wParam, LPARAM lParam)
{
CLog::LogU("[%s:%s] Name:%s IsSelected():%d \n",__FILE__,__FUNCTION__,pControl->GetName().c_str(),pControl->IsSelected());
if(pControl->IsSelected()){
pbottomctrlanim->SetCtrlAnimator_Reversed(TRUE);
prightmctrlanim->SetCtrlAnimator_Reversed(TRUE);
prightmctrlanim->SetCtrlAnimator_Easing(EEASING_POW_OUT);
pbottomctrlanim->SetCtrlAnimator_Easing(EEASING_POW_OUT);
InoPostMessage("hxn_statusbar",INO_USERMSG(1), 0);
}else{
prightmctrlanim->SetCtrlAnimator_Easing(EEASING_BOUNCE_OUT);
pbottomctrlanim->SetCtrlAnimator_Easing(EEASING_BOUNCE_OUT);
InoPostMessage("hxn_statusbar",INO_USERMSG(1), 1);
}
pbottomctrlanim->StartCtrlAnimator();
prightmctrlanim->StartCtrlAnimator();
}