package Ġjp . co . ks ro gers . animations witch ing bottomnavigation Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . animation . Argb Evaluator Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . core . view . children Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . Animation Switch ing Bottom Navigation Layout . Selected Button Size . NORMAL Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . Animation Switch ing Bottom Navigation Layout . Selected Button Size . SMALL Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . add Update Lister Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . anim ator Alpha Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . anim ator X Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . play Se quent ially Ext Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . play To gether Ext Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . set Duration Ext Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . set Evaluator Ext Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . setInt Values Ext Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . set Listener Ċ import Ġjp . co . ks ro gers . animations witch ing bottomnavigation . ext . set Start Delay Ext Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠA ĠLayout Ġto Ġprovide Ġbottom Ġnavigation Ġw / Ġanimation - able Ġbutton Ġand Ġmenu Ġitems . Ċ Ġ* Ċ Ġ* ĠThis Ġlayout Ġhas Ġseveral Ġviews . Ċ Ġ* Ġ Ġ- Ġ[ Animation Switch ing Bottom Navigation View ] Ċ Ġ* Ġ Ġ- Ġ[ Animation Switch ing Bottom Navigation Selected Button ] Ċ Ġ* ĠĠĠ Ġ- ĠIf Ġyou Ġwant Ġto Ġcustomize Ġbutton , Ġyou Ġcan Ġuse Ġ[ Animation Switch ing Bottom Navigation SelectedItem Layout ] Ċ Ġ* Ċ Ġ*/ Ċ class ĠAnimation Switch ing Bottom Navigation Layout Ġ@ Jvm Over loads Ġconstructor ( ĊĠ Ġcontext : ĠContext , ĊĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull Ċ ) Ġ: ĠFrame Layout ( context , Ġattrs ) Ġ{ ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠEnum Ġclass Ġfor Ġspecify Ġsize Ġof Ġ[ Animation Switch ing Bottom Navigation Selected Button ] Ġor Ġ[ Animation Switch ing Bottom Navigation SelectedItem Layout ] Ġfrom Ġlayout ĠXML . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ< p > ĠFor Ġuse Ġin Ġlayout ĠXML Ġonly . ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġinternal Ġenum Ġclass ĠSelected Button Size Ġ{ ĊĠĠĠ ĠNORMAL , ĊĠĠĠ ĠSMALL ; ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠ Ġfun Ġfrom Index ( index : ĠInt ): ĠSelected Button Size Ġ= Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> ĠNORMAL ĊĠĠĠĠĠĠĠĠ 1 Ġ-> ĠSMALL ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unexpected Ġattribute : Ġselected Button Size =$ index ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠData Ġclass Ġfor Ġset Ġnavigation Ġmenu Ġitem Ġfrom Ġoutside . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġid ĠAn Ġid Ġof Ġmenu Ġitem . ĊĠĠ Ġ* Ġ@ param Ġicon Drawable Res ĠA Ġresource Ġid Ġof Ġmenu Ġitem Ġicon . ĊĠĠ Ġ* Ġ@ param Ġselected BackgroundColor ĠA Ġsingle Ġcolor Ġvalue Ġin Ġthe Ġform Ġ 0 xA ARR G GB B . ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġdata Ġclass ĠNavigation MenuItem ( ĊĠĠĠ Ġval Ġid : ĠInt , ĊĠĠĠ Ġ@ Drawable Res Ġval Ġicon Drawable Res : ĠInt , ĊĠĠĠ Ġval Ġselected BackgroundColor : ĠInt ĊĠ Ġ) ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠMAX _ CHILD _ COUNT Ġ= Ġ 3 ĊĠĠĠ Ġconst Ġval ĠSL IDE _ ANIM ATION _ DURATION Ġ= Ġ 3 0 0 L ĊĠĠĠ Ġconst Ġval ĠSL IDE _ ANIM ATION _ START _ DELAY Ġ= Ġ 5 L ĊĠĠĠ Ġconst Ġval ĠFA DE _ ANIM ATION _ DURATION Ġ= Ġ 1 0 0 L ĊĠĠĠ Ġconst Ġval ĠFA DE _ ANIM ATION _ START _ DELAY Ġ= Ġ 1 5 0 L ĊĠ Ġ} ĊĊĠ Ġ// ĠListener Ġthat Ġcalled Ġwhen Ġevent Ġfired Ġby Ġ[ Animation Switch ing Bottom Navigation View ] ĊĠ Ġprivate Ġval Ġon Navigation ClickListener Ġ= ĊĠĠĠ Ġobject Ġ: ĠAnimation Switch ing Bottom Navigation View . On Navigation ClickListener Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( navigation Item Item : ĠNavigation MenuItem , Ġnew Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Item Position Ġ== Ġnew Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġon Navigation MenuItem Re selected Listener ?. on Navigation Item Re selected ( items [ selected Item Position ]) ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġanimate To Selected Position ( new Position ) ĊĊĠĠĠĠĠĠĠ Ġselected Item Position Ġ= Ġnew Position ĊĊĠĠĠĠĠĠĠ Ġon Navigation MenuItem Selected Listeners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . on Navigation ItemSelected ( items [ selected Item Position ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġval Ġnavigation View : ĠAnimation Switch ing Bottom Navigation View Ġ= ĊĠĠĠ ĠAnimation Switch ing Bottom Navigation View ( context , Ġattrs ). apply Ġ{ ĊĠĠĠĠĠ Ġon Navigation ClickListener Ġ= ĊĠĠĠĠĠĠĠ Ġthis @ Animation Switch ing Bottom Navigation Layout . on Navigation ClickListener ĊĠĠĠ Ġ} ĊĠ Ġprivate Ġlateinit Ġvar Ġselected Item Layout : ĠFrame Layout ĊĊĠ Ġprivate Ġvar Ġnavigation View Height Ġ= ĊĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . animation _ switch ing _ bottom _ navigation _ default _ height ) ĊĠ Ġprivate Ġvar Ġselected Width Ġ= ĊĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . animation _ switch ing _ bottom _ navigation _ selected _ normal _ width ) ĊĠ Ġprivate Ġvar Ġselected Height Ġ= ĊĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . animation _ switch ing _ bottom _ navigation _ selected _ normal _ height ) ĊĠ Ġprivate Ġvar Ġselected Bottom Margin Ġ= ĊĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . animation _ switch ing _ bottom _ navigation _ selected _ default _ bottom _ margin ) ĊĊĠ Ġprivate Ġvar Ġselected Item Position : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġanim ator : ĠAn imator ? Ġ= Ġnull ĊĊĠ Ġprivate Ġval Ġitems Ġ= Ġmutable ListOf < Navigation MenuItem >() ĊĊĠ Ġvar Ġon Navigation MenuItem Re selected Listener : ĠOn Navigation MenuItem Re selected Listener ? Ġ= Ġnull ĊĠ Ġvar Ġon Navigation MenuItem Selected Listeners : ĠMutable List < On Navigation MenuItem Selected Listener > Ġ= ĊĠĠĠ Ġmutable ListOf () ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġval Ġselected Button Ġ= ĠAnimation Switch ing Bottom Navigation Selected Button ( context , Ġattrs ) ĊĊĠĠĠ Ġattrs ?. let Ġ{ ĊĠĠĠĠĠ Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠ ĠR . style able . Animation Switch ing Bottom Navigation Layout ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġnavigation View Height Ġ= ĊĠĠĠĠĠĠĠ Ġa . get Dimension Pixel Size ( ĊĠĠĠĠĠĠĠĠĠ ĠR . style able . Animation Switch ing Bottom Navigation Layout _ navigation View Height , ĊĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . animation _ switch ing _ bottom _ navigation _ default _ height ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġselected Button . set O val Tint List ( ĊĠĠĠĠĠĠĠ Ġa . getColor State List ( ĊĠĠĠĠĠĠĠĠĠ ĠR . style able . Animation Switch ing Bottom Navigation Layout _ selected Button BackgroundColor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ ĠSelected Button Size . from Index ( ĊĠĠĠĠĠĠĠ Ġa . getInt ( ĊĠĠĠĠĠĠĠĠĠ ĠR . style able . Animation Switch ing Bottom Navigation Layout _ selected Button Size , ĊĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ). also Ġ{ Ġselected Button Size Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( selected Button Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠNORMAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Width Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . animation _ switch ing _ bottom _ navigation _ selected _ normal _ width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . animation _ switch ing _ bottom _ navigation _ selected _ normal _ height ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠSMALL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Width Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . animation _ switch ing _ bottom _ navigation _ selected _ small _ width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension Pixel Size ( R . dim en . animation _ switch ing _ bottom _ navigation _ selected _ small _ height ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġa . recycle () ĊĠĠĠ Ġ} ĊĠĠĠ Ġselected Item Layout Ġ= Ġselected Button ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠAdd Ġ[ Animation Switch ing Bottom Navigation View ] Ġand Ġ[ Animation Switch ing Bottom Navigation Selected Button ] ĊĠĠ Ġ* Ġafter Ġfinished Ġparse Ġlayout ĠXML Ġbecause Ġconsidering Ġdrawing Ġorder . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠIn Ġthis Ġmethod , Ġif Ġthis Ġlayout Ġhas Ġ[ Animation Switch ing Bottom Navigation SelectedItem Layout ], ĊĠĠ Ġ* Ġreplace Ġit Ġand Ġ[ Animation Switch ing Bottom Navigation Selected Button ]. ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ ĊĠĠĠ Ġsuper . on Finish Inf late () ĊĊĠĠĠ Ġif Ġ( child Count Ġ< ĠMAX _ CHILD _ COUNT ) Ġ{ ĊĠĠĠĠĠ Ġval Ġlayout Ġ= Ġchildren . first OrNull Ġ{ ĊĠĠĠĠĠĠĠ Ġit Ġis ĠAnimation Switch ing Bottom Navigation SelectedItem Layout ĊĠĠĠĠĠ Ġ} Ġas ? ĠAnimation Switch ing Bottom Navigation SelectedItem Layout ĊĊĠĠĠĠĠ Ġlayout ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġset SelectedItem Layout ( it ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġadd View ( ĊĠĠĠĠĠĠĠ Ġnavigation View , ĊĠĠĠĠĠĠĠ ĠLayout Params ( LayoutParams . MATCH _ PARENT , ĠLayout Params . WRAP _ CONTENT , ĠGr avity . BOTTOM ) ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġ// Ġdefault Ġselected Item Layout Ġmay Ġadd View () Ġnot Ġyet , Ġso Ġdo Ġit Ġhere . ĊĠĠĠĠĠ Ġif Ġ(! children . contains ( selected Item Layout )) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd View ( selected Item Layout ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( child Count Ġ> ĠMAX _ CHILD _ COUNT ) Ġthrow ĠIllegalStateException (" This ĠLayout Ġcan Ġnot Ġhave Ġviews Ġmore Ġthan Ġ 3 .") ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠAdjust Ġeach Ġchild Ġviews Ġsize Ġdynamically Ġconsidering Ġw / Ġnavigation Ġlayout Ġsize . ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġlayout Width Mode Ġ= ĠMeasure Spec . get Mode ( width Measure Spec ) ĊĠĠĠ Ġval Ġlayout Width Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠ Ġval Ġlayout Height Mode Ġ= ĠMeasure Spec . get Mode ( height Measure Spec ) ĊĠĠĠ Ġval Ġlayout Height Ġ= ĠMeasure Spec . getSize ( height Measure Spec ) ĊĊĠĠĠ Ġif Ġ( layout Width Mode Ġ!= ĠMeasure Spec . EX ACT LY Ġ|| Ġlayout Height Mode Ġ!= ĠMeasure Spec . EX ACT LY ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Please Ġset Ġ' match _ parent ' Ġto ĠAnimation Switch ing Bottom Navigation Layout 's Ġwidth Ġand Ġheight .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġadjust Ġsize Ġof ĠNavigation View ĊĠĠĠ Ġval Ġnavigation Width Spec Ġ= ĠMeasure Spec . make Measure Spec ( layout Width , ĠMeasure Spec . AT _ MO ST ) ĊĠĠĠ Ġval Ġnavigation Height Spec Ġ= ĊĠĠĠĠĠ ĠMeasure Spec . make Measure Spec ( navigation View Height , ĠMeasure Spec . EX ACT LY ) ĊĠĠĠ Ġnavigation View . measure ( navigation Width Spec , Ġnavigation Height Spec ) ĊĊĠĠĠ Ġ// Ġadjust Ġsize Ġof ĠSelected Item Layout ĊĠĠĠ Ġval Ġselected Width Spec Ġ= ĠMeasure Spec . make Measure Spec ( selected Width , ĠMeasure Spec . EX ACT LY ) ĊĠĠĠ Ġval Ġselected Height Spec Ġ= ĠMeasure Spec . make Measure Spec ( selected Height , ĠMeasure Spec . EX ACT LY ) ĊĠĠĠ Ġselected Item Layout . measure ( selected Width Spec , Ġselected Height Spec ) ĊĊĠĠĠ Ġ// Ġadjust Ġsize Ġof Ġmain Ġcontents Ġ( that Ġnot Ġgenerated Ġby Ġthis Ġlibrary ) ĊĠĠĠ Ġval Ġcontent Ġ= Ġget Child At ( 0 ) ĊĠĠĠ Ġval Ġcontent Width Spec Ġ= ĠMeasure Spec . make Measure Spec ( layout Width , ĠMeasure Spec . EX ACT LY ) ĊĠĠĠ Ġval Ġcontent Height Spec Ġ= ĠMeasure Spec . make Measure Spec ( ĊĠĠĠĠĠ Ġlayout Height Ġ- Ġnavigation View Height , ĊĠĠĠĠĠ ĠMeasure Spec . EX ACT LY ĊĠĠĠ Ġ) ĊĠĠĠ Ġcontent . measure ( content Width Spec , Ġcontent Height Spec ) ĊĊĠĠĠ Ġset Measured Dimension ( layout Width , Ġlayout Height ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠAdjust Ġeach Ġchild Ġviews Ġposition Ġdynamically Ġconsidering Ġw / Ġnavigation Ġlayout Ġsize . ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĠĠĠ Ġsuper . on Layout ( changed , Ġleft , Ġtop , Ġright , Ġbottom ) ĊĠĠĠ Ġ// Ġcheck Ġitem Views Ġhas Ġchildren Ġfor Ġprevent Ġcrash ĊĠĠĠ Ġif Ġ( navigation View . menu View . item Views . size Ġ== Ġ 0 ) Ġreturn ĊĊĠĠĠ Ġ// Ġadjust Ġposition Ġof ĠSelected Item Layout ĊĠĠĠ Ġval Ġselected Width Ġ= Ġselected Item Layout . meas ured Width ĊĠĠĠ Ġval Ġselected Height Ġ= Ġselected Item Layout . meas ured Height ĊĠĠĠ Ġval ĠitemView Width Ġ= Ġnavigation View . menu View . getChild At ( 0 ). meas ured Width ĊĠĠĠ Ġval Ġdifference Between Selected And Item Ġ= Ġ( item View Width Ġ- Ġselected Width ) Ġ/ Ġ 2 ĊĠĠĠ Ġselected Item Layout . layout ( ĊĠĠĠĠĠ Ġdifference Between Selected And Item , ĊĠĠĠĠĠ Ġmeasured Height Ġ- Ġselected Height Ġ- Ġselected Bottom Margin , ĊĠĠĠĠĠ Ġdifference Between Selected And Item Ġ+ Ġselected Width , ĊĠĠĠĠĠ Ġmeasured Height Ġ- Ġselected Bottom Margin ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠSet Ġlayout Ġfor Ġnavigation Ġbutton Ġthat Ġindicate Ġselected Ġmenu Ġitem . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThis Ġmethod Ġdoesn 't Ġneed Ġto Ġuse Ġbecause Ġ[ Animation Switch ing Bottom Navigation Layout ] Ġhas Ġa ĊĠĠ Ġ* Ġ[ Animation Switch ing Bottom Navigation Selected Button ] Ġby Ġdefault . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠIf Ġyou Ġcustomize Ġ[ Animation Switch ing Bottom Navigation Selected Button ], ĊĠĠ Ġ* Ġwe Ġrecommend Ġto Ġuse Ġ[ Animation Switch ing Bottom Navigation SelectedItem Layout ] Ġand Ġimplement Ġat Ġthe ĊĠĠ Ġ* Ġlayout ĠXML . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġlayout Ġlayout Ġof Ġnavigation Ġbutton Ġthat Ġextends Ġ[ Frame Layout ] ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġ@ Suppress (" unused ") ĊĠ Ġfun Ġset SelectedItem Layout ( layout : ĠFrame Layout ) Ġ{ ĊĠĠĠ Ġselected Item Layout Ġ= Ġlayout ĊĠĠĠ Ġ( layout Ġas ? ĠOn Navigation MenuItem Selected Listener )?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠ Ġon Navigation MenuItem Selected Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ( layout Ġas ? ĠOn Navigation MenuItem Re selected Listener )?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠ Ġon Navigation MenuItem Re selected Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget SelectedItem Layout () Ġ= Ġselected Item Layout ĊĊĠ Ġprivate Ġfun Ġcreate Animator Fade Out MenuItem ( ĊĠĠĠ ĠitemView : ĠAnimation Switch ing Bottom Navigation Item View ĊĠ Ġ): ĠAn imator Ġ{ ĊĠĠĠ Ġreturn ĠitemView . anim ator Alpha ( 1 F , Ġ 0 F ) ĊĠĠĠĠĠ Ġ. set Duration Ext ( FA DE _ ANIM ATION _ DURATION ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Animator Fade In MenuItem ( ĊĠĠĠ ĠitemView : ĠAnimation Switch ing Bottom Navigation Item View ĊĠ Ġ): ĠAn imator Ġ{ ĊĠĠĠ Ġreturn ĠitemView . anim ator Alpha ( 0 F , Ġ 1 F ) ĊĠĠĠĠĠ Ġ. set Duration Ext ( FA DE _ ANIM ATION _ DURATION ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Animator MoveTo Selected Position ( ĊĠĠĠ Ġselected Item Layout : ĠFrame Layout , ĊĠĠĠ Ġmenu View : ĠAnimation Switch ing Bottom Navigation Menu View , ĊĠĠĠ Ġnew Position : ĠInt ĊĠ Ġ): ĠAn imator Ġ{ ĊĠĠĠ Ġ// Ġanimate Ġanimation Switch ing Bottom Navigation Selected Button View ĊĠĠĠ Ġval Ġselected Item Layout Width Ġ= Ġselected Item Layout . meas ured Width ĊĠĠĠ Ġval ĠitemView Width Ġ= Ġmenu View . getChild At ( new Position ). meas ured Width ĊĠĠĠ Ġval Ġstart X Ġ= Ġselected Item Layout . x ĊĠĠĠ Ġval Ġtarget X Ġ= Ġmenu View . getChild At ( new Position ). x Ġ+ Ġ( item View Width Ġ- Ġselected Item Layout Width ) Ġ/ Ġ 2 ĊĊĠĠĠ Ġreturn Ġselected Item Layout . anim ator X ( start X , Ġtarget X ) ĊĠĠĠĠĠ Ġ. set Duration Ext ( SL IDE _ ANIM ATION _ DURATION ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Animator MoveTo Selected Background Position ( ĊĠĠĠ Ġselected Background : ĠAnimation Switch ing Bottom Navigation Selected Background View , ĊĠĠĠ Ġmenu View : ĠAnimation Switch ing Bottom Navigation Menu View , ĊĠĠĠ Ġnew Position : ĠInt ĊĠ Ġ): ĠAn imator Ġ{ ĊĠĠĠ Ġ// Ġanimate Ġselected Background ĊĠĠĠ Ġval Ġselected Background Width Ġ= Ġnavigation View . selected Background View . meas ured Width ĊĠĠĠ Ġval ĠitemView Width Ġ= Ġmenu View . getChild At ( new Position ). meas ured Width ĊĠĠĠ Ġval Ġstart X Ġ= Ġselected Background . x ĊĠĠĠ Ġval Ġtarget X Ġ= Ġmenu View . getChild At ( new Position ). x Ġ+ Ġ( item View Width Ġ- Ġselected Background Width ) Ġ/ Ġ 2 ĊĊĠĠĠ Ġreturn Ġselected Background . anim ator X ( start X , Ġtarget X ) ĊĠĠĠĠĠ Ġ. set Duration Ext ( SL IDE _ ANIM ATION _ DURATION ) ĊĠ Ġ} ĊĊĠ Ġfun Ġget Items () Ġ= Ġitems ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠAdd Ġmenu Ġitem Ġto Ġend Ġof Ġmenu Ġlist . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġbefore : Ġ{ A , ĠB , ĠC } ĊĠĠ Ġ* Ġparam : ĠD ĊĠĠ Ġ* Ġafter : Ġ{ A , ĠB , ĠC , ĠD } ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġitem Ġmenu Ġitem ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġ@ Suppress (" unused ") ĊĠ Ġfun Ġadd Navigation MenuItem ( item : ĠNavigation MenuItem ) Ġ{ ĊĠĠĠ Ġitems . add ( item ) ĊĠĠĠ Ġdispatch Item () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠAdd Ġmenu Ġitems Ġto Ġend Ġof Ġmenu Ġlist . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* Ġbefore : Ġ{ A , ĠB , ĠC } ĊĠĠ Ġ* Ġparam : Ġ{ X , ĠY , ĠZ } ĊĠĠ Ġ* Ġafter : Ġ{ A , ĠB , ĠC , ĠX , ĠY , ĠZ } ĊĠĠ Ġ* Ġ``` ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġitems Ġlist Ġof Ġmenu Ġitems ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġ@ Suppress (" unused ") ĊĠ Ġfun Ġadd Navigation MenuItem ( items : ĠList < Navigation MenuItem >) Ġ{ ĊĠĠĠ Ġthis . items . addAll ( items ) ĊĠĠĠ Ġdispatch Item () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdispatch Item () Ġ{ ĊĠĠĠ Ġnavigation View . add Navigation MenuItem ( items ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġanimate To Selected Position ( position : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġmenu View Ġ= Ġnavigation View . menu View ĊĠĠĠ Ġval Ġfrom Item View Ġ= Ġmenu View . item Views [ selected Item Position ] ĊĠĠĠ Ġval Ġto Item View Ġ= Ġmenu View . item Views [ position ] ĊĠĠĠ Ġval Ġselected Background View Ġ= Ġnavigation View . selected Background View ĊĠĠĠ Ġval Ġfrom Color Ġ= Ġitems [ selected Item Position ]. selected BackgroundColor ĊĠĠĠ Ġval Ġto Color Ġ= Ġitems [ position ]. selected BackgroundColor ĊĊĠĠĠ Ġif Ġ( anim ator ?. isRunning Ġ!= Ġfalse ) Ġ{ ĊĠĠĠĠĠ Ġanim ator ?. cancel () ĊĠĠĠĠĠ Ġanim ator Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġavoid Ġf lick ing ĊĠĠĠ Ġfrom Item View . alpha Ġ= Ġ 0 . 0 F ĊĊĠĠĠ Ġanim ator Ġ= ĠAn imator Set (). play To gether Ext ( ĊĠĠĠĠĠ ĠAn imator Set (). play Se quent ially Ext ( ĊĠĠĠĠĠĠĠ Ġcreate Animator Fade Out MenuItem ( to Item View ), ĊĠĠĠĠĠĠĠ Ġcreate Animator Fade In MenuItem ( from Item View ). set Start Delay Ext ( FA DE _ ANIM ATION _ START _ DELAY ) ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ ĠAn imator Set (). play To gether Ext ( ĊĠĠĠĠĠĠĠ Ġcreate Animator MoveTo Selected Position ( selected Item Layout , Ġmenu View , Ġposition ), ĊĠĠĠĠĠĠĠ Ġcreate Animator MoveTo Selected Background Position ( ĊĠĠĠĠĠĠĠĠĠ Ġselected Background View , ĊĠĠĠĠĠĠĠĠĠ Ġmenu View , ĊĠĠĠĠĠĠĠĠĠ Ġposition ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠValue Animator (). setInt Values Ext ( ĊĠĠĠĠĠĠĠĠĠ Ġfrom Color , ĊĠĠĠĠĠĠĠĠĠ Ġto Color ĊĠĠĠĠĠĠĠ Ġ). set Evaluator Ext ( Argb Evaluator ()). add Update Lister Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ Ġanim ator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor : ĠInt Ġ= Ġanim ator . animated Value Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Background View . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. set Duration ( FA DE _ ANIM ATION _ DURATION ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). set Listener ( ĊĠĠĠĠĠ Ġon Cancel Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom Item View . alpha Ġ= Ġ 1 F ĊĠĠĠĠĠĠĠ Ġto Item View . alpha Ġ= Ġ 1 F ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġanim ator ?. start () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠChange Ġselected Ġmenu Ġitem Ġwith Ġposition . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġposition Ġmenu Ġitem Ġposition . ĠValue Ġshould Ġbe Ġin Ġrange Ġof Ġ 0 Ġto Ġitem Ġsize . ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġfun ĠsetSelected Position ( position : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( selected Item Position Ġ== Ġposition ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġanimate To Selected Position ( position ) ĊĠĠĠ Ġselected Item Position Ġ= Ġposition ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠListener Ġthat Ġcall Ġwhen Ġselected Ġmenu Ġitem Ġclicked Ġrepeatedly . ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġinterface ĠOn Navigation MenuItem Re selected Listener Ġ{ ĊĠĠĠ Ġfun Ġon Navigation Item Re selected (@ NonNull Ġitem : ĠNavigation MenuItem ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĊĠĠ Ġ* ĠListener Ġthat Ġcall Ġwhen Ġmenu Ġitem Ġclicked . ĊĠĠ Ġ* ĊĠĠ Ġ*/ ĊĠ Ġinterface ĠOn Navigation MenuItem Selected Listener Ġ{ ĊĠĠĠ Ġfun Ġon Navigation ItemSelected (@ NonNull Ġitem : ĠNavigation MenuItem ) ĊĠ Ġ} Ċ }