Delphi에서 TPathAnimation을 사용해 보았습니다.

FireMonkey에는 시간이 지남에 따라 속성 값을 변경하는 애니메이션 구성 요소가 있습니다.
애니메이션에 대해서는, 이전 「프로퍼티치에 의한 애니메이션의 차이를 조사해 보았다」 에서, 프로퍼티의 값에 의해 시점으로부터 종점까지의 움직임이 다른지를 소개했습니다

대부분의 애니메이션 컴포넌트는 한 방향으로 값을 변경하지만 일부는 일련의 값을 따라 변경할 수 있다는 편리한 특성을 가지고 있습니다.
그 중 하나 인 TPathAnimation을 사용해 보았습니다.

샘플 애플리케이션



이런 샘플을 만들었습니다
  • 1 Down 버튼을 클릭하면 막대가 50 아래로 이동합니다
  • 1 Down Bound 버튼을 클릭하면 바운드 동작으로 막대가 50 아래로 이동합니다
  • New One 버튼을 클릭하면 위에서 막대가 떨어지고 초기 상태로 돌아갑니다.




    샘플 설계 화면 및 코드



    설계 화면은 이쪽


    설계시의 포인트는, 다음의 2개입니다
  • FloatAnimation, PathAnimation 모두 바인 Rectangle의 아이로 하는 것
  • FloatAnimation의 PropertyName 속성을 값을 변경하는 Rectangle의 Position.Y 속성으로 설정합니다.

    코드로 기술하고 있는 FloatAnimation 의 properties 는, 객체 인스펙터상에서 설정할 수 있습니다만, 이 샘플에서는 비교를 위해서 와자라고 기술하고 있습니다
    unit Unit3;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
      FMX.Objects, FMX.Layouts, FMX.Controls.Presentation, FMX.Ani;
    
    type
      TForm3 = class(TForm)
        Button1: TButton;
        Layout1: TLayout;
        Layout2: TLayout;
        Button2: TButton;
        Rectangle1: TRectangle;
        Panel1: TPanel;
        FloatAnimation1: TFloatAnimation;
        PathAnimation1: TPathAnimation;
        Button3: TButton;
        FloatAnimation2: TFloatAnimation;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { private 宣言 }
        mCnt: Integer;
      public
        { public 宣言 }
      end;
    
    var
      Form3: TForm3;
    
    implementation
    
    {$R *.fmx}
    
    procedure TForm3.Button1Click(Sender: TObject);
    begin
    // 1 Down ボタン動作
      if mCnt > 4 then Exit;  // これ以上は Down できない
    
      mCnt := mCnt + 1;
    
      FloatAnimation2.Stop;                                     // アニメーションの終了
      FloatAnimation2.Duration := 2;
      FloatAnimation2.StartValue := Rectangle1.Position.Y + 0;  // 始点
      FloatAnimation2.StopValue := Rectangle1.Position.Y + 50;  // 終点
      FloatAnimation2.Start;                                    // アニメーションの開始
    end;
    
    procedure TForm3.Button2Click(Sender: TObject);
    begin
    // New One ボタン動作
      FloatAnimation1.Stop;                                    // アニメーションの終了
      FloatAnimation1.Duration := 1;
      FloatAnimation1.StartValue := -250;                      // 始点 (画面の外)
      FloatAnimation1.StopValue := 150;                        // 終点 (最初のバーの位置)
      FloatAnimation1.Start;                                   // アニメーションの開始
      mCnt := 0;
    end;
    
    procedure TForm3.Button3Click(Sender: TObject);
    begin
    //1 Down Bound ボタン動作
      if mCnt > 4 then Exit;  // これ以上は Down できない
    
      mCnt := mCnt + 1;
    
      PathAnimation1.StopAtCurrent;                           // アニメーションの終了
      PathAnimation1.Start;                                   // アニメーションの開始
    end;
    
    procedure TForm3.FormCreate(Sender: TObject);
    begin
      mCnt := 0; //初期化
      PathAnimation1.Create(Self);
      PathAnimation1.Path.MoveTo(PointF(0,50));  // 移動する範囲を指定
      PathAnimation1.Path.LineTo(PointF(0,10));  // 途中座標の指定
      PathAnimation1.Path.LineTo(PointF(0,50));  // 途中座標の指定
      PathAnimation1.Path.LineTo(PointF(0,20));  // 途中座標の指定
      PathAnimation1.Path.LineTo(PointF(0,50));  // 途中座標の指定
      PathAnimation1.Path.LineTo(PointF(0,30));  // 途中座標の指定
      PathAnimation1.Path.ClosePath;             // 座標の指定終了
      PathAnimation1.Duration := 2;
    end;
    
    end.
    

    해설



    FloatAnimation 의 경우는 한쪽 방향으로의 값의 변화 밖에 할 수 없기 때문에, 만약, 똑같이 바운드시키는 것 같은 동작을 행한다면
  • 0 → 50 으로 이동하는 좌표를 정해 Start, Stop
  • 50 → 10 으로 이동하는 좌표를 정해 Start, Stop
  • 10 → 50 으로 이동하는 좌표를 정해 Start, Stop
  • 50 → 20 으로 이동하는 좌표를 정해 Start, Stop
  • 20 → 50 으로 이동하는 좌표를 정해 Start, Stop
  • 50 → 30 으로 이동하는 좌표를 정해 Start, Stop
  • 30 → 50 으로 이동하는 좌표를 정해 Start, Stop

  • 라고 하는 코드를 써야 한다(또는 상기의 설정을 한 FloatAnimation 를 준비해, 차례로 동작시킨다)
    PathAnimation의 경우 MoveTo에서 첫 번째 이동 범위를 지정하고 LineTo에서 해당 범위 내에서 더 이동할 좌표를 지정할 수 있습니다.
    이 샘플의 경우
  • MoveTo에서 0 → 50 이동을 지정합니다.
  • 이 이동 중에 움직이고 싶은 좌표가 있으면 LineTo를 사용해 좌표를 복수 지정한다 (좌표는 MoveTo로 지정한 좌표로부터 벗어나도 OK)
  • 모든 좌표의 지정이 끝나면 ClosePath 로 좌표 지정 종료로 한다
  • 이 이동을 얼마나 오래 걸릴지 Duration에 지정
  • 사용할 때는, 작성한 PathAnimation 를 Start 시키는 것만

  • 특수 효과적인 움직임을 만드는 데 사용할 수 있습니다.

    좋은 웹페이지 즐겨찾기