我试图在Android上使用Delphi-Firemonkey(柏林)在某个程度上从一个程度转换到另一个程度的TButton程序中制作一个简单的动画:
print(type(of:segue.destination))
我尝试使用和不使用Image1.Repaint,但动画根本不起作用,但使用TTimer时效果很好。任何人都知道如何解决这个问题?
答案 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;