@@ -29,6 +29,7 @@ TBezier = class
29
29
epsilon = 1.0E-5 ;
30
30
private
31
31
ax, bx, cx, ay, by, cy: Double;
32
+ x1, y1, x2, y2: Double;
32
33
public
33
34
constructor Create(p1x, p1y, p2x, p2y: Double);
34
35
procedure SetData (p1x, p1y, p2x, p2y: Double);
@@ -37,6 +38,11 @@ TBezier = class
37
38
function SampleCurveDerivativeX (t: Double): Double;
38
39
function SolveCurveX (x, epsilon: Double): Double;
39
40
function Solve (x, epsilon: Double): Double;
41
+ class function GetLinear : TBezier;
42
+ class function GetEase : TBezier;
43
+ class function GetEaseIn : TBezier;
44
+ class function GetEaseOut : TBezier;
45
+ class function GetEaseInOut : TBezier;
40
46
end ;
41
47
42
48
[ComponentPlatformsAttribute(TFMXPlatforms)]
@@ -58,6 +64,7 @@ TFMXBezierAnimation = class(TFloatAnimation)
58
64
constructor Create(AOwner: TComponent); override;
59
65
destructor Destroy; override;
60
66
procedure SetData (p1x, p1y, p2x, p2y: Double);
67
+ procedure SetBezier (bezier: TBezier);
61
68
function BezierTime : Single;
62
69
published
63
70
property P1X: Double read FP1X write SetP1X;
@@ -66,11 +73,13 @@ TFMXBezierAnimation = class(TFloatAnimation)
66
73
property P2Y: Double read FP2Y write SetP2Y;
67
74
end ;
68
75
69
- function GetEaseInOut : TBezier;
70
-
71
76
implementation
72
77
73
78
var
79
+ Linear: TBezier = nil ;
80
+ Ease: TBezier = nil ;
81
+ EaseIn: TBezier = nil ;
82
+ EaseOut: TBezier = nil ;
74
83
EaseInOut: TBezier = nil ;
75
84
76
85
type
@@ -79,18 +88,49 @@ TAnimationHelper = class helper for TAnimation
79
88
function GetDelayTime : Single;
80
89
end ;
81
90
82
- function GetEaseInOut : TBezier;
91
+ { TBezier }
92
+
93
+ constructor TBezier.Create(p1x, p1y, p2x, p2y: Double);
94
+ begin
95
+ SetData(p1x, p1y, p2x, p2y);
96
+ end ;
97
+
98
+ class function TBezier.GetEase : TBezier;
99
+ begin
100
+ if not Assigned(Ease) then
101
+ Ease := TBezier.Create(0.25 ,0.1 ,0.25 ,1 );
102
+ Result := Ease;
103
+ end ;
104
+
105
+ class function TBezier.GetEaseIn : TBezier;
106
+ begin
107
+ if not Assigned(EaseInOut) then
108
+ EaseInOut := TBezier.Create(0.42 ,0 ,1 ,1 );
109
+ Result := EaseIn;
110
+ end ;
111
+
112
+
113
+ class function TBezier.GetEaseInOut : TBezier;
83
114
begin
84
115
if not Assigned(EaseInOut) then
85
116
EaseInOut := TBezier.Create(0.42 ,0 ,0.58 ,1 );
86
117
Result := EaseInOut;
87
118
end ;
88
119
89
- { TBezier }
90
120
91
- constructor TBezier.Create(p1x, p1y, p2x, p2y: Double) ;
121
+ class function TBezier.GetEaseOut : TBezier ;
92
122
begin
93
- SetData(p1x, p1y, p2x, p2y);
123
+ if not Assigned(EaseInOut) then
124
+ EaseInOut := TBezier.Create(0 ,0 ,0.58 ,1 );
125
+ Result := EaseOut;
126
+ end ;
127
+
128
+
129
+ class function TBezier.GetLinear : TBezier;
130
+ begin
131
+ if not Assigned(Linear) then
132
+ Linear := TBezier.Create(0 , 0 , 1 , 1 );
133
+ Result := Linear;
94
134
end ;
95
135
96
136
function TBezier.SampleCurveDerivativeX (t: Double): Double;
@@ -111,6 +151,10 @@ function TBezier.SampleCurveY(t: Double): Double;
111
151
112
152
procedure TBezier.SetData (p1x, p1y, p2x, p2y: Double);
113
153
begin
154
+ x1 := p1x;
155
+ y1 := p1y;
156
+ x2 := p2x;
157
+ y2 := p2y;
114
158
// Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
115
159
cx := 3.0 * p1x;
116
160
bx := 3.0 * (p2x - p1x) - cx;
@@ -215,6 +259,15 @@ procedure TFMXBezierAnimation.ProcessAnimation;
215
259
end ;
216
260
end ;
217
261
262
+ procedure TFMXBezierAnimation.SetBezier (bezier: TBezier);
263
+ begin
264
+ FP1X := bezier.x1;
265
+ FP1Y := bezier.y1;
266
+ FP2X := bezier.x2;
267
+ FP2Y := bezier.y2;
268
+ FBezier.SetData(bezier.x1, bezier.y1, bezier.x2, bezier.y2);
269
+ end ;
270
+
218
271
procedure TFMXBezierAnimation.SetData (p1x, p1y, p2x, p2y: Double);
219
272
begin
220
273
FP1X := p1x;
@@ -275,5 +328,9 @@ function TAnimationHelper.GetDelayTime: Single;
275
328
276
329
initialization
277
330
finalization
331
+ Linear.Free;
332
+ Ease.Free;
333
+ EaseIn.Free;
334
+ EaseOut.Free;
278
335
EaseInOut.Free;
279
336
end .
0 commit comments