图文解说ChinaCock过场动画的实现
在即将到来的ChinaCock组件新版中,将支持独家实现的Form过场动画实现方案,在Form与Form调用之间增加过场动画。
该实现有以下优点:
1.动画实现与业务分离,耦合度低,动画的实现,不与窗口上的任何可视与非可视组件发生关系,完全独立,只要一行代码就能增加动画效果,仅仅需要调用动画类的进场方法PushToForm或出场方法PopBackForm
2.Form与Form耦合度低,源窗口与目标窗口的调用,只是改用动画类TCCFormTransition来显示与关闭目标窗口。
3.适配Delphi原生的Form建立方式,当在Delphi建立一个窗口时,他会自动为窗口声明一个实例变量,我们使用这个变量来显示窗口即可。
4.过场动画自然流畅、无闪烁。作者在实现过程中,做了大量的优化工作,采用了原生的平台SDK方法,最终实现最优的执行效率,从而实现动画全程无闪烁,自然流畅的效果。
5.跨平台,目前适配Windows与Android平台。
接下来,我们看看,如何在实际项目中,使用上面的实现方案:
对于我的项目,有一个MainForm,做为主窗口,当进入App时显示的界面,在这个窗口上,用户要进行业务操作,这时候要调用其他的窗口,比如,要做身份验证,采集用户的身份证,我们把这个窗口定义CameraIdCardForm。
1.MainForm调用CameraIdCardForm,看代码:
procedure TMainForm.Text3Click(Sender: TObject); begin if not Assigned(CameraIdCardForm) then//这里我们建立目标窗口 CameraIdCardForm := TCameraIdCardForm.Create(Application);
//用动画显示目标窗口 TCCFormTransition.PushToForm(Self, CameraIdCardForm, TCCFormTransition.TTransitionType.SlideInFromRight, False, procedure(AInfo: TCCFormTransition.TFormTransitionInfo) begin
//目标窗口显示完成调用这个回调函数,你可以进一步对目标窗口做初始化动作,比如,加载数据 // showmessage('PushComplete'); end, procedure(AInfo: TCCFormTransition.TFormTransitionInfo) begin
//目标窗口关闭时,调用的回调函数,你可以能过AInfo.ToForm取得目标窗口,使用他来做业务处理 //TCameraIdCardForm(AInfo.ToForm).
//这里,我们可以释放目标窗口 FreeAndNil(CameraIdCardForm); // showmessage('PopComplete'); end); end;
代码中,可以看到,只是一个方法,就为调用窗口加载了动画。
PushToForm的参数说明:
class procedure TCCFormTransition.PushToForm( AFrom, //原窗口,即调用窗口 ATo: TCustomForm; //目标窗口,即被调用窗口,由原窗口负责实例化 const ATransType: TTransitionType = SlideInFromRight; //动画类型 const AFixedFrom: Boolean = false;//实现原窗口不动,只为目标窗窗增加动画 const APushComplete: TProc<TFormTransitionInfo> = nil; //目标窗口显示完的回调 const APopComplete: TProc<TFormTransitionInfo> = nil); //目标窗口关闭后的回调
现在你看到了,一行代码实现过场动画,是不是非常简单!
2.再来看一下,CameraIdCardForm关闭时,增加动画的实现:
//窗口上的返回按钮 procedure TCameraIdCardForm.TextBackClick(Sender: TObject); begin DoPopBackForm(mrCancel); end; //返回方法 procedure TCameraIdCardForm.DoPopBackForm(const AModalResult: TModalResult); begin self.ModalResult := AModalResult;//这一行不是必须的,按你需要 TCCFormTransition.PopBackForm();//显示关闭动画后关闭当前窗口 end;
同样是一行代码,就实现了关闭窗口的动画。
现在,你已经看到,为窗口间调用增加过场动画,在不改变原来实现的情况下,只用了两行代码,就完成了!
最后,来张实际的效果图: