BaiduFMX
226 строк · 5.8 Кб
1// ***************************************************************************
2//
3// FMXComponents: Firemonkey Opensource Components Set
4//
5// TFMXToast is a toast component using pure fmx
6//
7// ¸Ã¿Ø¼þ²Î¿¼ÁËAoneµÄÎÄÕÂ
8// http://www.cnblogs.com/onechen/p/7130227.html
9//
10// https://github.com/zhaoyipeng/FMXComponents
11//
12// ***************************************************************************
13// version history
14// 2017-09-27, v0.1.0.0 :
15// first release
16
17unit FMX.Toast;
18
19interface
20
21uses
22System.Classes,
23System.Types,
24System.UITypes,
25FMX.Types,
26FMX.Layouts,
27FMX.Objects,
28FMX.Graphics,
29FMX.Ani,
30FMX.ComponentsCommon;
31
32type
33
34[ComponentPlatformsAttribute(TFMXPlatforms)]
35TFMXToast = class(TComponent)
36private
37FToastContainer: TLayout;
38FToastText: TText;
39FToastRect: TRectangle;
40FToastAnimation: TFloatAnimation;
41
42FToastMessage: string;
43FFontColor: TAlphaColor;
44FBackColor: TAlphaColor;
45FFontSize: Single;
46FDelay: Single;
47FIsBlock: Boolean;
48FIsShowIng: Boolean;
49FAlign: TTextAlign;
50procedure SetToastMessage(const Value: string);
51procedure SetFontColor(const Value: TAlphaColor);
52procedure SetBackColor(const Value: TAlphaColor);
53procedure SetFontSize(const Value: Single);
54procedure CreateContainer;
55procedure OnAnimationFinish(Sender: TObject);
56procedure SetDelay(const Value: Single);
57procedure SetIsBlock(const Value: Boolean);
58procedure SetAlign(const Value: TTextAlign);
59public
60constructor Create(AOwner: TComponent); override;
61destructor Destroy; override;
62procedure Show(AOwner: TFmxObject);
63procedure Close;
64property IsShowing: Boolean read FIsShowing;
65published
66property Align: TTextAlign read FAlign write SetAlign default TTextAlign.Trailing;
67property FontSize: Single read FFontSize write SetFontSize;
68property FontColor: TAlphaColor read FFontColor write SetFontColor default TAlphaColors.White;
69property BackColor: TAlphaColor read FBackColor write SetBackColor default TAlphaColors.Gray;
70property ToastMessage: string read FToastMessage write SetToastMessage;
71property Delay: Single read FDelay write SetDelay;
72property IsBlock: Boolean read FIsBlock write SetIsBlock default False;
73end;
74
75implementation
76
77{ TFMXToast }
78
79procedure TFMXToast.Close;
80begin
81if FIsShowing then
82begin
83FToastAnimation.Stop;
84end;
85end;
86
87constructor TFMXToast.Create(AOwner: TComponent);
88begin
89inherited;
90FToastContainer := nil;
91FFontSize := 16;
92FFontColor := TAlphaColors.White;
93FBackColor := TAlphaColors.Gray;
94FDelay := 2.0;
95FToastMessage := 'Toast';
96FIsBlock := False;
97FIsShowing := False;
98FAlign := TTextAlign.Trailing;
99end;
100
101destructor TFMXToast.Destroy;
102begin
103inherited;
104end;
105
106procedure TFMXToast.OnAnimationFinish(Sender: TObject);
107begin
108FToastContainer.DisposeOf;
109FIsShowing := False;
110end;
111
112procedure TFMXToast.SetAlign(const Value: TTextAlign);
113begin
114FAlign := Value;
115end;
116
117procedure TFMXToast.SetBackColor(const Value: TAlphaColor);
118begin
119FBackColor := Value;
120end;
121
122procedure TFMXToast.SetDelay(const Value: Single);
123begin
124FDelay := Value;
125end;
126
127procedure TFMXToast.SetFontColor(const Value: TAlphaColor);
128begin
129FFontColor := Value;
130end;
131
132procedure TFMXToast.SetFontSize(const Value: Single);
133begin
134FFontSize := Value;
135end;
136
137procedure TFMXToast.SetIsBlock(const Value: Boolean);
138begin
139FIsBlock := Value;
140end;
141
142procedure TFMXToast.SetToastMessage(const Value: string);
143begin
144FToastMessage := Value;
145end;
146
147procedure TFMXToast.Show(AOwner: TFmxObject);
148var
149R: TRectF;
150begin
151if FIsShowing then
152begin
153FToastContainer.DisposeOf;
154end;
155FIsShowing := True;
156CreateContainer;
157AOwner.AddObject(FToastContainer);
158R := RectF(0, 0, 10000, 10000);
159FToastText.Canvas.Font.Size := FFontSize;
160FToastText.Canvas.MeasureText(R, FToastMessage, False, [], TTextAlign.Leading, TTextAlign.Leading);
161FToastRect.Height := R.Height * 1.8;
162FToastRect.Width := R.Width + FToastContainer.Width - 48;
163
164case FAlign of
165TTextAlign.Leading:
166begin
167FToastRect.Align := TAlignLayout.Top;
168FToastRect.Margins.Top := 24;
169end;
170TTextAlign.Trailing:
171begin
172FToastRect.Align := TAlignLayout.Bottom;
173FToastRect.Margins.Bottom := 24;
174end;
175TTextAlign.Center:
176FToastRect.Align := TAlignLayout.VertCenter;
177end;
178FToastRect.Fill.Color := FBackColor;
179FToastRect.XRadius := FToastRect.Height * 0.15;
180FToastRect.YRadius := FToastRect.XRadius;
181
182FToastText.Color := FontColor;
183FToastText.Text := FToastMessage;
184FToastText.TextSettings.Font.Size := FontSize;
185
186FToastContainer.Opacity := 0;
187TAnimator.AnimateFloat(FToastContainer, 'Opacity', 1);
188
189FToastAnimation.Delay := FDelay;
190FToastAnimation.StartValue := 1;
191FToastAnimation.StopValue := 0;
192FToastAnimation.Start;
193end;
194
195procedure TFMXToast.CreateContainer;
196begin
197FToastContainer := TLayout.Create(nil);
198FToastContainer.Align := TAlignLayout.Contents;
199FToastContainer.HitTest := FIsBlock;
200
201FToastRect := TRectangle.Create(FToastContainer);
202FToastRect.Stroke.Kind := TBrushKind.None;
203FToastRect.Margins.Left := 24;
204FToastRect.Margins.Right := 24;
205FToastRect.Parent := FToastContainer;
206FToastRect.CornerType := TCornerType.Round;
207FToastRect.Fill.Color := BackColor;
208FToastRect.XRadius := 16;
209FToastRect.YRadius := FToastRect.XRadius;
210
211FToastText := TText.Create(FToastContainer);
212FToastText.HitTest := False;
213FToastText.Align := TAlignLayout.Client;
214FToastText.TextSettings.WordWrap := False;
215FToastText.Parent := FToastRect;
216
217FToastAnimation := TFloatAnimation.Create(FToastContainer);
218FToastAnimation.Parent := FToastContainer;
219FToastAnimation.Duration := 0.2;
220FToastAnimation.PropertyName := 'Opacity';
221FToastAnimation.StartValue := 1.0;
222FToastAnimation.StopValue := 0.0;
223FToastAnimation.OnFinish := OnAnimationFinish;
224end;
225
226end.
227