Registriert seit: 3. Sep 2004
4.629 Beiträge
Delphi 10.2 Tokyo Starter
|
AW: Panel geschmeidig ein- und ausblenden?
18. Sep 2017, 02:18
Tatsächlich enthält mein Beispielcode einen kleinen Flüchtigkeitsfehler <
statt <=
in der Schleifenbedingung. Habe die Kurvenfunktionen mal etwas intuitiver gestaltet:
Delphi-Quellcode:
function EaseInQuart(T, B, C, D: Integer): Integer;
var
T2: Single;
begin
T2 := T / D;
Result := Round(C * T2 * T2 * T2 * T2) + B;
end;
function EaseOutQuart(T, B, C, D: Integer): Integer;
var
T2: Single;
begin
T2 := T / D - 1;
Result := Round(-C * (T2 * T2 * T2 * T2 - 1)) + B;
end;
function EaseInQuint(T, B, C, D: Integer): Integer;
var
T2: Single;
begin
T2 := T / D;
Result := Round(C * T2 * T2 * T2 * T2 * T2) + B;
end;
function EaseOutQuint(T, B, C, D: Integer): Integer;
var
T2: Single;
begin
T2 := T / D - 1;
Result := Round(C * (T2 * T2 * T2 * T2 * T2 + 1)) + B;
end;
function EaseOutBounce(T, B, C, D: Integer): Integer;
var
T2: Single;
begin
T2 := T / D;
if (T2 < (1.0 / 2.75)) then
begin
Result := Round(C * (7.5625 * T2 * T2)) + B;
end else
if (T2 < (2.0 / 2.75)) then
begin
T2 := T2 - (1.5 / 2.75);
Result := Round(C * (7.5625 * T2 * T2 + 0.75)) + B;
end else
if (T2 < (2.5 / 2.75)) then
begin
T2 := T2 - (2.25 / 2.75);
Result := Round(C * (7.5625 * T2 * T2 + 0.9375)) + B;
end else
begin
T2 := T2 - (2.625 / 2.75);
Result := Round(C * (7.5625 * T2 * T2 + 0.984375)) + B;
end;
end;
function EaseOutElastic(T, B, C, D: Integer): Integer;
var
S, P, A, T2: Double;
begin
if (T = 0) then
begin
Exit(B);
end;
T2 := T / D;
if (T2 = 1) then
begin
Exit(B + C);
end;
P := D * 0.3;
A := C;
if (A < Abs(C)) then
begin
S := P / 4;
end else
begin
S := P / (2 * PI) * ArcSin(C / A);
end;
Result := Round(A * Power(2, -10 * T2) * Sin((T2 * D - S) * (2 * PI) / P)) + C + B;
end;
procedure TForm1.Button3Click(Sender: TObject);
const
DURATION = 1000;
POS_START = 8;
POS_END = 520;
var
C, D: Cardinal;
begin
// Über einen Zeitraum von 1 Sekunde von Position 8 nach Position 320 verschieben
C := GetTickCount;
D := 0;
while (D <= DURATION) do
begin
Button1.Left := EaseOutElastic(D, POS_START, POS_END - POS_START, DURATION);
Application.ProcessMessages;
D := GetTickCount - C;
end;
Button1.Left := POS_END;
end;
procedure TForm1.Button4Click(Sender: TObject);
const
DURATION = 1000;
POS_START = 520;
POS_END = 8;
var
C, D: Cardinal;
begin
// Über einen Zeitraum von 1 Sekunde von Position 320 nach Position 8 verschieben
C := GetTickCount;
D := 0;
while (D <= DURATION) do
begin
Button1.Left := EaseOutElastic(D, POS_START, POS_END - POS_START, DURATION);
Application.ProcessMessages;
D := GetTickCount - C;
end;
Button1.Left := POS_END;
end;
Erklärung der Parameter:
Delphi-Quellcode:
T = Vergangene Zeit
B = Startwert
C = Änderung
D = Dauer der Animation
Als Bonus gibt es noch die EaseOutBounce
und die EaseOutElastic
Kurven, welche ich persönlich ganz schick finde.
Geändert von Zacherl (18. Sep 2017 um 02:38 Uhr)
|
|
Zitat
|