在即将到来的ChinaCock组件中,将支持独家实现的过场动画实现方案,在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;

同样是一行代码,就实现了关闭窗口的动画。

现在,你已经看到,为窗口间调用增加过场动画,在不改变原来实现的情况下,只用了两行代码,就完成了!

最后,来张实际的效果图:

图文解说ChinaCock过场动画的实现_回调函数