天天看點

圖文解說ChinaCock過場動畫的實作

在即将到來的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;      

同樣是一行代碼,就實作了關閉視窗的動畫。

現在,你已經看到,為視窗間調用增加過場動畫,在不改變原來實作的情況下,隻用了兩行代碼,就完成了!