2017-03-29 8 views
0

이 같은 델파이 Firemonkey (베를린)를 사용하여 안드로이드에 다른 정도에서 회전하는 TImage의의이 TButton 절차 내부에 간단한 애니메이션을 만들려고 노력했다 :(TTimer를 사용하지 않고) 프로 시저 내부 회전 TImage의

procedure TForm1.Button1Click(Sender: TObject); 
begin 
while Image1.RotationAngle < 360 do begin 
Image1.RotationAngle := Image1.RotationAngle+1; 
Image1.Repaint; 
Sleep(1); 
end; 
end; 

Image1.Repaint를 사용하거나 사용하지 않고 시도했지만 애니메이션이 작동하지 않지만 TTimer를 사용할 때 완벽하게 작동합니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?

+1

주 스레드를 차단하고 있습니다. 주 스레드가 반응하도록 타이머를 사용하십시오. –

+1

애니메이션에는 메시지 처리가 필요합니다. 따라서 메시지 처리를 차단하지 마십시오. FMX의 'TFloatAnimation' (http://docwiki.embarcadero.com/Libraries/en/FMX.Ani.TFloatAnimation) 컴포넌트를 사용하여 시간 경과에 따른'RotationAngle '을 조정하는 것이 더 좋은 방법입니다. [FireMonkey 애니메이션 효과 사용하기] (http://docwiki.embarcadero.com/RADStudio/en/Using_FireMonkey_Animation_Effects)를 참조하십시오. –

+0

타이머를 사용할 때의 문제점은 무엇입니까? (ButtonClick에서는 애니메이션을 시작 및/또는 중지하기 위해 Timer를 활성화 및 비활성화 할 수 있습니다). 메인 스레드를 차단하지 않기 때문에 정상적으로 작동한다고합니다. –

답변

-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; 
+1

정말 나쁜 생각입니다. 예를 들어, 버튼을 몇 번 더 누르면 ..... ..... –

+1

주 스레드의 모든 절전 모드는 끔찍한 생각입니다. – Frazz

+0

예, 이전 버전의 답변에 잘못된 아이디어라는 코멘트가 포함 된 예가 포함되어 있습니다. –

1

가 FMX를 추가합니다. uses 절을 사용하고 button 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에 대한 자세한 내용은 문서를 참조하십시오.