在程序中旋转TImage(不使用TTimer)

时间:2017-03-29 02:22:37

标签: android delphi rotation firemonkey

我试图在Android上使用Delphi-Firemonkey(柏林)在某个程度上从一个程度转换到另一个程度的TButton程序中制作一个简单的动画:

print(type(of:segue.destination))

我尝试使用和不使用Image1.Repaint,但动画根本不起作用,但使用TTimer时效果很好。任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

将FMX.Ani添加到uses子句,并在按钮onlick事件中使用TAnimator:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Image1.RotationAngle:=0;
 TAnimator.AnimateFloat(Image1,'RotationAngle',360,1,TAnimationType.InOut, TInterpolationType.Exponential );
end;

查看AnimateFloat,AnimateFloatWait,AnimateFloatDelay的文档,了解params的详细说明

答案 1 :(得分:-2)

不要在主线程中使用任何Sleep个调用,你可以在没有TTimer的情况下旋转TImage,所以:

procedure TForm1.Button1Click(Sender: TObject);
var
  sText: string;
begin
  Button1.Enabled := False;
  sText := Button1.Text;
  Button1.Text := 'Wait...';
  TThread.CreateAnonymousThread(procedure
  begin
    while Image1.RotationAngle < 360 do begin
      TThread.Synchronize(nil, procedure
      begin
        Image1.RotationAngle := Image1.RotationAngle + 2;
      end);
      Sleep(10);
    end;
    TThread.Synchronize(nil, procedure
    begin
      Button1.Text := sText;
      Button1.Enabled := True;
    end);
  end).Start;
end;

第二个解决方案:将Anim: TFloatAnimation添加到表单:

type
  TForm1 = class(TForm)
    ...
  public
    Anim: TFloatAnimation;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Anim.Enabled := False;
  Image1.RotationAngle := 0;
  Anim.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Anim := TFloatAnimation.Create(Self);
  Anim.Parent := Self;
  Anim.Duration := 1;
  Anim.StartValue := 0;
  Anim.StopValue := 360;
  Anim.PropertyName := 'Image1.RotationAngle';
end;