package Ġcom . tun jid . android x . view . anim ator ĊĊ Ċ import Ġandroid . content . Context . WINDOW _ SERVICE Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . view . View Ċ import Ġandroid . view . WindowManager Ċ import Ġandroidx . annotation . Int Def Ċ import Ġandroidx . core . view . do On Pre Draw Ċ import Ġandroidx . dynamic animation . animation . Spring Animation Ċ import Ġandroidx . dynamic animation . animation . Spring Force Ċ import Ġcom . tun jid . android x . view . util . spring Ċ import Ġcom . tun jid . android x . view . util . with One Shot End Listener Ċ Ċ /** Ċ Ġ* ĠTrans lates Ġa Ġview Ġoff screen , Ġuseful Ġfor Ġadding Ġthe Ġquick Ġreturn Ġpattern Ġto Ġa Ġview . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠCreated Ġby Ġtj . da hun si Ġon Ġ 2 / 1 9 / 1 6 . Ċ Ġ*/ Ċ class ĠView H ider < T Ġ: ĠView > Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġview : ĠT , ĊĠĠĠ Ġprivate Ġval Ġlistener : ĠListener , ĊĠĠĠ Ġ@ param : Hide Direction Ġ@ field : Hide Direction ĊĠĠĠ Ġprivate Ġval Ġdirection : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġoptions : ĠSpring Animation . () Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġis Visible Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġstart Action : Ġ() Ġ-> ĠUnit Ġ= Ġ{ Ġif Ġ( isVisible ) Ġview . visibility Ġ= ĠView . VISIBLE Ġ} ĊĠĠĠ Ġprivate Ġval Ġend Action : Ġ() Ġ-> ĠUnit Ġ= Ġ{ Ġif Ġ(! isVisible ) Ġview . visibility Ġ= ĠView . GONE Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġspring : ĠSpring Animation ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġview . spring ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( direction Ġ== ĠLEFT Ġ|| Ġdirection Ġ== ĠRIGHT ) ĠSpring Animation . TRANSL ATION _ X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠSpring Animation . TRANSL ATION _ Y ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠThese Ġcalculations Ġdon 't Ġtake Ġthe Ġstatus Ġbar Ġinto Ġaccount , Ġunlikely Ġto Ġmatter Ġhowever ĊĠĠĠ Ġprivate Ġval Ġdisplacement : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isVisible ) Ġreturn Ġ 0 F ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= ĠInt Array ( 2 ). apply Ġ{ Ġview . getLocation In Window ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisplay Size Ġ= ĠPoint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( view . context . getSystem Service ( WINDOW _ SERVICE ) Ġas ? ĠWindow Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . default Display ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . getSize ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT Ġ-> Ġ-( location [ 0 ] Ġ+ Ġview . width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTOP Ġ-> Ġ-( location [ 1 ] Ġ+ Ġview . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT Ġ-> Ġdisplay Size . x Ġ- Ġlocation [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBOTTOM Ġ-> Ġdisplay Size . y Ġ- Ġlocation [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġdirection ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Retention ( Annotation Retention . SOURCE ) ĊĠĠĠ Ġ@ Int Def ( LEFT , ĠTOP , ĠRIGHT , ĠBOTTOM ) ĊĠĠĠ Ġannotation Ġclass ĠHide Direction ĊĊĠĠĠ Ġfun Ġshow () Ġ= Ġtoggle ( true ) ĊĊĠĠĠ Ġfun Ġhide () Ġ= Ġtoggle ( false ) ĊĊĠĠĠ Ġfun Ġconfigure ( options : ĠSpring Force . () Ġ-> ĠUnit ) Ġ= Ġoptions . invoke ( spring . spring ) ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle ( visible : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . isVisible Ġ== Ġvisible ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠView Ġhasn 't Ġbeen Ġla id Ġout Ġyet Ġand Ġhas Ġit 's Ġobserver Ġattached ĊĠĠĠĠĠĠĠ Ġif Ġ(! view . is La id Out ) Ġreturn Ġview . do On Pre Draw Ġ{ Ġtoggle ( visible ) Ġ}. let Ġ{ ĠUnit Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . isVisible Ġ= Ġvisible ĊĊĠĠĠĠĠĠĠ Ġspring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . invoke ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( run nable Ġin Ġlistener . start Actions ) Ġrunnable . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with One Shot End Listener Ġ{ Ġfor Ġ( run nable Ġin Ġlistener . end Actions ) Ġrunnable . invoke () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. animate To Final Position ( dis placement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder < T Ġ: ĠView > Ġinternal Ġconstructor ( private Ġval Ġview : ĠT ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Hide Direction ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġdirection Ġ= ĠBOTTOM ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġoptions : ĠSpring Animation . () Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlistener Ġ= ĠListener () ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Direction (@ Hide Direction Ġdirection : ĠInt ): ĠBuilder < T > Ġ= Ġapply Ġ{ Ġthis . direction Ġ= Ġdirection Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Options ( options : ĠSpring Animation . () Ġ-> ĠUnit ): ĠBuilder < T > Ġ= Ġapply Ġ{ Ġthis . options Ġ= Ġoptions Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Start Action ( action : Ġ() Ġ-> ĠUnit ): ĠBuilder < T > Ġ= Ġapply Ġ{ Ġlistener . start Actions . add ( action ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd End Action ( action : Ġ() Ġ-> ĠUnit ): ĠBuilder < T > Ġ= Ġapply Ġ{ Ġlistener . end Actions . add ( action ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠView H ider < T > Ġ= ĠView H ider ( view , Ġlistener , Ġdirection , Ġoptions ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . start Actions . add ( 0 , Ġstart Action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . end Actions . add ( 0 , Ġend Action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠListener Ġinternal Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Actions Ġ= Ġmutable ListOf < () Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġval Ġend Actions Ġ= Ġmutable ListOf < () Ġ-> ĠUnit >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLEFT Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTOP Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRIGHT Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBOTTOM Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠView > Ġof ( view : ĠT ): ĠBuilder < T > Ġ= ĠBuilder ( view ) ĊĠĠĠ Ġ} Ċ }