package Ġcom . hy b . gu il lot ine . Animation Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Object Animator Ċ import Ġandroid . animation . Time Interpolator Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . View Tree Observer Ċ import Ġcom . hy b . gu il lot ine . Interpolator . Gu il lot ine Interpolator Ċ import Ġcom . hy b . gu il lot ine .` interface `. Gu il lot ine Listener Ċ Ċ /** Ċ Ġ* Ġ ç±» æııè¿° ï¼ļ Gu il lot ine View Ċ Ġ* ĠåĪĽå»º äºº ï¼ļ hu ang ya ob in Ċ Ġ* ĠåĪĽå»º æĹ¶éĹ´ ï¼ļ 2 0 1 9 / 5 / 6 Ċ Ġ* Ġä¿®æĶ¹ äºº ï¼ļ Ċ Ġ* Ġä¿®æĶ¹ æĹ¶éĹ´ ï¼ļ Ċ Ġ* Ġä¿®æĶ¹ å¤ĩ æ³¨ ï¼ļ Ċ Ġ*/ Ċ class ĠGu il lot ine View ( m Builder : Gu il lot ine Builder ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠROT ATION Ġ= Ġ" rotation " ĊĠĠĠ Ġprivate Ġval ĠGU ILL OT INE _ CLOSED _ ANGLE _ RIGHT _ TO _ LEFT Ġ= Ġ- 1 8 0 f ĊĠĠĠ Ġprivate Ġval ĠGU ILL OT INE _ CLOSED _ ANGLE _ LEFT _ TO _ RIGHT Ġ= Ġ 1 8 0 f ĊĠĠĠ Ġprivate Ġval ĠGU ILL OT INE _ OPEN ED _ ANGLE Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar ĠDEFAULT _ DURATION Ġ= Ġ 6 2 5 ĊĊĠĠĠ Ġprivate Ġvar Ġm Gu il lot ine View : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Duration : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Opening Animation : ĠObject Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Closing Animation : ĠObject Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Listener : ĠGu il lot ine Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Interpolator : ĠTime Interpolator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Delay : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġis Opening : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Closing : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Left Btn : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Right Btn : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġclose Angle : ĠFloat Ġ= Ġ 0 f ĊĊĊĠĠĠ Ġprivate Ġvar Ġm Builder : ĠGu il lot ine Builder ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Builder Ġ= Ġm Builder ĊĠĠĠĠĠĠĠ Ġthis . m Gu il lot ine View Ġ= Ġm Builder . gu il lot ine View ĊĠĠĠĠĠĠĠ Ġthis . m Duration Ġ= Ġif ( m Builder . duration Ġ> Ġ 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Builder . duration ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ DURATION . to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . m Listener Ġ= Ġm Builder . gu il lot ine Listener ĊĠĠĠĠĠĠĠ Ġthis . m Delay Ġ= Ġm Builder . start Delay ĊĠĠĠĠĠĠĠ Ġthis . m Interpolator Ġ= Ġif ( m Builder . interpol ator Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGu il lot ine Interpolator () ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Builder . interpol ator ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . is Left Btn Ġ= Ġm Builder . is Left Btn ĊĠĠĠĠĠĠĠ Ġthis . is Right Btn Ġ= Ġm Builder . is Right Btn ĊĊĠĠĠĠĠĠĠ Ġclose Angle Ġ= Ġwhen ( is Left Btn ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue -> GU ILL OT INE _ CLOSED _ ANGLE _ RIGHT _ TO _ LEFT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse -> GU ILL OT INE _ CLOSED _ ANGLE _ LEFT _ TO _ RIGHT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Gu il lot ine View To Root View () ĊĊĠĠĠĠĠĠĠ Ġset Animation Pivot ( m Builder . opening View ) ĊĠĠĠĠĠĠĠ Ġthis . m Opening Animation Ġ= Ġbuild Opening Animation () ĊĠĠĠĠĠĠĠ Ġthis . m Closing Animation Ġ= Ġbuild Closing Animation () ĊĊĠĠĠĠĠĠĠ Ġm Builder . opening View ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Builder . closing View ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( m Builder . is Closed On Start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. rotation Ġ= Ġclose Angle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Gu il lot ine View To Root View (){ ĊĠĠĠĠĠĠĠ Ġval Ġro o View Ġ= Ġ(( m Builder ?. mContext Ġas ĠActivity ). findViewById < View >( android . R . id . content ) Ġas ĠViewGroup ). getChild At ( 0 ) Ġas ĠViewGroup ĊĠĠĠĠĠĠĠ Ġro o View . addView ( m Builder ?. gu il lot ine View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen (){ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isOpen ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Opening Animation ?. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose (){ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Closing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Closing Animation ?. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Object Animator Binding ") ĊĠĠĠ Ġprivate Ġfun Ġbuild Opening Animation (): ĠObject Animator Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrotation Animator Ġ= Ġinit Animator ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObject Animator . of Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠROT ATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Angle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGU ILL OT INE _ OPEN ED _ ANGLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrotation Animator . interpol ator Ġ= Ġm Interpolator ĊĠĠĠĠĠĠĠ Ġrotation Animator . duration Ġ= Ġm Duration ĊĠĠĠĠĠĠĠ Ġrotation Animator . addListener ( object Ġ: ĠAn imator . Animator Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Opening Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Opening Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener ?. on Gu il lot ine Opened () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( animation : ĠAn imator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠAn imator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġrotation Animator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Object Animator Binding ") ĊĠĠĠ Ġprivate Ġfun Ġbuild Closing Animation (): ĠObject Animator Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrotation Animator Ġ= Ġinit Animator ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObject Animator . of Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠROT ATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGU ILL OT INE _ OPEN ED _ ANGLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Angle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrotation Animator . duration Ġ= Ġ( m Duration Ġ* ĠGu il lot ine Interpolator . ROT ATION _ TIME ). to Long () ĊĠĠĠĠĠĠĠ Ġrotation Animator . addListener ( object Ġ: ĠAn imator . Animator Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Closing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Closing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener ?. on Gu il lot ine Closed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( animation : ĠAn imator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠAn imator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġrotation Animator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Animator ( anim ator : ĠObject Animator ): ĠObject Animator Ġ{ ĊĠĠĠĠĠĠĠ Ġanim ator . start Delay Ġ= Ġm Delay ĊĠĠĠĠĠĠĠ Ġreturn Ġanim ator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Pivot Y ( bur ger : ĠView ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( bur ger . top Ġ+ Ġbur ger . height Ġ/ Ġ 2 ). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Pivot X ( bur ger : ĠView ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( bur ger . left Ġ+ Ġbur ger . width Ġ/ Ġ 2 ). toFloat () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġset Animation Pivot ( open View : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. view Tree Observer ?. add On Global Layout Listener ( object Ġ: ĠView Tree Observer . On Global Layout Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Global Layout () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. view Tree Observer ?. remove On Global Layout Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. view Tree Observer ?. remove Global On Layout Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. pivot X Ġ= Ġcalculate Pivot X ( open View !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Gu il lot ine View ?. pivot Y Ġ= Ġcalculate Pivot Y ( open View !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å·¥ åİĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠGu il lot ine Builder ( context : ĠContext ){ ĊĠĠĠĠĠĠĠ Ġvar ĠmContext : ĠContext ? Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġvar Ġgu il lot ine View : ĠView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġopening View : ĠView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġclosing View : ĠView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġgu il lot ine Listener : ĠGu il lot ine Listener ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġduration : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġstart Delay : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġinterpol ator : ĠTime Interpolator ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġis Closed On Start : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġis Left Btn Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġis Right Btn Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Gu il lot ine View ( gu il lot ine View : ĠView ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . gu il lot ine View Ġ= Ġgu il lot ine View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġset Close Item View ( closing View : ĠView ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . closing View Ġ= Ġclosing View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Open Item View ( opening View : ĠView ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . opening View Ġ= Ġopening View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Gu il lot ine Listener ( gu il lot ine Listener : ĠGu il lot ine Listener ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . gu il lot ine Listener Ġ= Ġgu il lot ine Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Duration ( duration : ĠLong ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . duration Ġ= Ġduration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Start Delay ( start Delay : ĠLong ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . start Delay Ġ= Ġstart Delay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠsetIs Left Btn ( is Left Btn : ĠBoolean ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Left Btn Ġ= Ġis Left Btn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠsetIs Right Btn ( is Right Btn : ĠBoolean ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Right Btn Ġ= Ġis Right Btn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Interpolator ( interpol ator : ĠTime Interpolator ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . interpol ator Ġ= Ġinterpol ator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Closed On Start ( is Closed On Start : ĠBoolean ): ĠGu il lot ine Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Closed On Start Ġ= Ġis Closed On Start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠGu il lot ine View Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGu il lot ine View ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }