BaiduFMX

Форк
0
/
FMX.Toast.pas 
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

17
unit FMX.Toast;
18

19
interface
20

21
uses
22
  System.Classes,
23
  System.Types,
24
  System.UITypes,
25
  FMX.Types,
26
  FMX.Layouts,
27
  FMX.Objects,
28
  FMX.Graphics,
29
  FMX.Ani,
30
  FMX.ComponentsCommon;
31

32
type
33

34
  [ComponentPlatformsAttribute(TFMXPlatforms)]
35
  TFMXToast = class(TComponent)
36
  private
37
    FToastContainer: TLayout;
38
    FToastText: TText;
39
    FToastRect: TRectangle;
40
    FToastAnimation: TFloatAnimation;
41

42
    FToastMessage: string;
43
    FFontColor: TAlphaColor;
44
    FBackColor: TAlphaColor;
45
    FFontSize: Single;
46
    FDelay: Single;
47
    FIsBlock: Boolean;
48
    FIsShowIng: Boolean;
49
    FAlign: TTextAlign;
50
    procedure SetToastMessage(const Value: string);
51
    procedure SetFontColor(const Value: TAlphaColor);
52
    procedure SetBackColor(const Value: TAlphaColor);
53
    procedure SetFontSize(const Value: Single);
54
    procedure CreateContainer;
55
    procedure OnAnimationFinish(Sender: TObject);
56
    procedure SetDelay(const Value: Single);
57
    procedure SetIsBlock(const Value: Boolean);
58
    procedure SetAlign(const Value: TTextAlign);
59
  public
60
    constructor Create(AOwner: TComponent); override;
61
    destructor Destroy; override;
62
    procedure Show(AOwner: TFmxObject);
63
    procedure Close;
64
    property IsShowing: Boolean read FIsShowing;
65
  published
66
    property Align: TTextAlign read FAlign write SetAlign default TTextAlign.Trailing;
67
    property FontSize: Single read FFontSize write SetFontSize;
68
    property FontColor: TAlphaColor read FFontColor write SetFontColor default TAlphaColors.White;
69
    property BackColor: TAlphaColor read FBackColor write SetBackColor default TAlphaColors.Gray;
70
    property ToastMessage: string read FToastMessage write SetToastMessage;
71
    property Delay: Single read FDelay write SetDelay;
72
    property IsBlock: Boolean read FIsBlock write SetIsBlock default False;
73
  end;
74

75
implementation
76

77
{ TFMXToast }
78

79
procedure TFMXToast.Close;
80
begin
81
  if FIsShowing then
82
  begin
83
    FToastAnimation.Stop;
84
  end;
85
end;
86

87
constructor TFMXToast.Create(AOwner: TComponent);
88
begin
89
  inherited;
90
  FToastContainer := nil;
91
  FFontSize := 16;
92
  FFontColor := TAlphaColors.White;
93
  FBackColor := TAlphaColors.Gray;
94
  FDelay := 2.0;
95
  FToastMessage := 'Toast';
96
  FIsBlock := False;
97
  FIsShowing := False;
98
  FAlign := TTextAlign.Trailing;
99
end;
100

101
destructor TFMXToast.Destroy;
102
begin
103
  inherited;
104
end;
105

106
procedure TFMXToast.OnAnimationFinish(Sender: TObject);
107
begin
108
  FToastContainer.DisposeOf;
109
  FIsShowing := False;
110
end;
111

112
procedure TFMXToast.SetAlign(const Value: TTextAlign);
113
begin
114
  FAlign := Value;
115
end;
116

117
procedure TFMXToast.SetBackColor(const Value: TAlphaColor);
118
begin
119
  FBackColor := Value;
120
end;
121

122
procedure TFMXToast.SetDelay(const Value: Single);
123
begin
124
  FDelay := Value;
125
end;
126

127
procedure TFMXToast.SetFontColor(const Value: TAlphaColor);
128
begin
129
  FFontColor := Value;
130
end;
131

132
procedure TFMXToast.SetFontSize(const Value: Single);
133
begin
134
  FFontSize := Value;
135
end;
136

137
procedure TFMXToast.SetIsBlock(const Value: Boolean);
138
begin
139
  FIsBlock := Value;
140
end;
141

142
procedure TFMXToast.SetToastMessage(const Value: string);
143
begin
144
  FToastMessage := Value;
145
end;
146

147
procedure TFMXToast.Show(AOwner: TFmxObject);
148
var
149
  R: TRectF;
150
begin
151
  if FIsShowing then
152
  begin
153
    FToastContainer.DisposeOf;
154
  end;
155
  FIsShowing := True;
156
  CreateContainer;
157
  AOwner.AddObject(FToastContainer);
158
  R := RectF(0, 0, 10000, 10000);
159
  FToastText.Canvas.Font.Size := FFontSize;
160
  FToastText.Canvas.MeasureText(R, FToastMessage, False, [], TTextAlign.Leading, TTextAlign.Leading);
161
  FToastRect.Height := R.Height * 1.8;
162
  FToastRect.Width := R.Width + FToastContainer.Width - 48;
163

164
  case FAlign of
165
    TTextAlign.Leading:
166
    begin
167
      FToastRect.Align := TAlignLayout.Top;
168
      FToastRect.Margins.Top := 24;
169
    end;
170
    TTextAlign.Trailing:
171
    begin
172
      FToastRect.Align := TAlignLayout.Bottom;
173
      FToastRect.Margins.Bottom := 24;
174
    end;
175
    TTextAlign.Center:
176
      FToastRect.Align := TAlignLayout.VertCenter;
177
  end;
178
  FToastRect.Fill.Color := FBackColor;
179
  FToastRect.XRadius := FToastRect.Height * 0.15;
180
  FToastRect.YRadius := FToastRect.XRadius;
181

182
  FToastText.Color := FontColor;
183
  FToastText.Text := FToastMessage;
184
  FToastText.TextSettings.Font.Size := FontSize;
185

186
  FToastContainer.Opacity := 0;
187
  TAnimator.AnimateFloat(FToastContainer, 'Opacity', 1);
188

189
  FToastAnimation.Delay := FDelay;
190
  FToastAnimation.StartValue := 1;
191
  FToastAnimation.StopValue := 0;
192
  FToastAnimation.Start;
193
end;
194

195
procedure TFMXToast.CreateContainer;
196
begin
197
  FToastContainer := TLayout.Create(nil);
198
  FToastContainer.Align := TAlignLayout.Contents;
199
  FToastContainer.HitTest := FIsBlock;
200

201
  FToastRect := TRectangle.Create(FToastContainer);
202
  FToastRect.Stroke.Kind := TBrushKind.None;
203
  FToastRect.Margins.Left := 24;
204
  FToastRect.Margins.Right := 24;
205
  FToastRect.Parent := FToastContainer;
206
  FToastRect.CornerType := TCornerType.Round;
207
  FToastRect.Fill.Color := BackColor;
208
  FToastRect.XRadius := 16;
209
  FToastRect.YRadius := FToastRect.XRadius;
210

211
  FToastText := TText.Create(FToastContainer);
212
  FToastText.HitTest := False;
213
  FToastText.Align := TAlignLayout.Client;
214
  FToastText.TextSettings.WordWrap := False;
215
  FToastText.Parent := FToastRect;
216

217
  FToastAnimation := TFloatAnimation.Create(FToastContainer);
218
  FToastAnimation.Parent := FToastContainer;
219
  FToastAnimation.Duration := 0.2;
220
  FToastAnimation.PropertyName := 'Opacity';
221
  FToastAnimation.StartValue := 1.0;
222
  FToastAnimation.StopValue := 0.0;
223
  FToastAnimation.OnFinish := OnAnimationFinish;
224
end;
225

226
end.
227

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.