package Ġio . nac ular . do od le . theme . material Ċ Ċ import Ġio . nac ular . do od le . animation . Animation Ċ import Ġio . nac ular . do od le . animation . Animator Ċ import Ġio . nac ular . do od le . animation . Animator . Listener Ċ import Ġio . nac ular . do od le . animation . fixed Time Linear Ċ import Ġio . nac ular . do od le . animation . speed Up Slow Down Ċ import Ġio . nac ular . do od le . controls . buttons . Button Ċ import Ġio . nac ular . do od le . controls . buttons . Button Model Ċ import Ġio . nac ular . do od le . controls . theme . Common Text Button Behavior Ċ import Ġio . nac ular . do od le . core . View Ċ import Ġio . nac ular . do od le . drawing . Canvas Ċ import Ġio . nac ular . do od le . drawing . Color Ċ import Ġio . nac ular . do od le . drawing . Color . Companion . Black Ċ import Ġio . nac ular . do od le . drawing . Color . Companion . White Ċ import Ġio . nac ular . do od le . drawing . Color Fill Ċ import Ġio . nac ular . do od le . drawing . Font . Companion . Th ick Ċ import Ġio . nac ular . do od le . drawing . Font Detector Ċ import Ġio . nac ular . do od le . drawing . Text Metrics Ċ import Ġio . nac ular . do od le . drawing . opacity Ċ import Ġio . nac ular . do od le . event . Pointer Event Ċ import Ġio . nac ular . do od le . event . Pointer Listener Ċ import Ġio . nac ular . do od le . geometry . Circle Ċ import Ġio . nac ular . do od le . geometry . Point Ċ import Ġio . nac ular . do od le . layout . Insets Ċ import Ġio . nac ular . meas ured . units . Time . Companion . milliseconds Ċ import Ġio . nac ular . meas ured . units . times Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠN ich olas ĠE ddy Ġon Ġ 1 2 / 1 0 / 1 9 . Ċ Ġ*/ Ċ fun Ġdraw R ipple ( on : ĠCanvas , Ġat : ĠPoint , Ġopacity : ĠFloat , Ġprogress : ĠFloat ) Ġ{ ĊĠĠĠ Ġval Ġx Ġ= Ġmax ( at . x , Ġon . size . width Ġ Ġ- Ġat . x ) ĊĠĠĠ Ġval Ġy Ġ= Ġmax ( at . y , Ġon . size . height Ġ- Ġat . y ) ĊĊĠĠĠ Ġval Ġmax Radius Ġ= Ġsqrt ( x . pow ( 2 ) Ġ+ Ġy . pow ( 2 )) ĊĊĠĠĠ Ġon . circle ( Circle ( radius Ġ= Ġmax Radius Ġ* Ġprogress , Ġcenter Ġ= Ġat ), ĠColor Fill ( White Ġopacity Ġopacity )) Ċ } Ċ Ċ class ĠMaterial Button Behavior ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Metrics ĠĠĠ Ġ: ĠText Metrics , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġanimate ĠĠĠĠĠĠĠ Ġ: ĠAn imator , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfont Detector ĠĠ Ġ: ĠFont Detector , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠtextColor ĠĠĠĠĠ Ġ: ĠColor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠbackgroundColor : ĠColor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcorner Radius ĠĠ Ġ: ĠDouble Ġ= Ġ 0 . 0 ): ĠCommon Text Button Behavior < Button >( text Metrics ), ĠPointer Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġfont Load Job ĠĠĠĠĠĠĠĠĠ Ġ= Ġnull Ġas ĠJob ?; Ġset ( new ) Ġ{ Ġfield ?. cancel (); Ġfield Ġ= Ġnew Ġ} ĊĠĠĠ Ġprivate Ġvar Ġshadow 1 Blur ĠĠĠĠĠĠĠĠĠ Ġ= Ġ 1 . 0 ĊĠĠĠ Ġprivate Ġvar Ġri pple Opacity ĠĠĠĠĠĠĠ Ġ= Ġ 0 . 2 4 f ĊĠĠĠ Ġprivate Ġvar Ġri pple Progress ĠĠĠĠĠĠ Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġoverlay Opacity ĠĠĠĠĠĠ Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġanimation Listener ĠĠĠ Ġ= Ġnull Ġas ĠListener ? ĊĠĠĠ Ġprivate Ġvar Ġpointer Pressed ĠĠĠĠĠĠ Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġpointer Press Location Ġ= Ġnull Ġas ĠPoint ? ĊĊĠĠĠ Ġprivate Ġvar Ġshadow Animation Ġ Ġ= Ġnull Ġas ĠAnimation ?; ĠĠ Ġset ( new ) Ġ{ Ġfield ?. cancel (); Ġfield Ġ= Ġnew Ġ} ĊĠĠĠ Ġprivate Ġvar Ġri pple Animation Ġ Ġ= Ġnull Ġas ĠAnimation ?; ĠĠ Ġset ( new ) Ġ{ Ġfield ?. cancel (); Ġfield Ġ= Ġnew Ġ} ĊĠĠĠ Ġprivate Ġvar Ġoverlay Animation Ġ= Ġnull Ġas ĠAnimation ?; ĠĠ Ġset ( new ) Ġ{ Ġfield ?. cancel (); Ġfield Ġ= Ġnew Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhover Animation Time Ġ= Ġ 1 8 0 Ġ* Ġmilliseconds ĊĠĠĠ Ġprivate Ġval Ġpress Animation Time Ġ= Ġhover Animation Time Ġ/ Ġ 2 ĊĊĠĠĠ Ġprivate Ġval Ġstyle Changed : Ġ( View ) Ġ-> ĠUnit Ġ= Ġ Ġ{ Ġit . rer ender () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpointer Over Changed : Ġ( Button Model , ĠBoolean , ĠBoolean ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, _, new Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġoverlay End ĠĠĠĠ Ġ= Ġif Ġ( new ) Ġ 0 . 2 f Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġshadow 1 Blur End Ġ= Ġif Ġ( new ) Ġ 4 . 0 Ġ Ġelse Ġ 1 . 0 ĊĊĠĠĠĠĠĠĠ Ġshadow Animation Ġ Ġ= Ġ( animate Ġ( shadow 1 Blur ĠĠĠ Ġto Ġshadow 1 Blur End ) Ġusing Ġspeed Up Slow Down ( hover Animation Time )) Ġ{ Ġshadow 1 Blur ĠĠĠ Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġoverlay Animation Ġ= Ġ( animate Ġ( overlay Opacity Ġto Ġoverlay End ĠĠĠ Ġ) Ġusing Ġfixed Time Linear ( hover Animation Time )) Ġ{ Ġoverlay Opacity Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclip Canvas To Bounds ( view : ĠButton ) Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġinstall ( view : ĠButton ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . install ( view ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠCentral ize ĊĠĠĠĠĠĠĠ Ġfont Load Job Ġ= ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . font Ġ= Ġfont Detector Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfamily Ġ= Ġ" Roboto " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize ĠĠ Ġ= Ġ 1 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweight Ġ= ĠTh ick ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . pointer Changed ĠĠĠĠĠĠĠĠĠĠ Ġ+= Ġthis ĊĠĠĠĠĠĠĠ Ġview . style Changed ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+= Ġstyle Changed ĊĠĠĠĠĠĠĠ Ġview . model . pointer Over Changed Ġ+= Ġpointer Over Changed ĊĊĠĠĠĠĠĠĠ Ġanimation Listener ?. let Ġ{ Ġanimate . listeners Ġ-= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġanimate . listeners Ġ+= Ġobject : ĠListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchanged ( anim ator : ĠAn imator , Ġanimations : ĠSet < Animation >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . rer ender Now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompleted ( anim ator : ĠAn imator , Ġanimations : ĠSet < Animation >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ripple Animation Ġin Ġanimations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . rer ender Now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġanimation Listener Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġuninstall ( view : ĠButton ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . uninstall ( view ) ĊĊĠĠĠĠĠĠĠ Ġfont Load Job ?. cancel () ĊĊĠĠĠĠĠĠĠ Ġview . pointer Changed ĠĠĠĠĠĠĠĠĠĠ Ġ-= Ġthis ĊĠĠĠĠĠĠĠ Ġview . style Changed ĠĠĠĠĠĠĠĠĠĠ Ġ-= Ġstyle Changed ĊĠĠĠĠĠĠĠ Ġview . model . pointer Over Changed Ġ-= Ġpointer Over Changed ĊĊĠĠĠĠĠĠĠ Ġanimation Listener ?. let Ġ{ Ġanimate . listeners Ġ-= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpressed ( event : ĠPointer Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper < Common Text Button Behavior >. pressed ( event ) ĊĊĠĠĠĠĠĠĠ Ġpointer Pressed ĠĠĠĠĠĠ Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpointer Press Location Ġ= Ġevent . location ĊĊĠĠĠĠĠĠĠ Ġri pple Animation Ġ= Ġ( animate Ġ( 0 . 4 f Ġto Ġ 1 f ) Ġusing Ġfixed Time Linear ( press Animation Time )) Ġ{ Ġri pple Progress Ġ= Ġit Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Ġ+= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! pointer Pressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfade R ipple () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġri pple Animation Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshadow Animation Ġ= Ġ( animate Ġ( shadow 1 Blur Ġto Ġ 1 0 . 0 ) Ġusing Ġspeed Up Slow Down ( press Animation Time )) Ġ{ Ġshadow 1 Blur Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreleased ( event : ĠPointer Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper < Common Text Button Behavior >. released ( event ) ĊĊĠĠĠĠĠĠĠ Ġpointer Pressed Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ripple Animation Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfade R ipple () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġshadow Animation Ġ= Ġ( animate Ġ( shadow 1 Blur Ġto Ġ 4 . 0 ) Ġusing Ġspeed Up Slow Down ( press Animation Time )) Ġ{ Ġshadow 1 Blur Ġ= Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( view : ĠButton , Ġcanvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġview . bounds . at Origin ĊĊĠĠĠĠĠĠĠ Ġcanvas . outer Shadow ( color Ġ= ĠBlack Ġopacity Ġ 0 . 2 f , Ġhorizontal Ġ= Ġ 0 . 0 , Ġvertical Ġ= Ġshadow 1 Blur , Ġblur Radius Ġ= Ġshadow 1 Blur ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . rect ( bounds . in set ( Insets ( left Ġ= Ġ 2 . 0 , Ġright Ġ= Ġ 3 . 0 )), Ġradius Ġ= Ġcorner Radius , Ġfill Ġ= ĠColor Fill ( backgroundColor )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcanvas . outer Shadow ( color Ġ= ĠBlack Ġopacity Ġ 0 . 2 2 f , Ġhorizontal Ġ= Ġ 0 . 0 , Ġvertical Ġ= Ġ 2 . 0 , Ġblur Radius Ġ= Ġ 2 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . outer Shadow ( color Ġ= ĠBlack Ġopacity Ġ 0 . 2 f , Ġvertical Ġ= Ġ 1 . 0 , Ġblur Radius Ġ= Ġ 5 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . rect ( bounds , Ġcorner Radius , ĠColor Fill ( backgroundColor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġview . text . toUpperCase () ĊĊĠĠĠĠĠĠĠ Ġcanvas . clip ( bounds , Ġcorner Radius ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . text ( text , Ġview . font , Ġtext Position ( view , Ġtext , Ġbounds Ġ= Ġbounds ), ĠColor Fill ( textColor )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . rect ( bounds , Ġcorner Radius , ĠColor Fill ( White Ġopacity Ġoverlay Opacity )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Press Location ?. let Ġ{ Ġdraw R ipple ( canvas , Ġit , Ġri pple Opacity , Ġri pple Progress ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfade R ipple () Ġ{ ĊĠĠĠĠĠĠĠ Ġri pple Animation Ġ= Ġ( animate ( 0 . 2 4 f Ġto Ġ 0 f ) Ġusing Ġfixed Time Linear ( press Animation Time Ġ* Ġ 2 )) Ġ{ Ġri pple Opacity Ġ= Ġit Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Ġ+= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! pointer Pressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Press Location Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġri pple Opacity ĠĠ Ġ= Ġ 0 . 2 4 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġri pple Animation Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }