├── Library ├── RX10Berlin │ ├── pkgZMaterial.res │ ├── pkgZMaterial.dpk │ └── pkgZMaterial.dproj ├── NativeDraw.inc ├── FMX.ZMaterialTypes.pas ├── RX10Godzilla │ ├── pkgZMaterial.dpk │ └── pkgZMaterial.dproj ├── RX10Seattle │ ├── pkgZMaterial.dpk │ └── pkgZMaterial.dproj ├── FMX.ZMaterialActionButton.pas ├── FMX.ZMaterialBackButton.pas ├── FMX.ZNativeDrawFigure.pas └── FMX.ZMaterialEdit.pas ├── Demo ├── MaterialEdit │ ├── prjMaterialEdit.res │ ├── prjMaterialEdit.dpr │ ├── uMain.pas │ ├── uMain.fmx │ └── prjMaterialEdit.deployproj ├── MaterialBackButton │ ├── prjMaterialBackButton.res │ ├── prjMaterialBackButton.dpr │ ├── uMain.pas │ └── uMain.fmx └── MaterialActionButton │ ├── prjMaterialActionButton.res │ ├── prjMaterialActionButton.dpr │ ├── uMain.pas │ ├── uMain.fmx │ └── prjMaterialActionButton.deployproj ├── README.md ├── _clean.bat └── .gitignore /Library/RX10Berlin/pkgZMaterial.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rzaripov1990/ZMaterialComponents/HEAD/Library/RX10Berlin/pkgZMaterial.res -------------------------------------------------------------------------------- /Demo/MaterialEdit/prjMaterialEdit.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rzaripov1990/ZMaterialComponents/HEAD/Demo/MaterialEdit/prjMaterialEdit.res -------------------------------------------------------------------------------- /Demo/MaterialBackButton/prjMaterialBackButton.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rzaripov1990/ZMaterialComponents/HEAD/Demo/MaterialBackButton/prjMaterialBackButton.res -------------------------------------------------------------------------------- /Demo/MaterialActionButton/prjMaterialActionButton.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rzaripov1990/ZMaterialComponents/HEAD/Demo/MaterialActionButton/prjMaterialActionButton.res -------------------------------------------------------------------------------- /Library/NativeDraw.inc: -------------------------------------------------------------------------------- 1 | {$SCOPEDENUMS ON} 2 | 3 | {$IFDEF MACOS} 4 | {$IFNDEF IOS} 5 | {$DEFINE MACOSONLY} 6 | {$ENDIF} 7 | {$ENDIF} 8 | 9 | {$DEFINE UseNativeDraw} // 使用原生绘图 10 | 11 | -------------------------------------------------------------------------------- /Demo/MaterialEdit/prjMaterialEdit.dpr: -------------------------------------------------------------------------------- 1 | program prjMaterialEdit; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | uMain in 'uMain.pas' {Form1}; 7 | 8 | {$R *.res} 9 | 10 | begin 11 | Application.Initialize; 12 | Application.CreateForm(TForm1, Form1); 13 | Application.Run; 14 | 15 | end. 16 | -------------------------------------------------------------------------------- /Demo/MaterialActionButton/prjMaterialActionButton.dpr: -------------------------------------------------------------------------------- 1 | program prjMaterialActionButton; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | uMain in 'uMain.pas' {Form1}; 7 | 8 | {$R *.res} 9 | 10 | begin 11 | Application.Initialize; 12 | Application.CreateForm(TForm1, Form1); 13 | Application.Run; 14 | end. 15 | -------------------------------------------------------------------------------- /Demo/MaterialBackButton/prjMaterialBackButton.dpr: -------------------------------------------------------------------------------- 1 | program prjMaterialBackButton; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | uMain in 'uMain.pas' {Form2}; 7 | 8 | {$R *.res} 9 | 10 | begin 11 | Application.Initialize; 12 | Application.CreateForm(TForm2, Form2); 13 | Application.Run; 14 | 15 | end. 16 | -------------------------------------------------------------------------------- /Library/FMX.ZMaterialTypes.pas: -------------------------------------------------------------------------------- 1 | unit FMX.ZMaterialTypes; 2 | 3 | { 4 | author: Ravil (ZuBy) Zaripov 5 | email: rzaripov1990@gmail.com 6 | http://github.com/rzaripov1990 7 | 8 | 2017 9 | } 10 | 11 | interface 12 | 13 | uses 14 | System.Classes; 15 | 16 | const 17 | cpaAllPlatforms = pidWin32 or pidWin64 or pidOSX32 or pidAndroid or pidiOSDevice32 or pidiOSDevice64 or 18 | pidiOSSimulator; 19 | 20 | implementation 21 | 22 | end. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ZMaterialComponents 2 | * TZMaterialEdit 3 | * TZMaterialBackButton (animation by sinuke https://github.com/sinuke) 4 | * TZMaterialActionButton 5 | * TZNativeDrawFigureLine 6 | * TZNativeDrawFigureRectangle 7 | * TZNativeDrawFigureRoundRect 8 | * TZNativeDrawFigureEllipse 9 | * TZNativeDrawFigureCircle 10 | * TZNativeDrawFigureArc 11 | 12 | # FMXNativeDraw 13 | ``` 14 | (c) 2017 by Aone 15 | QQ: 1467948783 16 | http://www.cnblogs.com/onechen 17 | https://github.com/OneChen/FMXNativeDraw 18 | ``` 19 | 20 | # PackageGenerator 21 | https://github.com/errorcalc/PackagesGenerator 22 | -------------------------------------------------------------------------------- /_clean.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | ECHO Cleaning... 3 | 4 | del /S %1*.str%2%3%4 5 | del /S %1*.rsm%2%3%4 6 | del /S %1*.lib%2%3%4 7 | del /S %1*.err%2%3%4 8 | del /S %1*.tds%2%3%4 9 | del /S %1*.hpp%2%3%4 10 | del /S %1*.obj%2%3%4 11 | del /S %1*.tds%2%3%4 12 | rem del /S %1*.map%2%3%4 13 | del /S %1*.drc%2%3%4 14 | del /S %1*.#*%2%3%4 15 | del /S %1*.csm%2%3%4 16 | del /S %1*.bpi%2%3%4 17 | del /S %1*.lib%2%3%4 18 | del /S %1*.ilc%2%3%4 19 | del /S %1*.ild%2%3%4 20 | del /S %1*.ilf%2%3%4 21 | del /S %1*.ils%2%3%4 22 | del /S %1*.cgi%2%3%4 23 | del /S %1*.drc%2%3%4 24 | del /S %1*.$*%2%3%4 25 | del /S %1*.dcu%2%3%4 26 | del /S %1*.bak%2%3%4 27 | del /S %1*.gid%2%3%4 28 | del /S %1*.fts%2%3%4 29 | del /S %1*.~*%2%3%4 30 | del /S %1*.dsk%2%3%4 31 | del /S %1*.ddp%2%3%4 32 | del /S %1*.bkm%2%3%4 33 | del /S %1*_orig_?.*%2%3%4 34 | del /S %1*.ressrc%2%3%4 35 | del /S %1*.cesettings%2%3%4 36 | del /S %1*.stat%2%3%4 37 | del /S %1*.identcache%2%3%4 38 | del /S %1*.local%2%3%4 39 | 40 | for /r . %%a in (__history\) do @if exist "%%a" rd /s /q "%%a" 41 | for /r . %%a in (__recovery\) do @if exist "%%a" rd /s /q "%%a" -------------------------------------------------------------------------------- /Library/RX10Berlin/pkgZMaterial.dpk: -------------------------------------------------------------------------------- 1 | package pkgZMaterial; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS ON} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION OFF} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO ON} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES ON} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE DEBUG} 27 | {$ENDIF IMPLICITBUILDING} 28 | {$DESCRIPTION 'author: ZuBy'} 29 | {$LIBSUFFIX '310'} 30 | {$IMPLICITBUILD ON} 31 | 32 | requires 33 | rtl, 34 | fmx; 35 | 36 | contains 37 | FMX.Graphics.Native in '..\FMX.Graphics.Native.pas', 38 | FMX.ZMaterialActionButton in '..\FMX.ZMaterialActionButton.pas', 39 | FMX.ZMaterialBackButton in '..\FMX.ZMaterialBackButton.pas', 40 | FMX.ZMaterialEdit in '..\FMX.ZMaterialEdit.pas', 41 | FMX.ZMaterialTypes in '..\FMX.ZMaterialTypes.pas', 42 | FMX.ZNativeDrawFigure in '..\FMX.ZNativeDrawFigure.pas'; 43 | 44 | end. 45 | -------------------------------------------------------------------------------- /Library/RX10Godzilla/pkgZMaterial.dpk: -------------------------------------------------------------------------------- 1 | package pkgZMaterial; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS ON} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION OFF} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO ON} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES ON} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE DEBUG} 27 | {$ENDIF IMPLICITBUILDING} 28 | {$DESCRIPTION 'author: ZuBy'} 29 | {$LIBSUFFIX '320'} 30 | {$IMPLICITBUILD ON} 31 | 32 | requires 33 | rtl, 34 | fmx; 35 | 36 | contains 37 | FMX.Graphics.Native in '..\FMX.Graphics.Native.pas', 38 | FMX.ZMaterialActionButton in '..\FMX.ZMaterialActionButton.pas', 39 | FMX.ZMaterialBackButton in '..\FMX.ZMaterialBackButton.pas', 40 | FMX.ZMaterialEdit in '..\FMX.ZMaterialEdit.pas', 41 | FMX.ZMaterialTypes in '..\FMX.ZMaterialTypes.pas', 42 | FMX.ZNativeDrawFigure in '..\FMX.ZNativeDrawFigure.pas'; 43 | 44 | end. 45 | -------------------------------------------------------------------------------- /Library/RX10Seattle/pkgZMaterial.dpk: -------------------------------------------------------------------------------- 1 | package pkgZMaterial; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS ON} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION OFF} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO ON} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES ON} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE DEBUG} 27 | {$ENDIF IMPLICITBUILDING} 28 | {$DESCRIPTION 'author: ZuBy'} 29 | {$LIBSUFFIX '300'} 30 | {$IMPLICITBUILD ON} 31 | 32 | requires 33 | rtl, 34 | fmx; 35 | 36 | contains 37 | FMX.Graphics.Native in '..\FMX.Graphics.Native.pas', 38 | FMX.ZMaterialActionButton in '..\FMX.ZMaterialActionButton.pas', 39 | FMX.ZMaterialBackButton in '..\FMX.ZMaterialBackButton.pas', 40 | FMX.ZMaterialEdit in '..\FMX.ZMaterialEdit.pas', 41 | FMX.ZMaterialTypes in '..\FMX.ZMaterialTypes.pas', 42 | FMX.ZNativeDrawFigure in '..\FMX.ZNativeDrawFigure.pas'; 43 | 44 | end. 45 | -------------------------------------------------------------------------------- /Demo/MaterialEdit/uMain.pas: -------------------------------------------------------------------------------- 1 | unit uMain; 2 | 3 | { 4 | author: ZuBy 5 | 6 | https://github.com/rzaripov1990 7 | http://blog.rzaripov.kz 8 | 9 | 2017 10 | } 11 | 12 | interface 13 | 14 | uses 15 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 16 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts, FMX.ZMaterialEdit, FMX.StdCtrls, 17 | FMX.Controls.Presentation; 18 | 19 | type 20 | TForm1 = class(TForm) 21 | Button1: TButton; 22 | Button2: TButton; 23 | ToolBar1: TToolBar; 24 | Label1: TLabel; 25 | zmeEmail: TZMaterialEdit; 26 | zmePassword: TZMaterialEdit; 27 | zmeLogin: TZMaterialEdit; 28 | procedure Button1Click(Sender: TObject); 29 | procedure Button2Click(Sender: TObject); 30 | private 31 | { Private declarations } 32 | public 33 | { Public declarations } 34 | end; 35 | 36 | var 37 | Form1: TForm1; 38 | 39 | implementation 40 | 41 | {$R *.fmx} 42 | 43 | procedure TForm1.Button1Click(Sender: TObject); 44 | begin 45 | zmeEmail.Text := 'rzaripov1990@gmail.com'; 46 | zmeLogin.Text := 'ZuBy'; 47 | zmePassword.Text := '123456789!@'; 48 | end; 49 | 50 | procedure TForm1.Button2Click(Sender: TObject); 51 | begin 52 | zmeEmail.Text := ''; 53 | zmeLogin.Text := ''; 54 | zmePassword.Text := ''; 55 | end; 56 | 57 | end. 58 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | -------------------------------------------------------------------------------- /Demo/MaterialBackButton/uMain.pas: -------------------------------------------------------------------------------- 1 | unit uMain; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, 8 | FMX.StdCtrls, FMX.Layouts, FMX.Effects, FMX.Objects, 9 | FMX.ZMaterialBackButton; 10 | 11 | type 12 | TForm2 = class(TForm) 13 | Rectangle1: TRectangle; 14 | ShadowEffect1: TShadowEffect; 15 | zmbKind: TZMaterialBackButton; 16 | zmbBack: TZMaterialBackButton; 17 | zmbClose: TZMaterialBackButton; 18 | sbMenu: TSpeedButton; 19 | sbBack: TSpeedButton; 20 | sbClose: TSpeedButton; 21 | procedure zmbBackClick(Sender: TObject); 22 | procedure zmbCloseClick(Sender: TObject); 23 | procedure zmbKindClick(Sender: TObject); 24 | private 25 | { Private declarations } 26 | public 27 | { Public declarations } 28 | end; 29 | 30 | var 31 | Form2: TForm2; 32 | 33 | implementation 34 | 35 | {$R *.fmx} 36 | 37 | procedure TForm2.zmbBackClick(Sender: TObject); 38 | begin 39 | if zmbBack.Tag = 0 then 40 | zmbBack.Animate(TZMaterialBackButtonAnimationType.BackToMenu) 41 | else 42 | zmbBack.Animate(TZMaterialBackButtonAnimationType.MenuToBack); 43 | zmbBack.Tag := zmbBack.Tag xor 1; 44 | end; 45 | 46 | procedure TForm2.zmbCloseClick(Sender: TObject); 47 | begin 48 | if zmbClose.Tag = 0 then 49 | zmbClose.Animate(TZMaterialBackButtonAnimationType.CloseToMenu) 50 | else 51 | zmbClose.Animate(TZMaterialBackButtonAnimationType.MenuToClose); 52 | zmbClose.Tag := zmbClose.Tag xor 1; 53 | end; 54 | 55 | procedure TForm2.zmbKindClick(Sender: TObject); 56 | begin 57 | case zmbKind.Kind of 58 | TZMaterialBackButtonKind.Menu: 59 | zmbKind.Kind := TZMaterialBackButtonKind.Back; 60 | TZMaterialBackButtonKind.Back: 61 | zmbKind.Kind := TZMaterialBackButtonKind.Close; 62 | TZMaterialBackButtonKind.Close: 63 | zmbKind.Kind := TZMaterialBackButtonKind.Menu; 64 | end; 65 | end; 66 | 67 | end. 68 | -------------------------------------------------------------------------------- /Demo/MaterialBackButton/uMain.fmx: -------------------------------------------------------------------------------- 1 | object Form2: TForm2 2 | Left = 0 3 | Top = 0 4 | Caption = 'Back Button Transformations Demo' 5 | ClientHeight = 296 6 | ClientWidth = 253 7 | Fill.Kind = Solid 8 | Position = DesktopCenter 9 | FormFactor.Width = 320 10 | FormFactor.Height = 480 11 | FormFactor.Devices = [Desktop] 12 | DesignerMasterStyle = 0 13 | object Rectangle1: TRectangle 14 | Align = Top 15 | Fill.Color = xFF5174E3 16 | Locked = True 17 | HitTest = False 18 | Size.Width = 253.000000000000000000 19 | Size.Height = 56.000000000000000000 20 | Size.PlatformDefault = False 21 | Stroke.Kind = None 22 | object ShadowEffect1: TShadowEffect 23 | Distance = 1.000000000000000000 24 | Direction = 90.000000000000000000 25 | Softness = 0.200000002980232200 26 | Opacity = 0.300000011920929000 27 | ShadowColor = claBlack 28 | end 29 | object sbMenu: TSpeedButton 30 | Align = Left 31 | Size.Width = 57.000000000000000000 32 | Size.Height = 56.000000000000000000 33 | Size.PlatformDefault = False 34 | OnClick = zmbKindClick 35 | object zmbKind: TZMaterialBackButton 36 | Align = Left 37 | Locked = True 38 | Size.Width = 57.000000000000000000 39 | Size.Height = 56.000000000000000000 40 | Size.PlatformDefault = False 41 | TabOrder = 1 42 | end 43 | end 44 | object sbBack: TSpeedButton 45 | Align = Left 46 | Position.X = 57.000000000000000000 47 | Size.Width = 57.000000000000000000 48 | Size.Height = 56.000000000000000000 49 | Size.PlatformDefault = False 50 | OnClick = zmbBackClick 51 | object zmbBack: TZMaterialBackButton 52 | Align = Left 53 | Locked = True 54 | Size.Width = 57.000000000000000000 55 | Size.Height = 56.000000000000000000 56 | Size.PlatformDefault = False 57 | TabOrder = 1 58 | Kind = Back 59 | end 60 | end 61 | object sbClose: TSpeedButton 62 | Align = Left 63 | Position.X = 114.000000000000000000 64 | Size.Width = 57.000000000000000000 65 | Size.Height = 56.000000000000000000 66 | Size.PlatformDefault = False 67 | OnClick = zmbCloseClick 68 | object zmbClose: TZMaterialBackButton 69 | Align = Left 70 | Locked = True 71 | Size.Width = 57.000000000000000000 72 | Size.Height = 56.000000000000000000 73 | Size.PlatformDefault = False 74 | TabOrder = 1 75 | Kind = Close 76 | end 77 | end 78 | end 79 | end 80 | -------------------------------------------------------------------------------- /Demo/MaterialActionButton/uMain.pas: -------------------------------------------------------------------------------- 1 | unit uMain; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts, FMX.ZMaterialActionButton, 8 | FMX.Effects, FMX.ZNativeDrawFigure, FMX.Objects; 9 | 10 | type 11 | TForm1 = class(TForm) 12 | ZNativeDrawFigureLine1: TZNativeDrawFigureLine; 13 | ZNativeDrawFigureRectangle1: TZNativeDrawFigureRectangle; 14 | ZNativeDrawFigureRoundRect1: TZNativeDrawFigureRoundRect; 15 | ZNativeDrawFigureEllipse1: TZNativeDrawFigureEllipse; 16 | ZNativeDrawFigureCircle1: TZNativeDrawFigureCircle; 17 | ZNativeDrawFigureArc1: TZNativeDrawFigureArc; 18 | ZMaterialActionButton1: TZMaterialActionButton; 19 | Text1: TText; 20 | Timer1: TTimer; 21 | Circle1: TCircle; 22 | Text2: TText; 23 | procedure ZMaterialActionButton1Click(Sender: TObject); 24 | procedure FormResize(Sender: TObject); 25 | procedure Timer1Timer(Sender: TObject); 26 | procedure ZMaterialBackButton1Click(Sender: TObject); 27 | procedure ZMaterialBackButton2Click(Sender: TObject); 28 | private 29 | { Private declarations } 30 | public 31 | { Public declarations } 32 | end; 33 | 34 | var 35 | Form1: TForm1; 36 | 37 | implementation 38 | 39 | {$R *.fmx} 40 | 41 | procedure TForm1.FormResize(Sender: TObject); 42 | begin 43 | ZMaterialActionButton1.Position.X := ClientWidth - 16 - ZMaterialActionButton1.Width; 44 | ZMaterialActionButton1.Position.Y := ClientHeight - 16 - ZMaterialActionButton1.Height; 45 | end; 46 | 47 | procedure TForm1.Timer1Timer(Sender: TObject); 48 | begin 49 | if ZNativeDrawFigureArc1.EndAngle >= 350 then 50 | ZNativeDrawFigureArc1.EndAngle := 0; 51 | 52 | ZNativeDrawFigureArc1.EndAngle := ZNativeDrawFigureArc1.EndAngle + 10; 53 | end; 54 | 55 | procedure TForm1.ZMaterialActionButton1Click(Sender: TObject); 56 | begin 57 | ShowMessage('Floating Action Button Clicked'); 58 | end; 59 | 60 | procedure TForm1.ZMaterialBackButton1Click(Sender: TObject); 61 | begin 62 | if ZMaterialBackButton1.Tag = 0 then 63 | ZMaterialBackButton1.Animate(TZMaterialBackButtonAnimationType.MenuToBack) 64 | else 65 | ZMaterialBackButton1.Animate(TZMaterialBackButtonAnimationType.BackToMenu); 66 | ZMaterialBackButton1.Tag := ZMaterialBackButton1.Tag xor 1; 67 | end; 68 | 69 | procedure TForm1.ZMaterialBackButton2Click(Sender: TObject); 70 | begin 71 | if ZMaterialBackButton2.Tag = 0 then 72 | ZMaterialBackButton2.Animate(TZMaterialBackButtonAnimationType.CloseToMenu) 73 | else 74 | ZMaterialBackButton2.Animate(TZMaterialBackButtonAnimationType.MenuToClose); 75 | ZMaterialBackButton2.Tag := ZMaterialBackButton2.Tag xor 1; 76 | end; 77 | 78 | end. 79 | -------------------------------------------------------------------------------- /Library/FMX.ZMaterialActionButton.pas: -------------------------------------------------------------------------------- 1 | unit FMX.ZMaterialActionButton; 2 | 3 | { 4 | author: Ravil (ZuBy) Zaripov 5 | email: rzaripov1990@gmail.com 6 | http://github.com/rzaripov1990 7 | 8 | 2017 9 | } 10 | 11 | interface 12 | 13 | uses 14 | System.SysUtils, System.Classes, System.UITypes, 15 | FMX.Types, FMX.Controls, FMX.Layouts, FMX.Effects, 16 | FMX.ZMaterialTypes, FMX.ZNativeDrawFigure; 17 | 18 | type 19 | 20 | [ComponentPlatformsAttribute(cpaAllPlatforms)] 21 | TZMaterialActionButton = class(TZNativeDrawFigureTemplateWithEvents) 22 | private 23 | { Private declarations } 24 | FColor: TAlphaColor; 25 | FShadow: TShadowEffect; 26 | 27 | procedure SetColor(const Value: TAlphaColor); 28 | function GetShadow: Boolean; 29 | procedure SetShadow(const Value: Boolean); 30 | function GetShadowDistance: Single; 31 | procedure SetShadowDistance(const Value: Single); 32 | function GetShadowSoftness: Single; 33 | procedure SetShadowSoftness(const Value: Single); 34 | function GetShadowOpacity: Single; 35 | procedure SetShadowOpacity(const Value: Single); 36 | protected 37 | { Protected declarations } 38 | public 39 | { Public declarations } 40 | constructor Create(AOwner: TComponent); override; 41 | destructor Destroy; override; 42 | published 43 | { Published declarations } 44 | property Color: TAlphaColor read FColor write SetColor; 45 | property Shadow: Boolean read GetShadow write SetShadow default true; 46 | property ShadowDistance: Single read GetShadowDistance write SetShadowDistance; 47 | property ShadowSoftness: Single read GetShadowSoftness write SetShadowSoftness; 48 | property ShadowOpacity: Single read GetShadowOpacity write SetShadowOpacity; 49 | end; 50 | 51 | procedure Register; 52 | 53 | implementation 54 | 55 | uses 56 | FMX.Graphics, FMX.Platform; 57 | 58 | procedure Register; 59 | begin 60 | RegisterComponents('ZMaterial', [TZMaterialActionButton]); 61 | end; 62 | 63 | { TZMaterialActionButton } 64 | 65 | constructor TZMaterialActionButton.Create(AOwner: TComponent); 66 | var 67 | IScreen: IFMXScreenService; 68 | begin 69 | inherited Create(AOwner); 70 | 71 | FShadow := TShadowEffect.Create(Self); 72 | FShadow.Parent := Self; 73 | FShadow.Stored := false; 74 | FShadow.Direction := 90; 75 | FShadow.Softness := 0.9; 76 | FShadow.Distance := 2; 77 | FShadow.Opacity := 0.4; 78 | 79 | if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IScreen) then 80 | FShadow.Distance := IScreen.GetScreenScale; 81 | 82 | Kind := TZNativeDrawFigureKind.Circle; 83 | FColor := $FFE91E63; 84 | Fill.Color := FColor; 85 | Stroke.Kind := TBrushKind.None; 86 | 87 | SetSize(56, 56); 88 | end; 89 | 90 | destructor TZMaterialActionButton.Destroy; 91 | begin 92 | FShadow.Parent := nil; 93 | FShadow.Free; 94 | 95 | inherited; 96 | end; 97 | 98 | function TZMaterialActionButton.GetShadow: Boolean; 99 | begin 100 | Result := FShadow.Enabled; 101 | end; 102 | 103 | function TZMaterialActionButton.GetShadowDistance: Single; 104 | begin 105 | Result := FShadow.Distance; 106 | end; 107 | 108 | function TZMaterialActionButton.GetShadowOpacity: Single; 109 | begin 110 | Result := FShadow.Opacity; 111 | end; 112 | 113 | function TZMaterialActionButton.GetShadowSoftness: Single; 114 | begin 115 | Result := FShadow.Softness; 116 | end; 117 | 118 | procedure TZMaterialActionButton.SetColor(const Value: TAlphaColor); 119 | begin 120 | if FColor = Value then 121 | Exit; 122 | 123 | FColor := Value; 124 | Fill.Color := FColor; 125 | end; 126 | 127 | procedure TZMaterialActionButton.SetShadow(const Value: Boolean); 128 | begin 129 | FShadow.Enabled := Value; 130 | end; 131 | 132 | procedure TZMaterialActionButton.SetShadowDistance(const Value: Single); 133 | begin 134 | FShadow.Distance := Value; 135 | end; 136 | 137 | procedure TZMaterialActionButton.SetShadowOpacity(const Value: Single); 138 | begin 139 | FShadow.Opacity := Value; 140 | end; 141 | 142 | procedure TZMaterialActionButton.SetShadowSoftness(const Value: Single); 143 | begin 144 | FShadow.Softness := Value; 145 | end; 146 | 147 | end. 148 | -------------------------------------------------------------------------------- /Demo/MaterialEdit/uMain.fmx: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 0 3 | Top = 0 4 | Caption = 'Form1' 5 | ClientHeight = 380 6 | ClientWidth = 249 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | DesignerMasterStyle = 0 11 | object Button1: TButton 12 | Anchors = [akLeft, akBottom] 13 | Position.X = 8.000000000000000000 14 | Position.Y = 326.000000000000000000 15 | Size.Width = 113.000000000000000000 16 | Size.Height = 44.000000000000000000 17 | Size.PlatformDefault = False 18 | TabOrder = 0 19 | Text = #1047#1072#1087#1086#1083#1085#1080#1090#1100 20 | OnClick = Button1Click 21 | end 22 | object Button2: TButton 23 | Anchors = [akLeft, akBottom] 24 | Position.X = 128.000000000000000000 25 | Position.Y = 326.000000000000000000 26 | Size.Width = 113.000000000000000000 27 | Size.Height = 44.000000000000000000 28 | Size.PlatformDefault = False 29 | TabOrder = 1 30 | Text = #1054#1095#1080#1089#1090#1080#1090#1100 31 | OnClick = Button2Click 32 | end 33 | object ToolBar1: TToolBar 34 | Size.Width = 249.000000000000000000 35 | Size.Height = 48.000000000000000000 36 | Size.PlatformDefault = False 37 | TabOrder = 2 38 | object Label1: TLabel 39 | Align = Client 40 | StyledSettings = [Family, Style, FontColor] 41 | Size.Width = 249.000000000000000000 42 | Size.Height = 48.000000000000000000 43 | Size.PlatformDefault = False 44 | TextSettings.Font.Size = 20.000000000000000000 45 | TextSettings.HorzAlign = Center 46 | Text = 'TZMaterialEdit' 47 | end 48 | end 49 | object zmeEmail: TZMaterialEdit 50 | Align = Top 51 | Margins.Left = 8.000000000000000000 52 | Margins.Top = 16.000000000000000000 53 | Margins.Right = 8.000000000000000000 54 | Position.X = 8.000000000000000000 55 | Position.Y = 64.000000000000000000 56 | Size.Width = 233.000000000000000000 57 | Size.Height = 38.000000000000000000 58 | Size.PlatformDefault = False 59 | TabOrder = 3 60 | Prompt = 'Email:' 61 | StyledSettings = [Family, Size, Style] 62 | TextSettingsPrompt.FontColor = claGreen 63 | TextSettingsPrompt.HorzAlign = Center 64 | TextSettingsPrompt.WordWrap = False 65 | StyledSettingsPrompt = [Family, Size, Style] 66 | TextSettingsPromptUp.FontColor = claBlue 67 | TextSettingsPromptUp.WordWrap = False 68 | StyledSettingsPromptUp = [Family] 69 | KeyboardType = EmailAddress 70 | ReturnKeyType = Next 71 | end 72 | object zmePassword: TZMaterialEdit 73 | Align = Top 74 | Margins.Left = 8.000000000000000000 75 | Margins.Top = 16.000000000000000000 76 | Margins.Right = 8.000000000000000000 77 | Position.X = 8.000000000000000000 78 | Position.Y = 172.000000000000000000 79 | Size.Width = 233.000000000000000000 80 | Size.Height = 38.000000000000000000 81 | Size.PlatformDefault = False 82 | TabOrder = 5 83 | Prompt = 'Password:' 84 | StyledSettings = [Family, Size, Style] 85 | TextSettingsPrompt.FontColor = claFirebrick 86 | TextSettingsPrompt.WordWrap = False 87 | StyledSettingsPrompt = [Family, Size, Style] 88 | TextSettingsPromptUp.FontColor = claFirebrick 89 | TextSettingsPromptUp.WordWrap = False 90 | StyledSettingsPromptUp = [Family] 91 | Password = True 92 | end 93 | object zmeLogin: TZMaterialEdit 94 | Align = Top 95 | Margins.Left = 8.000000000000000000 96 | Margins.Top = 16.000000000000000000 97 | Margins.Right = 8.000000000000000000 98 | Position.X = 8.000000000000000000 99 | Position.Y = 118.000000000000000000 100 | Size.Width = 233.000000000000000000 101 | Size.Height = 38.000000000000000000 102 | Size.PlatformDefault = False 103 | TabOrder = 4 104 | Prompt = 'Login:' 105 | TextSettings.HorzAlign = Center 106 | StyledSettings = [Family, Size, Style] 107 | TextSettingsPrompt.WordWrap = False 108 | StyledSettingsPrompt = [Family, Size, Style] 109 | TextSettingsPromptUp.FontColor = claMediumorchid 110 | TextSettingsPromptUp.WordWrap = False 111 | StyledSettingsPromptUp = [Family] 112 | Animation = False 113 | ReturnKeyType = Next 114 | end 115 | end 116 | -------------------------------------------------------------------------------- /Demo/MaterialActionButton/uMain.fmx: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 0 3 | Top = 0 4 | Caption = 'Form1' 5 | ClientHeight = 406 6 | ClientWidth = 280 7 | Fill.Color = claRoyalblue 8 | Fill.Kind = Solid 9 | FormFactor.Width = 320 10 | FormFactor.Height = 480 11 | FormFactor.Devices = [Desktop] 12 | OnResize = FormResize 13 | DesignerMasterStyle = 0 14 | object ZNativeDrawFigureLine1: TZNativeDrawFigureLine 15 | Align = Top 16 | Margins.Top = 55.000000000000000000 17 | Position.Y = 55.000000000000000000 18 | Size.Width = 280.000000000000000000 19 | Size.Height = 10.000000000000000000 20 | Size.PlatformDefault = False 21 | Stroke.Color = claDeeppink 22 | Stroke.Thickness = 5.000000000000000000 23 | end 24 | object ZNativeDrawFigureRectangle1: TZNativeDrawFigureRectangle 25 | Position.X = 16.000000000000000000 26 | Position.Y = 64.000000000000000000 27 | Size.Width = 97.000000000000000000 28 | Size.Height = 97.000000000000000000 29 | Size.PlatformDefault = False 30 | Fill.Kind = Gradient 31 | Fill.Gradient.Points = < 32 | item 33 | Color = xFFFFB900 34 | Offset = 0.000000000000000000 35 | end 36 | item 37 | Color = xFF07AFFB 38 | Offset = 1.000000000000000000 39 | end> 40 | Fill.Gradient.StartPosition.X = 0.500000000000000000 41 | Fill.Gradient.StartPosition.Y = 1.000000000000000000 42 | Fill.Gradient.StopPosition.X = 0.499999970197677600 43 | Fill.Gradient.StopPosition.Y = 0.000000000000000000 44 | Stroke.Color = claLime 45 | Stroke.Thickness = 3.500000000000000000 46 | end 47 | object ZNativeDrawFigureRoundRect1: TZNativeDrawFigureRoundRect 48 | Position.X = 128.000000000000000000 49 | Position.Y = 120.000000000000000000 50 | Size.Width = 129.000000000000000000 51 | Size.Height = 89.000000000000000000 52 | Size.PlatformDefault = False 53 | Fill.Color = claChartreuse 54 | Stroke.Color = claDarkorange 55 | Stroke.Thickness = 2.000000000000000000 56 | Corners = [TopRight, BottomLeft] 57 | CornerType = InnerRound 58 | end 59 | object ZNativeDrawFigureEllipse1: TZNativeDrawFigureEllipse 60 | Position.X = 42.000000000000000000 61 | Position.Y = 164.000000000000000000 62 | Size.Width = 129.000000000000000000 63 | Size.Height = 89.000000000000000000 64 | Size.PlatformDefault = False 65 | Fill.Color = claKhaki 66 | Stroke.Kind = None 67 | end 68 | object ZNativeDrawFigureCircle1: TZNativeDrawFigureCircle 69 | Position.X = 160.000000000000000000 70 | Position.Y = 256.000000000000000000 71 | Size.Width = 97.000000000000000000 72 | Size.Height = 97.000000000000000000 73 | Size.PlatformDefault = False 74 | Fill.Kind = Gradient 75 | Fill.Gradient.Points = < 76 | item 77 | Color = xFFFF0606 78 | Offset = 0.000000000000000000 79 | end 80 | item 81 | Color = xFFF6FF06 82 | Offset = 0.090062111616134640 83 | end 84 | item 85 | Color = xFF1DFF03 86 | Offset = 0.217391297221183800 87 | end 88 | item 89 | Color = xFF09FFDD 90 | Offset = 0.357142865657806400 91 | end 92 | item 93 | Color = xFF0800E8 94 | Offset = 0.509316742420196500 95 | end 96 | item 97 | Color = xFFFD02EC 98 | Offset = 0.652173936367034900 99 | end 100 | item 101 | Color = xFFF50202 102 | Offset = 0.819875776767730700 103 | end 104 | item 105 | Color = claWhite 106 | Offset = 1.000000000000000000 107 | end> 108 | Fill.Gradient.Style = Radial 109 | Stroke.Color = claDarkslateblue 110 | Stroke.Thickness = 3.000000000000000000 111 | end 112 | object ZNativeDrawFigureArc1: TZNativeDrawFigureArc 113 | Position.X = 80.000000000000000000 114 | Position.Y = 120.000000000000000000 115 | Size.Width = 81.000000000000000000 116 | Size.Height = 81.000000000000000000 117 | Size.PlatformDefault = False 118 | Fill.Kind = None 119 | Stroke.Color = xFFD32F2F 120 | Stroke.Thickness = 12.000000000000000000 121 | EndAngle = 310.000000000000000000 122 | end 123 | object ZMaterialActionButton1: TZMaterialActionButton 124 | Position.X = 200.000000000000000000 125 | Position.Y = 312.000000000000000000 126 | Size.Width = 56.000000000000000000 127 | Size.Height = 56.000000000000000000 128 | Size.PlatformDefault = False 129 | OnClick = ZMaterialActionButton1Click 130 | Color = xFFE91E63 131 | ShadowDistance = 2.000000000000000000 132 | ShadowSoftness = 0.899999976158142100 133 | ShadowOpacity = 0.400000005960464500 134 | object Text1: TText 135 | Align = Client 136 | HitTest = False 137 | Size.Width = 56.000000000000000000 138 | Size.Height = 56.000000000000000000 139 | Size.PlatformDefault = False 140 | Text = '+' 141 | TextSettings.Font.Size = 32.000000000000000000 142 | TextSettings.FontColor = claWhite 143 | end 144 | end 145 | object Timer1: TTimer 146 | Interval = 250 147 | OnTimer = Timer1Timer 148 | Left = 184 149 | Top = 176 150 | end 151 | object Circle1: TCircle 152 | Fill.Kind = Gradient 153 | Fill.Gradient.Points = < 154 | item 155 | Color = xFFFF03FF 156 | Offset = 0.000000000000000000 157 | end 158 | item 159 | Color = xFF13FA02 160 | Offset = 0.239130437374115000 161 | end 162 | item 163 | Color = xFFFFDD06 164 | Offset = 0.459627330303192100 165 | end 166 | item 167 | Color = xFFFC0303 168 | Offset = 0.708074510097503700 169 | end 170 | item 171 | Color = claWhite 172 | Offset = 1.000000000000000000 173 | end> 174 | Fill.Gradient.Style = Radial 175 | Position.X = 24.000000000000000000 176 | Position.Y = 320.000000000000000000 177 | Size.Width = 105.000000000000000000 178 | Size.Height = 106.000000000000000000 179 | Size.PlatformDefault = False 180 | object Text2: TText 181 | Align = Client 182 | HitTest = False 183 | Size.Width = 105.000000000000000000 184 | Size.Height = 106.000000000000000000 185 | Size.PlatformDefault = False 186 | Text = 'TCircle FMX' 187 | TextSettings.Font.Size = 22.000000000000000000 188 | TextSettings.FontColor = claWhite 189 | end 190 | end 191 | end 192 | -------------------------------------------------------------------------------- /Library/FMX.ZMaterialBackButton.pas: -------------------------------------------------------------------------------- 1 | unit FMX.ZMaterialBackButton; 2 | 3 | { 4 | author: Ravil (ZuBy) Zaripov 5 | email: rzaripov1990@gmail.com 6 | http://github.com/rzaripov1990 7 | 8 | 9 | animation by sinuke 10 | https://github.com/sinuke 11 | 2017 12 | } 13 | 14 | interface 15 | 16 | {$SCOPEDENUMS ON} 17 | 18 | uses 19 | System.SysUtils, System.Classes, System.UITypes, 20 | FMX.Types, FMX.Controls, FMX.Layouts, FMX.Objects, 21 | FMX.ZMaterialTypes; 22 | 23 | type 24 | TZMaterialBackButtonKind = (Menu, Back, Close); 25 | TZMaterialBackButtonAnimationType = (None, MenuToBack, BackToMenu, MenuToClose, CloseToMenu); 26 | 27 | [ComponentPlatformsAttribute(cpaAllPlatforms)] 28 | TZMaterialBackButton = class(TLayout) 29 | private 30 | FLayout: TLayout; 31 | FTopLine: TRectangle; 32 | FMiddleLine: TRectangle; 33 | FBottomLine: TRectangle; 34 | 35 | FKind: TZMaterialBackButtonKind; 36 | FAnimationType: TZMaterialBackButtonAnimationType; 37 | FColor: TAlphaColor; 38 | FTopLinePosY: Single; 39 | FMiddleLinePosY: Single; 40 | FBottomLinePosY: Single; 41 | 42 | { Private declarations } 43 | procedure RestoreToMenuKind; 44 | procedure StopAllAnimations; 45 | procedure SetKind(const Value: TZMaterialBackButtonKind); 46 | 47 | procedure DoAnimateMenuToBack; 48 | procedure DoAnimateBackToMenu; 49 | procedure DoAnimateMenuToClose; 50 | procedure DoAnimateCloseToMenu; 51 | procedure SetColor(const Value: TAlphaColor); 52 | protected 53 | { Protected declarations } 54 | public 55 | constructor Create(AOwner: TComponent); override; 56 | destructor Destroy; override; 57 | { Public declarations } 58 | 59 | procedure Animate(const aAnimationType: TZMaterialBackButtonAnimationType); 60 | published 61 | { Published declarations } 62 | property Visible; 63 | property Kind: TZMaterialBackButtonKind read FKind write SetKind default TZMaterialBackButtonKind.Menu; 64 | property Color: TAlphaColor read FColor write SetColor; 65 | end; 66 | 67 | procedure Register; 68 | 69 | implementation 70 | 71 | uses 72 | FMX.Graphics, System.Types, FMX.Ani; 73 | 74 | procedure Register; 75 | begin 76 | RegisterComponents('ZMaterial', [TZMaterialBackButton]); 77 | end; 78 | 79 | { TZMaterialBackButton } 80 | 81 | constructor TZMaterialBackButton.Create(AOwner: TComponent); 82 | begin 83 | inherited Create(AOwner); 84 | 85 | HitTest := true; 86 | 87 | FAnimationType := TZMaterialBackButtonAnimationType.None; 88 | FKind := TZMaterialBackButtonKind.Menu; 89 | FColor := TAlphaColorRec.White; 90 | 91 | FLayout := TLayout.Create(Self); 92 | FLayout.Parent := Self; 93 | FLayout.Stored := false; 94 | 95 | FTopLine := TRectangle.Create(FLayout); 96 | FTopLine.Parent := FLayout; 97 | FTopLine.Stored := false; 98 | 99 | FMiddleLine := TRectangle.Create(FLayout); 100 | FMiddleLine.Parent := FLayout; 101 | FMiddleLine.Stored := false; 102 | 103 | FBottomLine := TRectangle.Create(FLayout); 104 | FBottomLine.Parent := FLayout; 105 | FBottomLine.Stored := false; 106 | 107 | RestoreToMenuKind; 108 | end; 109 | 110 | destructor TZMaterialBackButton.Destroy; 111 | begin 112 | {$IFDEF AUTOREFCOUNT} 113 | FBottomLine.DisposeOf; 114 | FBottomLine := nil; 115 | FMiddleLine.DisposeOf; 116 | FMiddleLine := nil; 117 | FTopLine.DisposeOf; 118 | FTopLine := nil; 119 | FLayout.DisposeOf; 120 | FLayout := nil; 121 | {$ELSE} 122 | FreeAndNil(FBottomLine); 123 | FreeAndNil(FMiddleLine); 124 | FreeAndNil(FTopLine); 125 | FreeAndNil(FLayout); 126 | {$ENDIF} 127 | inherited Destroy; 128 | end; 129 | 130 | procedure TZMaterialBackButton.DoAnimateMenuToBack; 131 | begin 132 | FLayout.RotationAngle := 0; 133 | TAnimator.AnimateFloat(FLayout, 'RotationAngle', 180, 0.25); 134 | TAnimator.AnimateFloat(FTopLine, 'RotationAngle', 45, 0.25); 135 | TAnimator.AnimateFloat(FBottomLine, 'RotationAngle', -45, 0.25); 136 | TAnimator.AnimateFloat(FTopLine, 'Width', 12, 0.25); 137 | TAnimator.AnimateFloat(FBottomLine, 'Width', 12, 0.25); 138 | TAnimator.AnimateFloat(FMiddleLine, 'Width', 16 - FMiddleLine.Height / 4, 0.25); 139 | TAnimator.AnimateFloat(FMiddleLine, 'Position.X', 2, 0.25); 140 | TAnimator.AnimateFloat(FTopLine, 'Position.Y', FMiddleLine.Position.Y + FMiddleLine.Height / 4 - 12 * 0.5 * 141 | cos((45 * pi) / 180), 0.25); 142 | TAnimator.AnimateFloat(FBottomLine, 'Position.Y', FMiddleLine.Position.Y - FMiddleLine.Height / 4 + 12 * 0.5 * 143 | cos((45 * pi) / 180), 0.25); 144 | TAnimator.AnimateFloat(FTopLine, 'Position.X', 9, 0.25); 145 | TAnimator.AnimateFloatWait(FBottomLine, 'Position.X', 9, 0.25); 146 | end; 147 | 148 | procedure TZMaterialBackButton.DoAnimateBackToMenu; 149 | begin 150 | TAnimator.AnimateFloatDelay(FLayout, 'RotationAngle', 360, 0.25); 151 | TAnimator.AnimateFloat(FTopLine, 'RotationAngle', 0, 0.25); 152 | TAnimator.AnimateFloat(FBottomLine, 'RotationAngle', 0, 0.25); 153 | TAnimator.AnimateFloat(FTopLine, 'Width', 18, 0.25); 154 | TAnimator.AnimateFloat(FBottomLine, 'Width', 18, 0.25); 155 | TAnimator.AnimateFloat(FMiddleLine, 'Width', 18, 0.25); 156 | TAnimator.AnimateFloat(FMiddleLine, 'Position.X', 0, 0.25); 157 | TAnimator.AnimateFloat(FTopLine, 'Position.Y', 0, 0.25); 158 | TAnimator.AnimateFloat(FBottomLine, 'Position.Y', 12, 0.25); 159 | TAnimator.AnimateFloat(FTopLine, 'Position.X', 0, 0.25); 160 | TAnimator.AnimateFloatWait(FBottomLine, 'Position.X', 0, 0.25); 161 | end; 162 | 163 | procedure TZMaterialBackButton.DoAnimateMenuToClose; 164 | begin 165 | FLayout.RotationAngle := 0; 166 | TAnimator.AnimateFloat(FLayout, 'RotationAngle', 90, 0.125); 167 | TAnimator.AnimateFloat(FTopLine, 'Position.Y', FMiddleLinePosY, 0.125); 168 | TAnimator.AnimateFloatWait(FBottomLine, 'Position.Y', FMiddleLinePosY, 0.125); 169 | TAnimator.AnimateFloat(FLayout, 'RotationAngle', 180, 0.125); 170 | FMiddleLine.Visible := false; 171 | TAnimator.AnimateFloat(FTopLine, 'RotationAngle', -45, 0.125); 172 | TAnimator.AnimateFloatWait(FBottomLine, 'RotationAngle', 45, 0.125); 173 | end; 174 | 175 | procedure TZMaterialBackButton.DoAnimateCloseToMenu; 176 | begin 177 | TAnimator.AnimateFloat(FLayout, 'RotationAngle', 270, 0.125); 178 | TAnimator.AnimateFloat(FTopLine, 'RotationAngle', 0, 0.125); 179 | TAnimator.AnimateFloatWait(FBottomLine, 'RotationAngle', 0, 0.125); 180 | FMiddleLine.RotationAngle := 0; 181 | FMiddleLine.SetBounds(0, 6, FLayout.Width, 2); 182 | FMiddleLine.Visible := true; 183 | TAnimator.AnimateFloat(FLayout, 'RotationAngle', 360, 0.125); 184 | TAnimator.AnimateFloat(FTopLine, 'Position.Y', FTopLinePosY, 0.125); 185 | TAnimator.AnimateFloatWait(FBottomLine, 'Position.Y', FBottomLinePosY, 0.125); 186 | end; 187 | 188 | procedure TZMaterialBackButton.Animate(const aAnimationType: TZMaterialBackButtonAnimationType); 189 | begin 190 | if (aAnimationType = TZMaterialBackButtonAnimationType.None) or (FAnimationType = aAnimationType) then 191 | exit; 192 | 193 | FAnimationType := aAnimationType; 194 | case FAnimationType of 195 | TZMaterialBackButtonAnimationType.MenuToBack: 196 | DoAnimateMenuToBack; 197 | TZMaterialBackButtonAnimationType.BackToMenu: 198 | DoAnimateBackToMenu; 199 | TZMaterialBackButtonAnimationType.MenuToClose: 200 | DoAnimateMenuToClose; 201 | TZMaterialBackButtonAnimationType.CloseToMenu: 202 | DoAnimateCloseToMenu; 203 | end; 204 | end; 205 | 206 | procedure TZMaterialBackButton.RestoreToMenuKind; 207 | const 208 | DefaultBounds: TRectF = (Left: 19; Top: 21; Right: 18; Bottom: 13); 209 | begin 210 | StopAllAnimations; 211 | 212 | FLayout.RotationAngle := 0; 213 | FLayout.Align := TAlignLayout.Center; 214 | FLayout.HitTest := false; 215 | FLayout.SetBounds(0, 0, DefaultBounds.Right, DefaultBounds.Bottom); 216 | 217 | FTopLine.Align := TAlignLayout.None; 218 | FTopLine.Stroke.Kind := TBrushKind.None; 219 | FTopLine.HitTest := false; 220 | FTopLine.RotationAngle := 0; 221 | FTopLine.SetBounds(0, 0, FLayout.Width, 2); 222 | FTopLine.Fill.Color := FColor; 223 | 224 | FMiddleLine.Align := TAlignLayout.None; 225 | FMiddleLine.Stroke.Kind := TBrushKind.None; 226 | FMiddleLine.HitTest := false; 227 | FMiddleLine.RotationAngle := 0; 228 | FMiddleLine.SetBounds(0, 6, FLayout.Width, 2); 229 | FMiddleLine.Fill.Color := FColor; 230 | FMiddleLine.Visible := true; 231 | 232 | FBottomLine.Align := TAlignLayout.None; 233 | FBottomLine.Stroke.Kind := TBrushKind.None; 234 | FBottomLine.HitTest := false; 235 | FBottomLine.RotationAngle := 0; 236 | FBottomLine.SetBounds(0, 12, FLayout.Width, 2); 237 | FBottomLine.Fill.Color := FColor; 238 | 239 | FTopLinePosY := FTopLine.Position.Y; 240 | FMiddleLinePosY := FMiddleLine.Position.Y; 241 | FBottomLinePosY := FBottomLine.Position.Y; 242 | end; 243 | 244 | procedure TZMaterialBackButton.SetColor(const Value: TAlphaColor); 245 | begin 246 | FColor := Value; 247 | FTopLine.Fill.Color := FColor; 248 | FMiddleLine.Fill.Color := FColor; 249 | FBottomLine.Fill.Color := FColor; 250 | end; 251 | 252 | procedure TZMaterialBackButton.SetKind(const Value: TZMaterialBackButtonKind); 253 | begin 254 | if FKind = Value then 255 | exit; 256 | 257 | RestoreToMenuKind; 258 | FKind := Value; 259 | 260 | case FKind of 261 | TZMaterialBackButtonKind.Menu: 262 | { RestoreToMenuKind }; 263 | TZMaterialBackButtonKind.Back: 264 | begin 265 | FLayout.RotationAngle := 180; 266 | 267 | FTopLine.RotationAngle := 45; 268 | FTopLine.Width := 12; 269 | FTopLine.Position.X := 9; 270 | FTopLine.Position.Y := FMiddleLine.Position.Y + FMiddleLine.Height / 4 - 12 * 0.5 * cos((45 * pi) / 180); 271 | 272 | FMiddleLine.Width := 16 - FMiddleLine.Height / 4; 273 | FMiddleLine.Position.X := 2; 274 | 275 | FBottomLine.RotationAngle := -45; 276 | FBottomLine.Width := 12; 277 | FBottomLine.Position.X := 9; 278 | FBottomLine.Position.Y := FMiddleLine.Position.Y - FMiddleLine.Height / 4 + 12 * 0.5 * cos((45 * pi) / 180); 279 | end; 280 | TZMaterialBackButtonKind.Close: 281 | begin 282 | FLayout.RotationAngle := 180; 283 | 284 | FTopLine.RotationAngle := -45; 285 | FTopLine.Position.Y := FMiddleLinePosY; 286 | 287 | FMiddleLine.Visible := false; 288 | 289 | FBottomLine.RotationAngle := 45; 290 | FBottomLine.Position.Y := FMiddleLinePosY; 291 | end; 292 | end; 293 | end; 294 | 295 | procedure TZMaterialBackButton.StopAllAnimations; 296 | begin 297 | FLayout.StopPropertyAnimation('RotationAngle'); 298 | 299 | FTopLine.StopPropertyAnimation('RotationAngle'); 300 | FTopLine.StopPropertyAnimation('Width'); 301 | FTopLine.StopPropertyAnimation('Position.Y'); 302 | FTopLine.StopPropertyAnimation('Position.X'); 303 | 304 | FMiddleLine.StopPropertyAnimation('RotationAngle'); 305 | FMiddleLine.StopPropertyAnimation('Width'); 306 | FMiddleLine.StopPropertyAnimation('Position.Y'); 307 | FMiddleLine.StopPropertyAnimation('Position.X'); 308 | 309 | FBottomLine.StopPropertyAnimation('RotationAngle'); 310 | FBottomLine.StopPropertyAnimation('Width'); 311 | FBottomLine.StopPropertyAnimation('Position.Y'); 312 | FBottomLine.StopPropertyAnimation('Position.X'); 313 | end; 314 | 315 | end. 316 | -------------------------------------------------------------------------------- /Library/FMX.ZNativeDrawFigure.pas: -------------------------------------------------------------------------------- 1 | unit FMX.ZNativeDrawFigure; 2 | 3 | { 4 | author: Ravil (ZuBy) Zaripov 5 | email: rzaripov1990@gmail.com 6 | http://github.com/rzaripov1990 7 | 8 | 2017 9 | } 10 | 11 | {$I NativeDraw.inc} 12 | 13 | interface 14 | 15 | {$SCOPEDENUMS ON} 16 | 17 | uses 18 | System.SysUtils, System.Classes, System.UITypes, System.Types, System.Math.Vectors, 19 | FMX.Types, FMX.Controls, FMX.Layouts, FMX.Objects, FMX.Graphics, 20 | FMX.Graphics.Native, 21 | FMX.ZMaterialTypes; 22 | 23 | type 24 | 25 | TZCustomNativeDrawFigure = class(TControl) 26 | public type 27 | TZNativeDrawFigureKind = (Line, DiagonalLine1, DiagonalLine2, Rectangle, RoundRect, Circle, Ellipse, Arc); 28 | private 29 | { Private declarations } 30 | FFill: TBrush; 31 | FStroke: TStrokeBrush; 32 | FKind: TZNativeDrawFigureKind; 33 | FXRadius: Single; 34 | FYRadius: Single; 35 | FSides: TSides; 36 | FCorners: TCorners; 37 | FCornerType: TCornerType; 38 | FEndAngle: Single; 39 | FStartAngle: Single; 40 | procedure SetFill(const Value: TBrush); 41 | procedure SetStroke(const Value: TStrokeBrush); 42 | procedure FillStrokeChanged(Sender: TObject); 43 | procedure SetKind(const Value: TZNativeDrawFigureKind); 44 | procedure SetXRadius(const Value: Single); 45 | procedure SetYRadius(const Value: Single); 46 | function IsSidesStored: Boolean; 47 | procedure SetSides(const Value: TSides); 48 | function IsCornersStored: Boolean; 49 | procedure SetCorners(const Value: TCorners); 50 | procedure SetCornerType(const Value: TCornerType); 51 | function GetShapeRect: TRectF; 52 | procedure SetEndAngle(const Value: Single); 53 | procedure SetStartAngle(const Value: Single); 54 | protected 55 | { Protected declarations } 56 | procedure Paint; override; 57 | public 58 | { Public declarations } 59 | constructor Create(AOwner: TComponent); override; 60 | destructor Destroy; override; 61 | 62 | property Kind: TZNativeDrawFigureKind read FKind write SetKind default TZNativeDrawFigureKind.Line; 63 | property Fill: TBrush read FFill write SetFill; 64 | property Stroke: TStrokeBrush read FStroke write SetStroke; 65 | { Round Rect } 66 | property XRadius: Single read FXRadius write SetXRadius; 67 | property YRadius: Single read FYRadius write SetYRadius; 68 | { Rectangle } 69 | property Sides: TSides read FSides write SetSides stored IsSidesStored; 70 | property Corners: TCorners read FCorners write SetCorners stored IsCornersStored; 71 | property CornerType: TCornerType read FCornerType write SetCornerType default TCornerType.Round; 72 | { Arc } 73 | property StartAngle: Single read FStartAngle write SetStartAngle; 74 | property EndAngle: Single read FEndAngle write SetEndAngle; 75 | published 76 | { Published declarations } 77 | end; 78 | 79 | TZNativeDrawFigureTemplateWithEvents = class(TZCustomNativeDrawFigure) 80 | published 81 | property Align; 82 | property Anchors; 83 | property ClipChildren default False; 84 | property ClipParent default False; 85 | property Cursor default crDefault; 86 | property DragMode default TDragMode.dmManual; 87 | property EnableDragHighlight default True; 88 | property Enabled default True; 89 | property Locked default False; 90 | property Height; 91 | property HitTest default True; 92 | property Padding; 93 | property Margins; 94 | property Opacity; 95 | property PopupMenu; 96 | property Position; 97 | property RotationAngle; 98 | property RotationCenter; 99 | property Scale; 100 | property Size; 101 | property Visible default True; 102 | property Width; 103 | { Drag and Drop events } 104 | property OnDragEnter; 105 | property OnDragLeave; 106 | property OnDragOver; 107 | property OnDragDrop; 108 | property OnDragEnd; 109 | { Mouse events } 110 | property OnClick; 111 | property OnDblClick; 112 | 113 | property OnMouseDown; 114 | property OnMouseMove; 115 | property OnMouseUp; 116 | property OnMouseWheel; 117 | property OnMouseEnter; 118 | property OnMouseLeave; 119 | 120 | property OnPainting; 121 | property OnPaint; 122 | property OnResize; 123 | end; 124 | 125 | [ComponentPlatformsAttribute(cpaAllPlatforms)] 126 | TZNativeDrawFigureLine = class(TZNativeDrawFigureTemplateWithEvents) 127 | public 128 | constructor Create(AOwner: TComponent); override; 129 | published 130 | property Stroke; 131 | end; 132 | 133 | [ComponentPlatformsAttribute(cpaAllPlatforms)] 134 | TZNativeDrawFigureRectangle = class(TZNativeDrawFigureTemplateWithEvents) 135 | public 136 | constructor Create(AOwner: TComponent); override; 137 | published 138 | property Fill; 139 | property Stroke; 140 | property XRadius; 141 | property YRadius; 142 | property Sides; 143 | end; 144 | 145 | [ComponentPlatformsAttribute(cpaAllPlatforms)] 146 | TZNativeDrawFigureRoundRect = class(TZNativeDrawFigureTemplateWithEvents) 147 | public 148 | constructor Create(AOwner: TComponent); override; 149 | published 150 | property Fill; 151 | property Stroke; 152 | property Corners; 153 | property CornerType; 154 | end; 155 | 156 | [ComponentPlatformsAttribute(cpaAllPlatforms)] 157 | TZNativeDrawFigureEllipse = class(TZNativeDrawFigureTemplateWithEvents) 158 | public 159 | constructor Create(AOwner: TComponent); override; 160 | published 161 | property Fill; 162 | property Stroke; 163 | end; 164 | 165 | [ComponentPlatformsAttribute(cpaAllPlatforms)] 166 | TZNativeDrawFigureCircle = class(TZNativeDrawFigureTemplateWithEvents) 167 | public 168 | constructor Create(AOwner: TComponent); override; 169 | published 170 | property Fill; 171 | property Stroke; 172 | end; 173 | 174 | [ComponentPlatformsAttribute(cpaAllPlatforms)] 175 | TZNativeDrawFigureArc = class(TZNativeDrawFigureTemplateWithEvents) 176 | public 177 | constructor Create(AOwner: TComponent); override; 178 | published 179 | property Fill; 180 | property Stroke; 181 | property StartAngle; 182 | property EndAngle; 183 | end; 184 | 185 | procedure Register; 186 | 187 | implementation 188 | 189 | uses 190 | System.Math; 191 | 192 | procedure Register; 193 | begin 194 | RegisterComponents('ZMaterial', [TZNativeDrawFigureLine, TZNativeDrawFigureRectangle, TZNativeDrawFigureRoundRect, 195 | TZNativeDrawFigureEllipse, TZNativeDrawFigureCircle, TZNativeDrawFigureArc]); 196 | end; 197 | 198 | // copied from FMX.Objects \\ 199 | function GetDrawingShapeRectAndSetThickness(const AFill: TBrush; const AStroke: TStrokeBrush; ALocalRect: TRectF; 200 | const Fit: Boolean; var FillShape, DrawShape: Boolean; var StrokeThicknessRestoreValue: Single): TRectF; 201 | const 202 | MinRectAreaSize = 0.01; 203 | begin 204 | FillShape := (AFill <> nil) and (AFill.Kind <> TBrushKind.None); 205 | DrawShape := (AStroke <> nil) and (AStroke.Kind <> TBrushKind.None); 206 | 207 | if Fit then 208 | Result := TRectF.Create(0, 0, 1, 1).FitInto(ALocalRect) 209 | else 210 | Result := ALocalRect; 211 | 212 | if DrawShape then 213 | begin 214 | if Result.Width < AStroke.Thickness then 215 | begin 216 | StrokeThicknessRestoreValue := AStroke.Thickness; 217 | FillShape := False; 218 | AStroke.Thickness := Min(Result.Width, Result.Height); 219 | Result.Left := (Result.Right + Result.Left) * 0.5; 220 | Result.Right := Result.Left + MinRectAreaSize; 221 | end 222 | else 223 | Result.Inflate(-AStroke.Thickness * 0.5, 0); 224 | 225 | if Result.Height < AStroke.Thickness then 226 | begin 227 | if StrokeThicknessRestoreValue < 0.0 then 228 | StrokeThicknessRestoreValue := AStroke.Thickness; 229 | FillShape := False; 230 | AStroke.Thickness := Min(Result.Width, Result.Height); 231 | Result.Top := (Result.Bottom + Result.Top) * 0.5; 232 | Result.Bottom := Result.Top + MinRectAreaSize; 233 | end 234 | else 235 | Result.Inflate(0, -AStroke.Thickness * 0.5); 236 | end; 237 | end; 238 | 239 | { TZNativeDrawFigure } 240 | 241 | constructor TZCustomNativeDrawFigure.Create(AOwner: TComponent); 242 | begin 243 | inherited Create(AOwner); 244 | 245 | FCorners := AllCorners; 246 | FXRadius := 0; 247 | FYRadius := 0; 248 | FSides := AllSides; 249 | 250 | FCornerType := TCornerType.Round; 251 | 252 | FStartAngle := 0; 253 | FEndAngle := -90; 254 | 255 | FFill := TBrush.Create(TBrushKind.Solid, $FFE0E0E0); 256 | FFill.OnChanged := FillStrokeChanged; 257 | FStroke := TStrokeBrush.Create(TBrushKind.Solid, $FF000000); 258 | FStroke.OnChanged := FillStrokeChanged; 259 | 260 | Repaint; 261 | end; 262 | 263 | destructor TZCustomNativeDrawFigure.Destroy; 264 | begin 265 | FStroke.Free; 266 | FFill.Free; 267 | inherited Destroy; 268 | end; 269 | 270 | procedure TZCustomNativeDrawFigure.FillStrokeChanged(Sender: TObject); 271 | begin 272 | if FUpdating = 0 then 273 | Repaint; 274 | end; 275 | 276 | function TZCustomNativeDrawFigure.GetShapeRect: TRectF; 277 | begin 278 | Result := Self.LocalRect; 279 | if FStroke.Kind <> TBrushKind.None then 280 | InflateRect(Result, -(FStroke.Thickness / 2), -(FStroke.Thickness / 2)); 281 | end; 282 | 283 | function TZCustomNativeDrawFigure.IsCornersStored: Boolean; 284 | begin 285 | Result := FCorners <> AllCorners; 286 | end; 287 | 288 | function TZCustomNativeDrawFigure.IsSidesStored: Boolean; 289 | begin 290 | Result := FSides * AllSides <> AllSides 291 | end; 292 | 293 | procedure TZCustomNativeDrawFigure.Paint; 294 | var 295 | Off, Radius: Single; 296 | StrokeThicknessRestoreValue: Single; 297 | FillShape, DrawShape: Boolean; 298 | LShapeRect: TRectF; 299 | MidPoint: TPointF; 300 | begin 301 | StrokeThicknessRestoreValue := FStroke.Thickness; 302 | 303 | Canvas.Fill.Assign(FFill); 304 | Canvas.Stroke.Assign(FStroke); 305 | 306 | try 307 | LShapeRect := GetDrawingShapeRectAndSetThickness(FFill, FStroke, Self.LocalRect, 308 | FKind = TZNativeDrawFigureKind.Circle, FillShape, DrawShape, StrokeThicknessRestoreValue); 309 | 310 | {$IFDEF UseNativeDraw} 311 | Canvas.NativeDraw(LocalRect, 312 | procedure 313 | begin 314 | {$ENDIF} 315 | Canvas.BeginScene; 316 | try 317 | case FKind of 318 | TZNativeDrawFigureKind.Line: 319 | begin 320 | Canvas.DrawLine(PointF(0, 0), PointF(LocalRect.Width, 0), AbsoluteOpacity); 321 | end; 322 | TZNativeDrawFigureKind.DiagonalLine1: 323 | begin 324 | Canvas.DrawLine(PointF(0, LocalRect.Height), PointF(LocalRect.Width, 0), AbsoluteOpacity); 325 | end; 326 | TZNativeDrawFigureKind.DiagonalLine2: 327 | begin 328 | Canvas.DrawLine(PointF(0, 0), PointF(LocalRect.Width, LocalRect.Height), AbsoluteOpacity); 329 | end; 330 | TZNativeDrawFigureKind.Rectangle: 331 | begin 332 | if FSides <> AllSides then 333 | begin 334 | Off := LShapeRect.Left; 335 | if not(TSide.Top in FSides) then 336 | LShapeRect.Top := LShapeRect.Top - Off; 337 | if not(TSide.Left in FSides) then 338 | LShapeRect.Left := LShapeRect.Left - Off; 339 | if not(TSide.Bottom in FSides) then 340 | LShapeRect.Bottom := LShapeRect.Bottom + Off; 341 | if not(TSide.Right in FSides) then 342 | LShapeRect.Right := LShapeRect.Right + Off; 343 | 344 | if FillShape then 345 | Canvas.FillRect(LShapeRect, FXRadius, FYRadius, FCorners, AbsoluteOpacity, FFill, FCornerType); 346 | if DrawShape then 347 | Canvas.DrawRectSides(GetShapeRect, FXRadius, FYRadius, FCorners, AbsoluteOpacity, FSides, FStroke, 348 | FCornerType); 349 | end 350 | else 351 | begin 352 | if FillShape then 353 | Canvas.FillRect(LShapeRect, FXRadius, FYRadius, FCorners, AbsoluteOpacity, FFill, FCornerType); 354 | if DrawShape then 355 | Canvas.DrawRect(LShapeRect, FXRadius, FYRadius, FCorners, AbsoluteOpacity, FStroke, FCornerType); 356 | end; 357 | end; 358 | TZNativeDrawFigureKind.RoundRect: 359 | begin 360 | if Height < Width then 361 | Radius := Self.LocalRect.Height / 2 362 | else 363 | Radius := Self.LocalRect.Width / 2; 364 | 365 | if FillShape then 366 | Canvas.FillRect(LShapeRect, Radius, Radius, FCorners, AbsoluteOpacity, FFill, FCornerType); 367 | if DrawShape then 368 | Canvas.DrawRect(LShapeRect, Radius, Radius, FCorners, AbsoluteOpacity, FStroke, FCornerType); 369 | end; 370 | TZNativeDrawFigureKind.Circle: 371 | begin 372 | if FillShape then 373 | Canvas.FillEllipse(LShapeRect, AbsoluteOpacity, FFill); 374 | if DrawShape then 375 | Canvas.DrawEllipse(LShapeRect, AbsoluteOpacity, FStroke); 376 | end; 377 | TZNativeDrawFigureKind.Ellipse: 378 | begin 379 | if FillShape then 380 | Canvas.FillEllipse(LShapeRect, AbsoluteOpacity, FFill); 381 | if DrawShape then 382 | Canvas.DrawEllipse(LShapeRect, AbsoluteOpacity, FStroke); 383 | end; 384 | TZNativeDrawFigureKind.Arc: 385 | begin 386 | MidPoint := LShapeRect.CenterPoint; 387 | if FillShape then 388 | Canvas.FillArc(MidPoint, TPointF.Create(LShapeRect.Width * 0.5, LShapeRect.Height * 0.5), FStartAngle, 389 | FEndAngle, AbsoluteOpacity, FFill); 390 | if DrawShape then 391 | Canvas.DrawArc(MidPoint, TPointF.Create(LShapeRect.Width * 0.5, LShapeRect.Height * 0.5), FStartAngle, 392 | FEndAngle, AbsoluteOpacity, FStroke); 393 | end; 394 | end; 395 | finally 396 | Canvas.EndScene; 397 | end; 398 | {$IFDEF UseNativeDraw} 399 | end); 400 | {$ENDIF} 401 | finally 402 | if StrokeThicknessRestoreValue <> FStroke.Thickness then 403 | FStroke.Thickness := StrokeThicknessRestoreValue; 404 | end; 405 | end; 406 | 407 | procedure TZCustomNativeDrawFigure.SetCorners(const Value: TCorners); 408 | begin 409 | if FCorners = Value then 410 | exit; 411 | 412 | FCorners := Value; 413 | Repaint; 414 | end; 415 | 416 | procedure TZCustomNativeDrawFigure.SetCornerType(const Value: TCornerType); 417 | begin 418 | if FCornerType = Value then 419 | exit; 420 | 421 | FCornerType := Value; 422 | Repaint; 423 | end; 424 | 425 | procedure TZCustomNativeDrawFigure.SetEndAngle(const Value: Single); 426 | begin 427 | if SameValue(FEndAngle, Value, TEpsilon.Vector) then 428 | exit; 429 | 430 | FEndAngle := Value; 431 | Repaint; 432 | end; 433 | 434 | procedure TZCustomNativeDrawFigure.SetFill(const Value: TBrush); 435 | begin 436 | FFill.Assign(Value); 437 | end; 438 | 439 | procedure TZCustomNativeDrawFigure.SetKind(const Value: TZNativeDrawFigureKind); 440 | begin 441 | if FKind = Value then 442 | exit; 443 | 444 | FKind := Value; 445 | Repaint; 446 | end; 447 | 448 | procedure TZCustomNativeDrawFigure.SetSides(const Value: TSides); 449 | begin 450 | if FSides = Value then 451 | exit; 452 | 453 | FSides := Value; 454 | Repaint; 455 | end; 456 | 457 | procedure TZCustomNativeDrawFigure.SetStartAngle(const Value: Single); 458 | begin 459 | if SameValue(FStartAngle, Value, TEpsilon.Vector) then 460 | exit; 461 | 462 | FStartAngle := Value; 463 | Repaint; 464 | end; 465 | 466 | procedure TZCustomNativeDrawFigure.SetStroke(const Value: TStrokeBrush); 467 | begin 468 | FStroke.Assign(Value); 469 | end; 470 | 471 | procedure TZCustomNativeDrawFigure.SetXRadius(const Value: Single); 472 | var 473 | NewValue: Single; 474 | begin 475 | if csDesigning in ComponentState then 476 | NewValue := Min(Value, Min(Width / 2, Height / 2)) 477 | else 478 | NewValue := Value; 479 | 480 | if SameValue(FXRadius, NewValue, TEpsilon.Vector) then 481 | exit; 482 | 483 | FXRadius := Value; 484 | Repaint; 485 | end; 486 | 487 | procedure TZCustomNativeDrawFigure.SetYRadius(const Value: Single); 488 | var 489 | NewValue: Single; 490 | begin 491 | if csDesigning in ComponentState then 492 | NewValue := Min(Value, Min(Width / 2, Height / 2)) 493 | else 494 | NewValue := Value; 495 | 496 | if SameValue(FYRadius, NewValue, TEpsilon.Vector) then 497 | exit; 498 | 499 | FYRadius := Value; 500 | Repaint; 501 | end; 502 | 503 | { TZNativeDrawFigureLine } 504 | 505 | constructor TZNativeDrawFigureLine.Create(AOwner: TComponent); 506 | begin 507 | inherited Create(AOwner); 508 | Kind := TZNativeDrawFigureKind.Line; 509 | end; 510 | 511 | { TZNativeDrawFigureRectangle } 512 | 513 | constructor TZNativeDrawFigureRectangle.Create(AOwner: TComponent); 514 | begin 515 | inherited Create(AOwner); 516 | Kind := TZNativeDrawFigureKind.Rectangle; 517 | end; 518 | 519 | { TZNativeDrawFigureRoundRect } 520 | 521 | constructor TZNativeDrawFigureRoundRect.Create(AOwner: TComponent); 522 | begin 523 | inherited Create(AOwner); 524 | Kind := TZNativeDrawFigureKind.RoundRect; 525 | end; 526 | 527 | { TZNativeDrawFigureEllipse } 528 | 529 | constructor TZNativeDrawFigureEllipse.Create(AOwner: TComponent); 530 | begin 531 | inherited Create(AOwner); 532 | Kind := TZNativeDrawFigureKind.Ellipse; 533 | end; 534 | 535 | { TZNativeDrawFigureCircle } 536 | 537 | constructor TZNativeDrawFigureCircle.Create(AOwner: TComponent); 538 | begin 539 | inherited Create(AOwner); 540 | Kind := TZNativeDrawFigureKind.Circle; 541 | end; 542 | 543 | { TZNativeDrawFigureArc } 544 | 545 | constructor TZNativeDrawFigureArc.Create(AOwner: TComponent); 546 | begin 547 | inherited Create(AOwner); 548 | Kind := TZNativeDrawFigureKind.Arc; 549 | Fill.Kind := TBrushKind.None; 550 | end; 551 | 552 | end. 553 | -------------------------------------------------------------------------------- /Demo/MaterialEdit/prjMaterialEdit.deployproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 5 | 6 | 7 | 066ab2310ac64b09 8 | 9 | 10 | iPhone5 11 | 12 | 13 | 14 | 15 | 16 | 17 | prjMaterialEdit\ 18 | prjMaterialEdit.exe 19 | ProjectOutput 20 | 0 21 | 22 | 23 | True 24 | True 25 | 26 | 27 | 28 | 29 | prjMaterialEdit.app\Contents\MacOS\ 30 | libcgsqlite3.dylib 31 | DependencyModule 32 | 1 33 | 34 | 35 | True 36 | 37 | 38 | prjMaterialEdit.app\Contents\MacOS\ 39 | libcgunwind.1.0.dylib 40 | DependencyModule 41 | 1 42 | 43 | 44 | True 45 | 46 | 47 | 48 | 49 | prjMaterialEdit\res\drawable-ldpi\ 50 | ic_launcher.png 51 | Android_LauncherIcon36 52 | 1 53 | 54 | 55 | True 56 | 57 | 58 | prjMaterialEdit\res\drawable-ldpi\ 59 | ic_launcher.png 60 | Android_LauncherIcon36 61 | 1 62 | 63 | 64 | True 65 | 66 | 67 | prjMaterialEdit\res\values\ 68 | styles.xml 69 | AndroidSplashStyles 70 | 1 71 | 72 | 73 | True 74 | 75 | 76 | prjMaterialEdit\res\drawable\ 77 | splash_image_def.xml 78 | AndroidSplashImageDef 79 | 1 80 | 81 | 82 | True 83 | 84 | 85 | prjMaterialEdit\res\drawable-small\ 86 | splash_image.png 87 | Android_SplashImage426 88 | 1 89 | 90 | 91 | True 92 | 93 | 94 | prjMaterialEdit\res\drawable-xlarge\ 95 | splash_image.png 96 | Android_SplashImage960 97 | 1 98 | 99 | 100 | True 101 | 102 | 103 | prjMaterialEdit\res\drawable-hdpi\ 104 | ic_launcher.png 105 | Android_LauncherIcon72 106 | 1 107 | 108 | 109 | True 110 | 111 | 112 | prjMaterialEdit\res\drawable-large\ 113 | splash_image.png 114 | Android_SplashImage640 115 | 1 116 | 117 | 118 | True 119 | 120 | 121 | prjMaterialEdit\library\lib\armeabi\ 122 | libProject1.so 123 | AndroidLibnativeArmeabiFile 124 | 1 125 | 126 | 127 | True 128 | 129 | 130 | prjMaterialEdit\res\drawable-xlarge\ 131 | splash_image.png 132 | Android_SplashImage960 133 | 1 134 | 135 | 136 | True 137 | 138 | 139 | prjMaterialEdit\res\drawable-hdpi\ 140 | ic_launcher.png 141 | Android_LauncherIcon72 142 | 1 143 | 144 | 145 | True 146 | 147 | 148 | prjMaterialEdit\res\drawable-small\ 149 | splash_image.png 150 | Android_SplashImage426 151 | 1 152 | 153 | 154 | True 155 | 156 | 157 | prjMaterialEdit\res\drawable-mdpi\ 158 | ic_launcher.png 159 | Android_LauncherIcon48 160 | 1 161 | 162 | 163 | True 164 | 165 | 166 | prjMaterialEdit\library\lib\armeabi-v7a\ 167 | gdbserver 168 | AndroidGDBServer 169 | 1 170 | 171 | 172 | True 173 | 174 | 175 | prjMaterialEdit\library\lib\mips\ 176 | libProject1.so 177 | AndroidLibnativeMipsFile 178 | 1 179 | 180 | 181 | True 182 | 183 | 184 | prjMaterialEdit\classes\ 185 | classes.dex 186 | AndroidClassesDexFile 187 | 1 188 | 189 | 190 | True 191 | 192 | 193 | prjMaterialEdit\library\lib\armeabi-v7a\ 194 | gdbserver 195 | AndroidGDBServer 196 | 1 197 | 198 | 199 | True 200 | 201 | 202 | prjMaterialEdit\res\drawable\ 203 | splash_image_def.xml 204 | AndroidSplashImageDef 205 | 1 206 | 207 | 208 | True 209 | 210 | 211 | prjMaterialEdit\res\values\ 212 | styles.xml 213 | AndroidSplashStyles 214 | 1 215 | 216 | 217 | True 218 | 219 | 220 | prjMaterialEdit\res\drawable-xxhdpi\ 221 | ic_launcher.png 222 | Android_LauncherIcon144 223 | 1 224 | 225 | 226 | True 227 | 228 | 229 | prjMaterialEdit\ 230 | AndroidManifest.xml 231 | ProjectAndroidManifest 232 | 1 233 | 234 | 235 | True 236 | 237 | 238 | prjMaterialEdit\library\lib\armeabi\ 239 | libProject1.so 240 | AndroidLibnativeArmeabiFile 241 | 1 242 | 243 | 244 | True 245 | 246 | 247 | prjMaterialEdit\res\drawable-xxhdpi\ 248 | ic_launcher.png 249 | Android_LauncherIcon144 250 | 1 251 | 252 | 253 | True 254 | 255 | 256 | prjMaterialEdit\res\drawable-normal\ 257 | splash_image.png 258 | Android_SplashImage470 259 | 1 260 | 261 | 262 | True 263 | 264 | 265 | prjMaterialEdit\library\lib\mips\ 266 | libProject1.so 267 | AndroidLibnativeMipsFile 268 | 1 269 | 270 | 271 | True 272 | 273 | 274 | prjMaterialEdit\library\lib\armeabi-v7a\ 275 | libprjMaterialEdit.so 276 | ProjectOutput 277 | 1 278 | 279 | 280 | True 281 | True 282 | 283 | 284 | prjMaterialEdit\res\drawable-xhdpi\ 285 | ic_launcher.png 286 | Android_LauncherIcon96 287 | 1 288 | 289 | 290 | True 291 | 292 | 293 | prjMaterialEdit\library\lib\armeabi-v7a\ 294 | libprjMaterialEdit.so 295 | ProjectOutput 296 | 1 297 | 298 | 299 | True 300 | True 301 | 302 | 303 | prjMaterialEdit\res\drawable-normal\ 304 | splash_image.png 305 | Android_SplashImage470 306 | 1 307 | 308 | 309 | True 310 | 311 | 312 | prjMaterialEdit\res\drawable-xhdpi\ 313 | ic_launcher.png 314 | Android_LauncherIcon96 315 | 1 316 | 317 | 318 | True 319 | 320 | 321 | prjMaterialEdit\res\drawable-large\ 322 | splash_image.png 323 | Android_SplashImage640 324 | 1 325 | 326 | 327 | True 328 | 329 | 330 | prjMaterialEdit\ 331 | AndroidManifest.xml 332 | ProjectAndroidManifest 333 | 1 334 | 335 | 336 | True 337 | 338 | 339 | prjMaterialEdit\classes\ 340 | classes.dex 341 | AndroidClassesDexFile 342 | 1 343 | 344 | 345 | True 346 | 347 | 348 | prjMaterialEdit\res\drawable-mdpi\ 349 | ic_launcher.png 350 | Android_LauncherIcon48 351 | 1 352 | 353 | 354 | True 355 | 356 | 357 | 358 | 359 | prjMaterialEdit.app\ 360 | libPCRE.dylib 361 | DependencyModule 362 | 1 363 | 364 | 365 | True 366 | 367 | 368 | prjMaterialEdit.app\ 369 | libcgunwind.1.0.dylib 370 | DependencyModule 371 | 1 372 | 373 | 374 | True 375 | 376 | 377 | 378 | -------------------------------------------------------------------------------- /Library/FMX.ZMaterialEdit.pas: -------------------------------------------------------------------------------- 1 | unit FMX.ZMaterialEdit; 2 | 3 | { 4 | author: Ravil (ZuBy) Zaripov 5 | email: rzaripov1990@gmail.com 6 | http://github.com/rzaripov1990 7 | 8 | 2017 9 | } 10 | 11 | interface 12 | 13 | uses 14 | System.SysUtils, System.Classes, System.UITypes, System.Types, 15 | FMX.Types, FMX.Controls, FMX.Layouts, FMX.Edit, FMX.StdCtrls, FMX.Graphics, 16 | FMX.ZMaterialTypes, FMX.Objects, FMX.TextLayout; 17 | 18 | type 19 | 20 | [ComponentPlatformsAttribute(cpaAllPlatforms)] 21 | TZMaterialEdit = class(TLayout) 22 | private const 23 | Xmargin = 2; 24 | Ymargin = 1; 25 | 26 | private 27 | FEdit: TEdit; 28 | FLabel: TLabel; 29 | 30 | FAnimation: Boolean; 31 | 32 | FPromptUpTextSettings: TTextSettings; 33 | FPromptUpStylledSettings: TStyledSettings; 34 | 35 | FPromptDownTextSettings: TTextSettings; 36 | FPromptDownStylledSettings: TStyledSettings; 37 | 38 | FTextOnChangeEvent: TNotifyEvent; 39 | FTextOnTypingEvent: TNotifyEvent; 40 | 41 | procedure DoMyEnter; 42 | procedure DoMyExit; 43 | procedure DoResize; 44 | 45 | procedure OnEnterEvent(Sender: TObject); 46 | procedure OnExitEvent(Sender: TObject); 47 | procedure OnChangeEvent(Sender: TObject); 48 | procedure OnTypingEvent(Sender: TObject); 49 | procedure OnKeyUpEvent(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); 50 | procedure OnKeyDownEvent(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); 51 | 52 | procedure OnApplyStyleLookupPrompt(Sender: TObject); 53 | procedure OnApplyStyleLookupText(Sender: TObject); 54 | 55 | function GetAnimation: Boolean; 56 | procedure SetAnimation(const Value: Boolean); 57 | 58 | { Edit } 59 | function GetText: string; 60 | procedure SetText(const Value: string); 61 | 62 | function GetTextSettings: TTextSettings; 63 | procedure SetTextSettings(const Value: TTextSettings); 64 | 65 | function GetTextStyledSettings: TStyledSettings; 66 | procedure SetTextStyledSettings(const Value: TStyledSettings); 67 | 68 | procedure SetKeyboardType(Value: TVirtualKeyboardType); 69 | function GetKeyboardType: TVirtualKeyboardType; 70 | 71 | procedure SetReturnKeyType(Value: TReturnKeyType); 72 | function GetReturnKeyType: TReturnKeyType; 73 | 74 | procedure SetMaxLength(const Value: Integer); 75 | function GetMaxLength: Integer; 76 | 77 | procedure SetPassword(const Value: Boolean); 78 | function GetPassword: Boolean; 79 | 80 | procedure SetReadOnly(const Value: Boolean); 81 | function GetReadOnly: Boolean; 82 | 83 | procedure SetKillFocusByReturn(const Value: Boolean); 84 | function GetKillFocusByReturn: Boolean; 85 | 86 | function GetCheckSpelling: Boolean; 87 | procedure SetCheckSpelling(const Value: Boolean); 88 | 89 | procedure SetControlType(const Value: TControlType); 90 | function GetControlType: TControlType; 91 | 92 | function GetImeMode: TImeMode; 93 | procedure SetImeMode(const Value: TImeMode); 94 | 95 | function GetFilterChar: string; 96 | procedure SetFilterChar(const Value: string); 97 | 98 | function GetDisableFocusEffect: Boolean; 99 | procedure SetDisableFocusEffect(const Value: Boolean); 100 | 101 | { Label } 102 | function GetPrompt: string; 103 | procedure SetPrompt(const Value: string); 104 | 105 | function GetPromptSettings: TTextSettings; 106 | procedure SetPromptSettings(const Value: TTextSettings); 107 | 108 | function GetPromptStyledSettings: TStyledSettings; 109 | procedure SetPromptStyledSettings(const Value: TStyledSettings); 110 | 111 | function GetAutoTranslatePrompt: Boolean; 112 | procedure SetAutoTranslatePrompt(const Value: Boolean); 113 | 114 | function GetPromptUpTextSettings: TTextSettings; 115 | procedure SetPromptUpTextSettings(const Value: TTextSettings); 116 | 117 | function GetTextSettingsClass: TTextSettingsClass; 118 | protected 119 | { Protected declarations } 120 | procedure Resize; override; 121 | public 122 | { Public declarations } 123 | constructor Create(AOwner: TComponent); override; 124 | destructor Destroy; override; 125 | procedure SetFocus; overload; 126 | 127 | function GetEdit: TEdit; 128 | function GetLabel: TLabel; 129 | published 130 | { Published declarations } 131 | property Text: string read GetText write SetText; 132 | property Prompt: string read GetPrompt write SetPrompt; 133 | 134 | property TextSettings: TTextSettings read GetTextSettings write SetTextSettings; 135 | property StyledSettings: TStyledSettings read GetTextStyledSettings write SetTextStyledSettings; 136 | 137 | property TextSettingsPrompt: TTextSettings read GetPromptSettings write SetPromptSettings; 138 | property StyledSettingsPrompt: TStyledSettings read GetPromptStyledSettings write SetPromptStyledSettings; 139 | 140 | property TextSettingsPromptUp: TTextSettings read GetPromptUpTextSettings write SetPromptUpTextSettings; 141 | property StyledSettingsPromptUp: TStyledSettings read FPromptUpStylledSettings write FPromptUpStylledSettings; 142 | 143 | property Animation: Boolean read GetAnimation write SetAnimation default True; 144 | 145 | { Events } 146 | property OnApplyStyleLookup; 147 | 148 | property OnClick; 149 | 150 | property OnMouseDown; 151 | property OnMouseMove; 152 | property OnMouseUp; 153 | 154 | property OnEnter; 155 | property OnExit; 156 | 157 | property OnKeyDown; 158 | property OnKeyUp; 159 | 160 | property OnResize; 161 | 162 | property OnChange: TNotifyEvent read FTextOnChangeEvent write FTextOnChangeEvent; 163 | property OnTyping: TNotifyEvent read FTextOnTypingEvent write FTextOnTypingEvent; 164 | 165 | property AutoTranslatePrompt: Boolean read GetAutoTranslatePrompt write SetAutoTranslatePrompt default True; 166 | 167 | property DisableFocusEffect: Boolean read GetDisableFocusEffect write SetDisableFocusEffect default False; 168 | property ControlType: TControlType read GetControlType write SetControlType default TControlType.Styled; 169 | property CheckSpelling: Boolean read GetCheckSpelling write SetCheckSpelling default False; 170 | property KeyboardType: TVirtualKeyboardType read GetKeyboardType write SetKeyboardType 171 | default TVirtualKeyboardType.Default; 172 | property ReturnKeyType: TReturnKeyType read GetReturnKeyType write SetReturnKeyType default TReturnKeyType.Default; 173 | property Password: Boolean read GetPassword write SetPassword default False; 174 | property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False; 175 | property KillFocusByReturn: Boolean read GetKillFocusByReturn write SetKillFocusByReturn default False; 176 | property ImeMode: TImeMode read GetImeMode write SetImeMode default TImeMode.imDontCare; 177 | property FilterChar: string read GetFilterChar write SetFilterChar; 178 | property MaxLength: Integer read GetMaxLength write SetMaxLength default 0; 179 | end; 180 | 181 | procedure Register; 182 | 183 | implementation 184 | 185 | uses 186 | System.Math, FMX.Ani; 187 | 188 | procedure Register; 189 | begin 190 | RegisterComponents('ZMaterial', [TZMaterialEdit]); 191 | end; 192 | 193 | type 194 | TPromptTextSettings = class(TTextSettings) 195 | public 196 | constructor Create(const AOwner: TPersistent); override; 197 | published 198 | property Font; 199 | property FontColor; 200 | property HorzAlign; 201 | property VertAlign; 202 | property WordWrap default True; 203 | property Trimming default TTextTrimming.Character; 204 | end; 205 | 206 | { TMaterialEdit } 207 | 208 | function GetHeightLabel(const aLabel: TLabel; aFontStyle: TFontStyles; aFontSize: Single): Single; 209 | var 210 | L: TTextLayout; 211 | begin 212 | L := TTextLayoutManager.DefaultTextLayout.Create; 213 | L.BeginUpdate; 214 | try 215 | L.Text := aLabel.Text; 216 | L.MaxSize := TPointF.Create(aLabel.Width, 1000.00); 217 | L.Font := aLabel.Font; 218 | L.Font.Size := aFontSize; 219 | L.Font.Style := aFontStyle; 220 | L.WordWrap := aLabel.WordWrap; 221 | L.HorizontalAlign := aLabel.TextAlign; 222 | L.VerticalAlign := aLabel.VertTextAlign; 223 | finally 224 | L.EndUpdate; 225 | end; 226 | Result := L.Height; 227 | FreeAndNil(L); 228 | end; 229 | 230 | constructor TZMaterialEdit.Create(AOwner: TComponent); 231 | var 232 | LClass: TTextSettingsClass; 233 | begin 234 | inherited Create(AOwner); 235 | 236 | FAnimation := True; 237 | 238 | FEdit := TEdit.Create(Self); 239 | FEdit.Parent := Self; 240 | FEdit.Stored := False; 241 | FEdit.Align := TAlignLayout.Bottom; 242 | FEdit.Size.PlatformDefault := True; 243 | 244 | FEdit.OnChange := OnChangeEvent; 245 | FEdit.OnTyping := OnTypingEvent; 246 | FEdit.OnEnter := OnEnterEvent; 247 | FEdit.OnExit := OnExitEvent; 248 | FEdit.OnKeyUp := OnKeyUpEvent; 249 | FEdit.OnKeyDown := OnKeyDownEvent; 250 | FEdit.OnApplyStyleLookup := OnApplyStyleLookupText; 251 | 252 | FLabel := TLabel.Create(Self); 253 | FLabel.Parent := Self; 254 | FLabel.Stored := False; 255 | FLabel.Align := TAlignLayout.None; 256 | FLabel.Size.PlatformDefault := True; 257 | FLabel.WordWrap := False; 258 | FLabel.AutoSize := True; 259 | FLabel.HitTest := False; 260 | FLabel.StyledSettings := FLabel.StyledSettings - [TStyledSetting.Size, TStyledSetting.FontColor, 261 | TStyledSetting.Style]; 262 | FLabel.BringToFront; 263 | FLabel.OnApplyStyleLookup := OnApplyStyleLookupPrompt; 264 | 265 | HitTest := False; 266 | Stored := True; 267 | 268 | LClass := GetTextSettingsClass; 269 | // if LClass = nil then 270 | // LClass := TPromptTextSettings; 271 | 272 | FPromptUpTextSettings := LClass.Create(Self); 273 | FPromptUpTextSettings.Assign(FLabel.TextSettings); 274 | 275 | FPromptDownTextSettings := LClass.Create(Self); 276 | FPromptDownTextSettings.Assign(FLabel.TextSettings); 277 | 278 | FPromptUpStylledSettings := FLabel.StyledSettings; 279 | FPromptDownStylledSettings := FLabel.StyledSettings; 280 | 281 | Height := 2 * FEdit.Height; 282 | DoResize; 283 | FLabel.Position.Y := FEdit.Position.Y + FEdit.Height / 2 - GetHeightLabel(FLabel, FPromptUpTextSettings.Font.Style, 284 | FPromptUpTextSettings.Font.Size) / 2; 285 | end; 286 | 287 | destructor TZMaterialEdit.Destroy; 288 | begin 289 | FreeAndNil(FPromptUpTextSettings); 290 | FreeAndNil(FPromptDownTextSettings); 291 | {$IFDEF AUTOREFCOUNT} 292 | FEdit.DisposeOf; 293 | FEdit := nil; 294 | FLabel.DisposeOf; 295 | FLabel := nil; 296 | {$ELSE} 297 | FreeAndNil(FEdit); 298 | FreeAndNil(FLabel); 299 | {$ENDIF} 300 | inherited; 301 | end; 302 | 303 | procedure TZMaterialEdit.OnApplyStyleLookupPrompt(Sender: TObject); 304 | begin 305 | DoResize; 306 | end; 307 | 308 | procedure TZMaterialEdit.OnApplyStyleLookupText(Sender: TObject); 309 | begin 310 | DoResize; 311 | end; 312 | 313 | procedure TZMaterialEdit.OnChangeEvent(Sender: TObject); 314 | begin 315 | if (FEdit.Text.Trim.IsEmpty) and (not FEdit.IsFocused) then 316 | DoMyExit 317 | else 318 | DoMyEnter; 319 | 320 | if Assigned(FTextOnChangeEvent) then 321 | FTextOnChangeEvent(Sender); 322 | end; 323 | 324 | procedure TZMaterialEdit.OnTypingEvent(Sender: TObject); 325 | begin 326 | if (FEdit.Text.Trim.IsEmpty) and (not FEdit.IsFocused) then 327 | DoMyExit 328 | else 329 | DoMyEnter; 330 | 331 | if Assigned(FTextOnTypingEvent) then 332 | FTextOnTypingEvent(Sender); 333 | end; 334 | 335 | procedure TZMaterialEdit.OnEnterEvent(Sender: TObject); 336 | begin 337 | DoMyEnter; 338 | end; 339 | 340 | procedure TZMaterialEdit.OnExitEvent(Sender: TObject); 341 | begin 342 | DoMyExit; 343 | end; 344 | 345 | procedure TZMaterialEdit.OnKeyDownEvent(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); 346 | begin 347 | if Assigned(OnKeyDown) then 348 | OnKeyDown(Self, Key, KeyChar, Shift); 349 | end; 350 | 351 | procedure TZMaterialEdit.OnKeyUpEvent(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); 352 | begin 353 | if Assigned(OnKeyUp) then 354 | OnKeyUp(Self, Key, KeyChar, Shift); 355 | end; 356 | 357 | procedure TZMaterialEdit.DoMyEnter; 358 | var 359 | NewPositionY: Single; 360 | begin 361 | NewPositionY := FEdit.Position.Y - Ymargin - GetHeightLabel(FLabel, FPromptUpTextSettings.Font.Style, 362 | FPromptUpTextSettings.Font.Size); 363 | if not SameValue(FLabel.Position.Y, NewPositionY) then 364 | begin 365 | if FAnimation then 366 | TAnimator.AnimateFloatWait(FLabel, 'Position.Y', NewPositionY, 0.08) 367 | else 368 | FLabel.Position.Y := NewPositionY; 369 | FLabel.StyledSettings := FPromptUpStylledSettings; 370 | FLabel.TextSettings.Assign(FPromptUpTextSettings); 371 | end; 372 | if Assigned(OnEnter) then 373 | OnEnter(Self); 374 | end; 375 | 376 | procedure TZMaterialEdit.DoMyExit; 377 | var 378 | NewPositionY: Single; 379 | begin 380 | NewPositionY := FEdit.Position.Y + FEdit.Height / 2 - GetHeightLabel(FLabel, FPromptDownTextSettings.Font.Style, 381 | FPromptDownTextSettings.Font.Size) / 2; 382 | if (FEdit.Text.Trim.IsEmpty) and (not SameValue(FLabel.Position.Y, NewPositionY)) then 383 | begin 384 | if FAnimation then 385 | TAnimator.AnimateFloatWait(FLabel, 'Position.Y', NewPositionY, 0.08) 386 | else 387 | FLabel.Position.Y := NewPositionY; 388 | FLabel.StyledSettings := FPromptDownStylledSettings; 389 | FLabel.TextSettings.Assign(FPromptDownTextSettings); 390 | FLabel.Repaint; 391 | end; 392 | if Assigned(OnExit) then 393 | OnExit(Self); 394 | end; 395 | 396 | procedure TZMaterialEdit.DoResize; 397 | begin 398 | // Height := FEdit.Height + FLabel.Height + (Ymargin * 4); 399 | FLabel.Width := FEdit.Width; 400 | 401 | FLabel.Position.X := Xmargin + FEdit.Position.X; 402 | if not FEdit.Text.IsEmpty then 403 | begin 404 | FLabel.Position.Y := FEdit.Position.Y - Ymargin - GetHeightLabel(FLabel, FPromptUpTextSettings.Font.Style, 405 | FPromptUpTextSettings.Font.Size); 406 | FLabel.StyledSettings := FPromptUpStylledSettings; 407 | FLabel.TextSettings.Assign(FPromptUpTextSettings); 408 | end 409 | else 410 | begin 411 | FLabel.Position.Y := FEdit.Position.Y + FEdit.Height / 2 - 412 | GetHeightLabel(FLabel, FPromptDownTextSettings.Font.Style, FPromptDownTextSettings.Font.Size) / 2; 413 | FLabel.StyledSettings := FPromptDownStylledSettings; 414 | FLabel.TextSettings.Assign(FPromptDownTextSettings); 415 | end; 416 | end; 417 | 418 | function TZMaterialEdit.GetAnimation: Boolean; 419 | begin 420 | Result := FAnimation; 421 | end; 422 | 423 | function TZMaterialEdit.GetAutoTranslatePrompt: Boolean; 424 | begin 425 | Result := FLabel.AutoTranslate; 426 | end; 427 | 428 | function TZMaterialEdit.GetCheckSpelling: Boolean; 429 | begin 430 | Result := FEdit.CheckSpelling; 431 | end; 432 | 433 | function TZMaterialEdit.GetControlType: TControlType; 434 | begin 435 | Result := FEdit.ControlType; 436 | end; 437 | 438 | function TZMaterialEdit.GetDisableFocusEffect: Boolean; 439 | begin 440 | Result := FEdit.DisableFocusEffect; 441 | end; 442 | 443 | function TZMaterialEdit.GetEdit: TEdit; 444 | begin 445 | Result := FEdit; 446 | end; 447 | 448 | function TZMaterialEdit.GetFilterChar: string; 449 | begin 450 | Result := FEdit.FilterChar; 451 | end; 452 | 453 | function TZMaterialEdit.GetImeMode: TImeMode; 454 | begin 455 | Result := FEdit.ImeMode; 456 | end; 457 | 458 | function TZMaterialEdit.GetKeyboardType: TVirtualKeyboardType; 459 | begin 460 | Result := FEdit.KeyboardType; 461 | end; 462 | 463 | function TZMaterialEdit.GetKillFocusByReturn: Boolean; 464 | begin 465 | Result := FEdit.KillFocusByReturn; 466 | end; 467 | 468 | function TZMaterialEdit.GetLabel: TLabel; 469 | begin 470 | Result := FLabel; 471 | end; 472 | 473 | function TZMaterialEdit.GetMaxLength: Integer; 474 | begin 475 | Result := FEdit.MaxLength; 476 | end; 477 | 478 | function TZMaterialEdit.GetPassword: Boolean; 479 | begin 480 | Result := FEdit.Password; 481 | end; 482 | 483 | function TZMaterialEdit.GetPrompt: string; 484 | begin 485 | Result := FLabel.Text; 486 | end; 487 | 488 | function TZMaterialEdit.GetPromptSettings: TTextSettings; 489 | begin 490 | Result := FPromptDownTextSettings; 491 | end; 492 | 493 | function TZMaterialEdit.GetPromptStyledSettings: TStyledSettings; 494 | begin 495 | Result := FLabel.StyledSettings; 496 | end; 497 | 498 | function TZMaterialEdit.GetPromptUpTextSettings: TTextSettings; 499 | begin 500 | Result := FPromptUpTextSettings; 501 | end; 502 | 503 | function TZMaterialEdit.GetReadOnly: Boolean; 504 | begin 505 | Result := FEdit.ReadOnly; 506 | end; 507 | 508 | function TZMaterialEdit.GetReturnKeyType: TReturnKeyType; 509 | begin 510 | Result := FEdit.ReturnKeyType; 511 | end; 512 | 513 | function TZMaterialEdit.GetText: string; 514 | begin 515 | Result := FEdit.Text; 516 | end; 517 | 518 | function TZMaterialEdit.GetTextSettings: TTextSettings; 519 | begin 520 | Result := FEdit.TextSettings; 521 | end; 522 | 523 | function TZMaterialEdit.GetTextSettingsClass: TTextSettingsClass; 524 | begin 525 | Result := TPromptTextSettings; 526 | end; 527 | 528 | function TZMaterialEdit.GetTextStyledSettings: TStyledSettings; 529 | begin 530 | Result := FEdit.StyledSettings; 531 | end; 532 | 533 | procedure TZMaterialEdit.Resize; 534 | begin 535 | inherited; 536 | DoResize; 537 | end; 538 | 539 | procedure TZMaterialEdit.SetAnimation(const Value: Boolean); 540 | begin 541 | FAnimation := Value; 542 | end; 543 | 544 | procedure TZMaterialEdit.SetAutoTranslatePrompt(const Value: Boolean); 545 | begin 546 | FLabel.AutoTranslate := Value; 547 | end; 548 | 549 | procedure TZMaterialEdit.SetCheckSpelling(const Value: Boolean); 550 | begin 551 | FEdit.CheckSpelling := Value; 552 | end; 553 | 554 | procedure TZMaterialEdit.SetControlType(const Value: TControlType); 555 | begin 556 | FEdit.ControlType := Value; 557 | end; 558 | 559 | procedure TZMaterialEdit.SetDisableFocusEffect(const Value: Boolean); 560 | begin 561 | FEdit.DisableFocusEffect := Value; 562 | end; 563 | 564 | procedure TZMaterialEdit.SetFilterChar(const Value: string); 565 | begin 566 | FEdit.FilterChar := Value; 567 | end; 568 | 569 | procedure TZMaterialEdit.SetFocus; 570 | begin 571 | // inherited; 572 | FEdit.SetFocus; 573 | end; 574 | 575 | procedure TZMaterialEdit.SetImeMode(const Value: TImeMode); 576 | begin 577 | FEdit.ImeMode := Value; 578 | end; 579 | 580 | procedure TZMaterialEdit.SetKeyboardType(Value: TVirtualKeyboardType); 581 | begin 582 | FEdit.KeyboardType := Value; 583 | end; 584 | 585 | procedure TZMaterialEdit.SetKillFocusByReturn(const Value: Boolean); 586 | begin 587 | FEdit.KillFocusByReturn := Value; 588 | end; 589 | 590 | procedure TZMaterialEdit.SetMaxLength(const Value: Integer); 591 | begin 592 | FEdit.MaxLength := Value; 593 | end; 594 | 595 | procedure TZMaterialEdit.SetPassword(const Value: Boolean); 596 | begin 597 | FEdit.Password := Value; 598 | end; 599 | 600 | procedure TZMaterialEdit.SetPrompt(const Value: string); 601 | begin 602 | FLabel.Text := Value; 603 | end; 604 | 605 | procedure TZMaterialEdit.SetPromptSettings(const Value: TTextSettings); 606 | begin 607 | FPromptDownTextSettings.Assign(Value); 608 | FLabel.TextSettings.Assign(FPromptDownTextSettings); 609 | DoResize; 610 | end; 611 | 612 | procedure TZMaterialEdit.SetPromptStyledSettings(const Value: TStyledSettings); 613 | begin 614 | FLabel.StyledSettings := Value; 615 | FPromptDownStylledSettings := Value; 616 | end; 617 | 618 | procedure TZMaterialEdit.SetPromptUpTextSettings(const Value: TTextSettings); 619 | begin 620 | FPromptUpTextSettings.Assign(Value); 621 | end; 622 | 623 | procedure TZMaterialEdit.SetReadOnly(const Value: Boolean); 624 | begin 625 | FEdit.ReadOnly := Value; 626 | end; 627 | 628 | procedure TZMaterialEdit.SetReturnKeyType(Value: TReturnKeyType); 629 | begin 630 | FEdit.ReturnKeyType := Value; 631 | end; 632 | 633 | procedure TZMaterialEdit.SetText(const Value: string); 634 | begin 635 | FEdit.Text := Value; 636 | end; 637 | 638 | procedure TZMaterialEdit.SetTextSettings(const Value: TTextSettings); 639 | begin 640 | FEdit.TextSettings.Assign(Value); 641 | end; 642 | 643 | procedure TZMaterialEdit.SetTextStyledSettings(const Value: TStyledSettings); 644 | begin 645 | FEdit.StyledSettings := Value; 646 | end; 647 | 648 | { TPromptTextSettings } 649 | 650 | constructor TPromptTextSettings.Create(const AOwner: TPersistent); 651 | begin 652 | inherited; 653 | WordWrap := False; 654 | Trimming := TTextTrimming.Character; 655 | end; 656 | 657 | end. 658 | -------------------------------------------------------------------------------- /Library/RX10Berlin/pkgZMaterial.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {60D3F5B4-4F5E-4B62-B322-50555ECC76DA} 4 | pkgZMaterial.dpk 5 | 18.2 6 | FMX 7 | True 8 | Debug 9 | Win32 10 | 1 11 | Package 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Base 54 | true 55 | 56 | 57 | true 58 | Cfg_1 59 | true 60 | true 61 | 62 | 63 | true 64 | Base 65 | true 66 | 67 | 68 | pkgZMaterial 69 | author: ZuBy 70 | true 71 | All 72 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 73 | true 74 | .\$(Platform)\$(Config) 75 | .\$(Platform)\$(Config) 76 | false 77 | false 78 | false 79 | false 80 | false 81 | 310 82 | 83 | 84 | None 85 | android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar 86 | rtl;fmx;$(DCC_UsePackage) 87 | 88 | 89 | None 90 | rtl;fmx;$(DCC_UsePackage) 91 | 92 | 93 | None 94 | rtl;fmx;$(DCC_UsePackage) 95 | 96 | 97 | None 98 | rtl;fmx;$(DCC_UsePackage) 99 | 100 | 101 | rtl;fmx;$(DCC_UsePackage) 102 | 103 | 104 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 105 | rtl;fmx;$(DCC_UsePackage) 106 | true 107 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 108 | Debug 109 | 1033 110 | 111 | 112 | rtl;fmx;$(DCC_UsePackage) 113 | 114 | 115 | DEBUG;$(DCC_Define) 116 | true 117 | false 118 | true 119 | true 120 | true 121 | 122 | 123 | false 124 | 125 | 126 | false 127 | RELEASE;$(DCC_Define) 128 | 0 129 | 0 130 | 131 | 132 | 133 | MainSource 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | Cfg_2 145 | Base 146 | 147 | 148 | Base 149 | 150 | 151 | Cfg_1 152 | Base 153 | 154 | 155 | 156 | Delphi.Personality.12 157 | Package 158 | 159 | 160 | 161 | pkgZMaterial.dpk 162 | 163 | 164 | TMS FMX WebGMaps Designtime 165 | Microsoft Office 2000 Sample Automation Server Wrapper Components 166 | Microsoft Office XP Sample Automation Server Wrapper Components 167 | 168 | 169 | 170 | 171 | 172 | true 173 | 174 | 175 | 176 | 177 | true 178 | 179 | 180 | 181 | 182 | true 183 | 184 | 185 | 186 | 187 | true 188 | 189 | 190 | 191 | 192 | pkgZMaterial.bpl 193 | true 194 | 195 | 196 | 197 | 198 | 199 | Contents\Resources 200 | 1 201 | 202 | 203 | 204 | 205 | classes 206 | 1 207 | 208 | 209 | 210 | 211 | Contents\MacOS 212 | 0 213 | 214 | 215 | 1 216 | 217 | 218 | 219 | 220 | 1 221 | 222 | 223 | 1 224 | 225 | 226 | 1 227 | 228 | 229 | 230 | 231 | res\drawable-xxhdpi 232 | 1 233 | 234 | 235 | 236 | 237 | library\lib\mips 238 | 1 239 | 240 | 241 | 242 | 243 | 1 244 | 245 | 246 | 1 247 | 248 | 249 | 0 250 | 251 | 252 | 1 253 | 254 | 255 | 1 256 | 257 | 258 | library\lib\armeabi-v7a 259 | 1 260 | 261 | 262 | 1 263 | 264 | 265 | 266 | 267 | 0 268 | 269 | 270 | 1 271 | .framework 272 | 273 | 274 | 275 | 276 | 1 277 | 278 | 279 | 1 280 | 281 | 282 | 283 | 284 | 1 285 | 286 | 287 | 1 288 | 289 | 290 | 1 291 | 292 | 293 | 294 | 295 | 1 296 | 297 | 298 | 1 299 | 300 | 301 | 1 302 | 303 | 304 | 305 | 306 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 307 | 1 308 | 309 | 310 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 311 | 1 312 | 313 | 314 | 315 | 316 | 1 317 | 318 | 319 | 1 320 | 321 | 322 | 1 323 | 324 | 325 | 326 | 327 | 328 | library\lib\armeabi 329 | 1 330 | 331 | 332 | 333 | 334 | 0 335 | 336 | 337 | 1 338 | 339 | 340 | 1 341 | 342 | 343 | 344 | 345 | 1 346 | 347 | 348 | 1 349 | 350 | 351 | 1 352 | 353 | 354 | 355 | 356 | res\drawable-normal 357 | 1 358 | 359 | 360 | 361 | 362 | res\drawable-xhdpi 363 | 1 364 | 365 | 366 | 367 | 368 | res\drawable-large 369 | 1 370 | 371 | 372 | 373 | 374 | 1 375 | 376 | 377 | 1 378 | 379 | 380 | 1 381 | 382 | 383 | 384 | 385 | Assets 386 | 1 387 | 388 | 389 | Assets 390 | 1 391 | 392 | 393 | 394 | 395 | 396 | res\drawable-hdpi 397 | 1 398 | 399 | 400 | 401 | 402 | library\lib\armeabi-v7a 403 | 1 404 | 405 | 406 | 407 | 408 | 409 | 410 | Assets 411 | 1 412 | 413 | 414 | Assets 415 | 1 416 | 417 | 418 | 419 | 420 | 1 421 | 422 | 423 | 1 424 | 425 | 426 | 1 427 | 428 | 429 | 430 | 431 | res\values 432 | 1 433 | 434 | 435 | 436 | 437 | res\drawable-small 438 | 1 439 | 440 | 441 | 442 | 443 | res\drawable 444 | 1 445 | 446 | 447 | 448 | 449 | 1 450 | 451 | 452 | 1 453 | 454 | 455 | 1 456 | 457 | 458 | 459 | 460 | 1 461 | 462 | 463 | 464 | 465 | res\drawable 466 | 1 467 | 468 | 469 | 470 | 471 | 0 472 | 473 | 474 | 0 475 | 476 | 477 | 0 478 | 479 | 480 | 0 481 | 482 | 483 | 0 484 | 485 | 486 | 0 487 | 488 | 489 | 490 | 491 | library\lib\armeabi-v7a 492 | 1 493 | 494 | 495 | 496 | 497 | 0 498 | .bpl 499 | 500 | 501 | 1 502 | .dylib 503 | 504 | 505 | 1 506 | .dylib 507 | 508 | 509 | 1 510 | .dylib 511 | 512 | 513 | 1 514 | .dylib 515 | 516 | 517 | 518 | 519 | res\drawable-mdpi 520 | 1 521 | 522 | 523 | 524 | 525 | res\drawable-xlarge 526 | 1 527 | 528 | 529 | 530 | 531 | res\drawable-ldpi 532 | 1 533 | 534 | 535 | 536 | 537 | 0 538 | .dll;.bpl 539 | 540 | 541 | 1 542 | .dylib 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | False 556 | False 557 | False 558 | False 559 | False 560 | True 561 | False 562 | 563 | 564 | 12 565 | 566 | 567 | 568 | 569 | 570 | -------------------------------------------------------------------------------- /Library/RX10Seattle/pkgZMaterial.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {60D3F5B4-4F5E-4B62-B322-50555ECC76DA} 4 | pkgZMaterial.dpk 5 | 18.2 6 | FMX 7 | True 8 | Debug 9 | Win32 10 | 1 11 | Package 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Base 54 | true 55 | 56 | 57 | true 58 | Cfg_1 59 | true 60 | true 61 | 62 | 63 | true 64 | Base 65 | true 66 | 67 | 68 | pkgZMaterial 69 | author: ZuBy 70 | true 71 | All 72 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 73 | true 74 | .\$(Platform)\$(Config) 75 | .\$(Platform)\$(Config) 76 | false 77 | false 78 | false 79 | false 80 | false 81 | 300 82 | 83 | 84 | None 85 | android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar 86 | rtl;fmx;$(DCC_UsePackage) 87 | 88 | 89 | None 90 | rtl;fmx;$(DCC_UsePackage) 91 | 92 | 93 | None 94 | rtl;fmx;$(DCC_UsePackage) 95 | 96 | 97 | None 98 | rtl;fmx;$(DCC_UsePackage) 99 | 100 | 101 | rtl;fmx;$(DCC_UsePackage) 102 | 103 | 104 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 105 | rtl;fmx;$(DCC_UsePackage) 106 | true 107 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 108 | Debug 109 | 1033 110 | 111 | 112 | rtl;fmx;$(DCC_UsePackage) 113 | 114 | 115 | DEBUG;$(DCC_Define) 116 | true 117 | false 118 | true 119 | true 120 | true 121 | 122 | 123 | false 124 | 125 | 126 | false 127 | RELEASE;$(DCC_Define) 128 | 0 129 | 0 130 | 131 | 132 | 133 | MainSource 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | Cfg_2 145 | Base 146 | 147 | 148 | Base 149 | 150 | 151 | Cfg_1 152 | Base 153 | 154 | 155 | 156 | Delphi.Personality.12 157 | Package 158 | 159 | 160 | 161 | pkgZMaterial.dpk 162 | 163 | 164 | TMS FMX WebGMaps Designtime 165 | Microsoft Office 2000 Sample Automation Server Wrapper Components 166 | Microsoft Office XP Sample Automation Server Wrapper Components 167 | 168 | 169 | 170 | 171 | 172 | true 173 | 174 | 175 | 176 | 177 | true 178 | 179 | 180 | 181 | 182 | true 183 | 184 | 185 | 186 | 187 | true 188 | 189 | 190 | 191 | 192 | pkgZMaterial.bpl 193 | true 194 | 195 | 196 | 197 | 198 | 0 199 | .dll;.bpl 200 | 201 | 202 | 1 203 | .dylib 204 | 205 | 206 | 207 | 208 | Contents\Resources 209 | 1 210 | 211 | 212 | 213 | 214 | classes 215 | 1 216 | 217 | 218 | 219 | 220 | Contents\MacOS 221 | 0 222 | 223 | 224 | 1 225 | 226 | 227 | 228 | 229 | 1 230 | 231 | 232 | 1 233 | 234 | 235 | 1 236 | 237 | 238 | 239 | 240 | res\drawable-xxhdpi 241 | 1 242 | 243 | 244 | 245 | 246 | library\lib\mips 247 | 1 248 | 249 | 250 | 251 | 252 | 1 253 | 254 | 255 | 1 256 | 257 | 258 | 0 259 | 260 | 261 | 1 262 | 263 | 264 | 1 265 | 266 | 267 | library\lib\armeabi-v7a 268 | 1 269 | 270 | 271 | 1 272 | 273 | 274 | 275 | 276 | 0 277 | 278 | 279 | 1 280 | .framework 281 | 282 | 283 | 284 | 285 | 1 286 | 287 | 288 | 1 289 | 290 | 291 | 292 | 293 | 1 294 | 295 | 296 | 1 297 | 298 | 299 | 1 300 | 301 | 302 | 303 | 304 | 1 305 | 306 | 307 | 1 308 | 309 | 310 | 1 311 | 312 | 313 | 314 | 315 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 316 | 1 317 | 318 | 319 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 320 | 1 321 | 322 | 323 | 324 | 325 | 1 326 | 327 | 328 | 1 329 | 330 | 331 | 1 332 | 333 | 334 | 335 | 336 | 337 | library\lib\armeabi 338 | 1 339 | 340 | 341 | 342 | 343 | 0 344 | 345 | 346 | 1 347 | 348 | 349 | 1 350 | 351 | 352 | 353 | 354 | 1 355 | 356 | 357 | 1 358 | 359 | 360 | 1 361 | 362 | 363 | 364 | 365 | res\drawable-normal 366 | 1 367 | 368 | 369 | 370 | 371 | res\drawable-xhdpi 372 | 1 373 | 374 | 375 | 376 | 377 | res\drawable-large 378 | 1 379 | 380 | 381 | 382 | 383 | 1 384 | 385 | 386 | 1 387 | 388 | 389 | 1 390 | 391 | 392 | 393 | 394 | Assets 395 | 1 396 | 397 | 398 | Assets 399 | 1 400 | 401 | 402 | 403 | 404 | 405 | res\drawable-hdpi 406 | 1 407 | 408 | 409 | 410 | 411 | library\lib\armeabi-v7a 412 | 1 413 | 414 | 415 | 416 | 417 | 418 | 419 | Assets 420 | 1 421 | 422 | 423 | Assets 424 | 1 425 | 426 | 427 | 428 | 429 | 1 430 | 431 | 432 | 1 433 | 434 | 435 | 1 436 | 437 | 438 | 439 | 440 | res\values 441 | 1 442 | 443 | 444 | 445 | 446 | res\drawable-small 447 | 1 448 | 449 | 450 | 451 | 452 | res\drawable 453 | 1 454 | 455 | 456 | 457 | 458 | 1 459 | 460 | 461 | 1 462 | 463 | 464 | 1 465 | 466 | 467 | 468 | 469 | 1 470 | 471 | 472 | 473 | 474 | res\drawable 475 | 1 476 | 477 | 478 | 479 | 480 | 0 481 | 482 | 483 | 0 484 | 485 | 486 | 0 487 | 488 | 489 | 0 490 | 491 | 492 | 0 493 | 494 | 495 | 0 496 | 497 | 498 | 499 | 500 | library\lib\armeabi-v7a 501 | 1 502 | 503 | 504 | 505 | 506 | 0 507 | .bpl 508 | 509 | 510 | 1 511 | .dylib 512 | 513 | 514 | 1 515 | .dylib 516 | 517 | 518 | 1 519 | .dylib 520 | 521 | 522 | 1 523 | .dylib 524 | 525 | 526 | 527 | 528 | res\drawable-mdpi 529 | 1 530 | 531 | 532 | 533 | 534 | res\drawable-xlarge 535 | 1 536 | 537 | 538 | 539 | 540 | res\drawable-ldpi 541 | 1 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | False 556 | False 557 | False 558 | False 559 | False 560 | True 561 | False 562 | 563 | 564 | 12 565 | 566 | 567 | 568 | 569 | 570 | -------------------------------------------------------------------------------- /Library/RX10Godzilla/pkgZMaterial.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {60D3F5B4-4F5E-4B62-B322-50555ECC76DA} 4 | pkgZMaterial.dpk 5 | 18.2 6 | FMX 7 | True 8 | Debug 9 | Win32 10 | 1 11 | Package 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Base 54 | true 55 | 56 | 57 | true 58 | Cfg_1 59 | true 60 | true 61 | 62 | 63 | true 64 | Base 65 | true 66 | 67 | 68 | pkgZMaterial 69 | author: ZuBy 70 | true 71 | All 72 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 73 | true 74 | .\$(Platform)\$(Config) 75 | .\$(Platform)\$(Config) 76 | false 77 | false 78 | false 79 | false 80 | false 81 | 320 82 | 83 | 84 | None 85 | android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar 86 | rtl;fmx;$(DCC_UsePackage) 87 | 88 | 89 | None 90 | rtl;fmx;$(DCC_UsePackage) 91 | 92 | 93 | None 94 | rtl;fmx;$(DCC_UsePackage) 95 | 96 | 97 | None 98 | rtl;fmx;$(DCC_UsePackage) 99 | 100 | 101 | rtl;fmx;$(DCC_UsePackage) 102 | 103 | 104 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 105 | rtl;fmx;$(DCC_UsePackage) 106 | true 107 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 108 | Debug 109 | 1033 110 | 111 | 112 | rtl;fmx;$(DCC_UsePackage) 113 | 114 | 115 | DEBUG;$(DCC_Define) 116 | true 117 | false 118 | true 119 | true 120 | true 121 | 122 | 123 | false 124 | 125 | 126 | false 127 | RELEASE;$(DCC_Define) 128 | 0 129 | 0 130 | 131 | 132 | 133 | MainSource 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | Cfg_2 145 | Base 146 | 147 | 148 | Base 149 | 150 | 151 | Cfg_1 152 | Base 153 | 154 | 155 | 156 | Delphi.Personality.12 157 | Package 158 | 159 | 160 | 161 | pkgZMaterial.dpk 162 | 163 | 164 | TMS FMX WebGMaps Designtime 165 | Microsoft Office 2000 Sample Automation Server Wrapper Components 166 | Microsoft Office XP Sample Automation Server Wrapper Components 167 | 168 | 169 | 170 | 171 | 172 | true 173 | 174 | 175 | 176 | 177 | true 178 | 179 | 180 | 181 | 182 | true 183 | 184 | 185 | 186 | 187 | true 188 | 189 | 190 | 191 | 192 | pkgZMaterial.bpl 193 | true 194 | 195 | 196 | 197 | 198 | 0 199 | .dll;.bpl 200 | 201 | 202 | 1 203 | .dylib 204 | 205 | 206 | 207 | 208 | Contents\Resources 209 | 1 210 | 211 | 212 | 213 | 214 | classes 215 | 1 216 | 217 | 218 | 219 | 220 | Contents\MacOS 221 | 0 222 | 223 | 224 | 1 225 | 226 | 227 | 228 | 229 | 1 230 | 231 | 232 | 1 233 | 234 | 235 | 1 236 | 237 | 238 | 239 | 240 | res\drawable-xxhdpi 241 | 1 242 | 243 | 244 | 245 | 246 | library\lib\mips 247 | 1 248 | 249 | 250 | 251 | 252 | 1 253 | 254 | 255 | 1 256 | 257 | 258 | 0 259 | 260 | 261 | 1 262 | 263 | 264 | 1 265 | 266 | 267 | library\lib\armeabi-v7a 268 | 1 269 | 270 | 271 | 1 272 | 273 | 274 | 275 | 276 | 0 277 | 278 | 279 | 1 280 | .framework 281 | 282 | 283 | 284 | 285 | 1 286 | 287 | 288 | 1 289 | 290 | 291 | 292 | 293 | 1 294 | 295 | 296 | 1 297 | 298 | 299 | 1 300 | 301 | 302 | 303 | 304 | 1 305 | 306 | 307 | 1 308 | 309 | 310 | 1 311 | 312 | 313 | 314 | 315 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 316 | 1 317 | 318 | 319 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 320 | 1 321 | 322 | 323 | 324 | 325 | 1 326 | 327 | 328 | 1 329 | 330 | 331 | 1 332 | 333 | 334 | 335 | 336 | 337 | library\lib\armeabi 338 | 1 339 | 340 | 341 | 342 | 343 | 0 344 | 345 | 346 | 1 347 | 348 | 349 | 1 350 | 351 | 352 | 353 | 354 | 1 355 | 356 | 357 | 1 358 | 359 | 360 | 1 361 | 362 | 363 | 364 | 365 | res\drawable-normal 366 | 1 367 | 368 | 369 | 370 | 371 | res\drawable-xhdpi 372 | 1 373 | 374 | 375 | 376 | 377 | res\drawable-large 378 | 1 379 | 380 | 381 | 382 | 383 | 1 384 | 385 | 386 | 1 387 | 388 | 389 | 1 390 | 391 | 392 | 393 | 394 | Assets 395 | 1 396 | 397 | 398 | Assets 399 | 1 400 | 401 | 402 | 403 | 404 | 405 | res\drawable-hdpi 406 | 1 407 | 408 | 409 | 410 | 411 | library\lib\armeabi-v7a 412 | 1 413 | 414 | 415 | 416 | 417 | 418 | 419 | Assets 420 | 1 421 | 422 | 423 | Assets 424 | 1 425 | 426 | 427 | 428 | 429 | 1 430 | 431 | 432 | 1 433 | 434 | 435 | 1 436 | 437 | 438 | 439 | 440 | res\values 441 | 1 442 | 443 | 444 | 445 | 446 | res\drawable-small 447 | 1 448 | 449 | 450 | 451 | 452 | res\drawable 453 | 1 454 | 455 | 456 | 457 | 458 | 1 459 | 460 | 461 | 1 462 | 463 | 464 | 1 465 | 466 | 467 | 468 | 469 | 1 470 | 471 | 472 | 473 | 474 | res\drawable 475 | 1 476 | 477 | 478 | 479 | 480 | 0 481 | 482 | 483 | 0 484 | 485 | 486 | 0 487 | 488 | 489 | 0 490 | 491 | 492 | 0 493 | 494 | 495 | 0 496 | 497 | 498 | 499 | 500 | library\lib\armeabi-v7a 501 | 1 502 | 503 | 504 | 505 | 506 | 0 507 | .bpl 508 | 509 | 510 | 1 511 | .dylib 512 | 513 | 514 | 1 515 | .dylib 516 | 517 | 518 | 1 519 | .dylib 520 | 521 | 522 | 1 523 | .dylib 524 | 525 | 526 | 527 | 528 | res\drawable-mdpi 529 | 1 530 | 531 | 532 | 533 | 534 | res\drawable-xlarge 535 | 1 536 | 537 | 538 | 539 | 540 | res\drawable-ldpi 541 | 1 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | False 556 | False 557 | False 558 | False 559 | False 560 | True 561 | False 562 | 563 | 564 | 12 565 | 566 | 567 | 568 | 569 | 570 | -------------------------------------------------------------------------------- /Demo/MaterialActionButton/prjMaterialActionButton.deployproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 5 | 6 | 7 | 066ab2310ac64b09 8 | 9 | 10 | A8F72BBE-64E3-4724-99CA-F0ECBD1975C4 11 | 12 | 13 | 14 | 15 | 16 | 17 | prjMaterialActionButton\ 18 | prjMaterialActionButton.exe 19 | ProjectOutput 20 | 0 21 | 22 | 23 | True 24 | True 25 | 26 | 27 | 28 | 29 | prjMaterialActionButton.app\Contents\MacOS\ 30 | libcgsqlite3.dylib 31 | DependencyModule 32 | 1 33 | 34 | 35 | True 36 | 37 | 38 | prjMaterialActionButton.app\Contents\MacOS\ 39 | libcgunwind.1.0.dylib 40 | DependencyModule 41 | 1 42 | 43 | 44 | True 45 | 46 | 47 | 48 | 49 | prjMaterialActionButton\res\drawable-ldpi\ 50 | ic_launcher.png 51 | Android_LauncherIcon36 52 | 1 53 | 54 | 55 | True 56 | 57 | 58 | prjMaterialActionButton\res\drawable-hdpi\ 59 | ic_launcher.png 60 | Android_LauncherIcon72 61 | 1 62 | 63 | 64 | True 65 | 66 | 67 | prjMaterialActionButton\res\drawable-small\ 68 | splash_image.png 69 | Android_SplashImage426 70 | 1 71 | 72 | 73 | True 74 | 75 | 76 | prjMaterialActionButton\library\lib\mips\ 77 | libprjMaterialActionButton.so 78 | AndroidLibnativeMipsFile 79 | 1 80 | 81 | 82 | True 83 | 84 | 85 | prjMaterialActionButton\res\drawable\ 86 | splash_image_def.xml 87 | AndroidSplashImageDef 88 | 1 89 | 90 | 91 | True 92 | 93 | 94 | prjMaterialActionButton\ 95 | AndroidManifest.xml 96 | ProjectAndroidManifest 97 | 1 98 | 99 | 100 | True 101 | 102 | 103 | prjMaterialActionButton\res\drawable-xxhdpi\ 104 | ic_launcher.png 105 | Android_LauncherIcon144 106 | 1 107 | 108 | 109 | True 110 | 111 | 112 | prjMaterialActionButton\library\lib\armeabi\ 113 | libprjMaterialActionButton.so 114 | AndroidLibnativeArmeabiFile 115 | 1 116 | 117 | 118 | True 119 | 120 | 121 | prjMaterialActionButton\library\lib\armeabi-v7a\ 122 | libprjMaterialActionButton.so 123 | ProjectOutput 124 | 1 125 | 126 | 127 | True 128 | True 129 | 130 | 131 | prjMaterialActionButton\res\drawable-xhdpi\ 132 | ic_launcher.png 133 | Android_LauncherIcon96 134 | 1 135 | 136 | 137 | True 138 | 139 | 140 | prjMaterialActionButton\res\drawable-large\ 141 | splash_image.png 142 | Android_SplashImage640 143 | 1 144 | 145 | 146 | True 147 | 148 | 149 | prjMaterialActionButton\res\drawable-xlarge\ 150 | splash_image.png 151 | Android_SplashImage960 152 | 1 153 | 154 | 155 | True 156 | 157 | 158 | prjMaterialActionButton\res\drawable-mdpi\ 159 | ic_launcher.png 160 | Android_LauncherIcon48 161 | 1 162 | 163 | 164 | True 165 | 166 | 167 | prjMaterialActionButton\library\lib\armeabi-v7a\ 168 | gdbserver 169 | AndroidGDBServer 170 | 1 171 | 172 | 173 | True 174 | 175 | 176 | prjMaterialActionButton\classes\ 177 | classes.dex 178 | AndroidClassesDexFile 179 | 1 180 | 181 | 182 | True 183 | 184 | 185 | prjMaterialActionButton\res\values\ 186 | styles.xml 187 | AndroidSplashStyles 188 | 1 189 | 190 | 191 | True 192 | 193 | 194 | prjMaterialActionButton\res\drawable-normal\ 195 | splash_image.png 196 | Android_SplashImage470 197 | 1 198 | 199 | 200 | True 201 | 202 | 203 | 204 | 205 | prjMaterialActionButton.app\ 206 | FM_ApplicationIcon_144x144.png 207 | iPad_AppIcon144 208 | 0 209 | 210 | 211 | True 212 | 213 | 214 | prjMaterialActionButton.app\ 215 | FM_SpotlightSearchIcon_58x58.png 216 | iPhone_Spotlight58 217 | 0 218 | 219 | 220 | True 221 | 222 | 223 | prjMaterialActionButton.app\ 224 | FM_SpotlightSearchIcon_100x100.png 225 | iPad_SpotLight100 226 | 0 227 | 228 | 229 | True 230 | 231 | 232 | prjMaterialActionButton.app\ 233 | FM_SpotlightSearchIcon_40x40.png 234 | iPad_SpotLight40 235 | 0 236 | 237 | 238 | True 239 | 240 | 241 | prjMaterialActionButton.app\ 242 | FM_ApplicationIcon_60x60.png 243 | iPhone_AppIcon60 244 | 0 245 | 246 | 247 | True 248 | 249 | 250 | prjMaterialActionButton.app\ 251 | FM_ApplicationIcon_114x114.png 252 | iPhone_AppIcon114 253 | 0 254 | 255 | 256 | True 257 | 258 | 259 | prjMaterialActionButton.app\ 260 | Default-Portrait@2x.png 261 | iPad_Launch1536 262 | 1 263 | 264 | 265 | True 266 | 267 | 268 | prjMaterialActionButton.app\ 269 | FM_ApplicationIcon_152x152.png 270 | iPad_AppIcon152 271 | 0 272 | 273 | 274 | True 275 | 276 | 277 | prjMaterialActionButton.app\ 278 | Default-736h@3x.png 279 | iPhone_Launch1242 280 | 0 281 | 282 | 283 | True 284 | 285 | 286 | prjMaterialActionButton.app\ 287 | Default-667h@2x.png 288 | iPhone_Launch750 289 | 0 290 | 291 | 292 | True 293 | 294 | 295 | prjMaterialActionButton.app\ 296 | Default~ipad.png 297 | iPad_Launch768 298 | 1 299 | 300 | 301 | True 302 | 303 | 304 | prjMaterialActionButton.app\ 305 | libcgunwind.1.0.dylib 306 | DependencyModule 307 | 1 308 | 309 | 310 | True 311 | 312 | 313 | prjMaterialActionButton.app\ 314 | FM_ApplicationIcon_72x72.png 315 | iPad_AppIcon72 316 | 0 317 | 318 | 319 | True 320 | 321 | 322 | prjMaterialActionButton.app\ 323 | Default-Portrait~ipad.png 324 | iPad_Launch768x1024 325 | 0 326 | 327 | 328 | True 329 | 330 | 331 | prjMaterialActionButton.app\ 332 | Default@2x.png 333 | iPhone_Launch640 334 | 1 335 | 336 | 337 | True 338 | 339 | 340 | prjMaterialActionButton.app\ 341 | FM_SpotlightSearchIcon_40x40.png 342 | iPhone_Spotlight40 343 | 0 344 | 345 | 346 | True 347 | 348 | 349 | prjMaterialActionButton.app\ 350 | prjMaterialActionButton 351 | ProjectOutput 352 | 1 353 | 354 | 355 | True 356 | True 357 | 358 | 359 | prjMaterialActionButton.app\ 360 | prjMaterialActionButton.entitlements 361 | ProjectiOSEntitlements 362 | 0 363 | 364 | 365 | True 366 | 367 | 368 | prjMaterialActionButton.app\ 369 | Default-Landscape@2x~ipad.png 370 | iPad_Launch2048x1536 371 | 0 372 | 373 | 374 | True 375 | 376 | 377 | prjMaterialActionButton.app\ 378 | FM_ApplicationIcon_87x87.png 379 | iPhone_AppIcon87 380 | 0 381 | 382 | 383 | True 384 | 385 | 386 | prjMaterialActionButton.app\ 387 | Default-Landscape~ipad.png 388 | iPad_Launch1024x768 389 | 0 390 | 391 | 392 | True 393 | 394 | 395 | prjMaterialActionButton.app\ 396 | Default.png 397 | iPhone_Launch320 398 | 1 399 | 400 | 401 | True 402 | 403 | 404 | prjMaterialActionButton.app\ 405 | FM_ApplicationIcon_180x180.png 406 | iPhone_AppIcon180 407 | 0 408 | 409 | 410 | True 411 | 412 | 413 | prjMaterialActionButton.app\ 414 | FM_ApplicationIcon_76x76.png 415 | iPad_AppIcon76 416 | 0 417 | 418 | 419 | True 420 | 421 | 422 | prjMaterialActionButton.app\ 423 | libPCRE.dylib 424 | DependencyModule 425 | 1 426 | 427 | 428 | True 429 | 430 | 431 | prjMaterialActionButton.app\ 432 | FM_SettingIcon_58x58.png 433 | iPad_Setting58 434 | 0 435 | 436 | 437 | True 438 | 439 | 440 | prjMaterialActionButton.app\ 441 | FM_SpotlightSearchIcon_80x80.png 442 | iPhone_Spotlight80 443 | 0 444 | 445 | 446 | True 447 | 448 | 449 | prjMaterialActionButton.app\ 450 | FM_SpotlightSearchIcon_80x80.png 451 | iPad_SpotLight80 452 | 0 453 | 454 | 455 | True 456 | 457 | 458 | prjMaterialActionButton.app\ 459 | Default-Portrait@2x~ipad.png 460 | iPad_Launch1536x2048 461 | 0 462 | 463 | 464 | True 465 | 466 | 467 | prjMaterialActionButton.app\ 468 | Default-Landscape-736h@3x.png 469 | iPhone_Launch2208 470 | 0 471 | 472 | 473 | True 474 | 475 | 476 | prjMaterialActionButton.app\ 477 | FM_ApplicationIcon_120x120.png 478 | iPhone_AppIcon120 479 | 0 480 | 481 | 482 | True 483 | 484 | 485 | prjMaterialActionButton.app\ 486 | Info.plist 487 | ProjectiOSInfoPList 488 | 1 489 | 490 | 491 | True 492 | 493 | 494 | prjMaterialActionButton.app\ 495 | FM_ApplicationIcon_57x57.png 496 | iPhone_AppIcon57 497 | 0 498 | 499 | 500 | True 501 | 502 | 503 | prjMaterialActionButton.app\ 504 | Default-Landscape@2x.png 505 | iPad_Launch2048 506 | 1 507 | 508 | 509 | True 510 | 511 | 512 | prjMaterialActionButton.app\ 513 | FM_SpotlightSearchIcon_50x50.png 514 | iPad_SpotLight50 515 | 0 516 | 517 | 518 | True 519 | 520 | 521 | prjMaterialActionButton.app\ 522 | Default-568h@2x.png 523 | iPhone_Launch640x1136 524 | 1 525 | 526 | 527 | True 528 | 529 | 530 | prjMaterialActionButton.app\ 531 | FM_SpotlightSearchIcon_29x29.png 532 | iPhone_Spotlight29 533 | 0 534 | 535 | 536 | True 537 | 538 | 539 | prjMaterialActionButton.app\ 540 | FM_SettingIcon_29x29.png 541 | iPad_Setting29 542 | 0 543 | 544 | 545 | True 546 | 547 | 548 | prjMaterialActionButton.app\ 549 | Default-Landscape.png 550 | iPad_Launch1024 551 | 1 552 | 553 | 554 | True 555 | 556 | 557 | 558 | --------------------------------------------------------------------------------