package Ġcom . r aza . mult it ext view animation Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroidx . appcompat . widget . AppCompat TextView Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ open Ġclass ĠMulti Text With Animation Ġ: ĠAppCompat TextView Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġtimeout : ĠInt Ġ= ĠDEFAULT _ TIME _ OUT ĊĠĠĠ Ġprivate Ġvar Ġposition Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġis View Shown Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġstopped Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġin Animation : ĠAnimation ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġout Animation : ĠAnimation ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtexts : ĠArray < CharSequence >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġanimation Handler : ĠHandler ? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style : ĠInt ) Ġ: Ġsuper ( context , ĊĠĠĠĠĠĠĠ Ġattrs , Ġdef Style ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠĠĠĠĠ Ġhandle Attrs ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġthis ( context , Ġattrs , Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠĠĠĠĠ Ġhandle Attrs ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġthe Ġview Ġand Ġthe Ġanimations ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġin Animation Ġ= ĠAnimation Utils . load Animation ( context , ĠR . anim . fade in ) ĊĠĠĠĠĠĠĠ Ġout Animation Ġ= ĠAnimation Utils . load Animation ( context , ĠR . anim . fade out ) ĊĠĠĠĠĠĠĠ Ġanimation Handler Ġ= ĠHandler () ĊĠĠĠĠĠĠĠ Ġthis . is View Shown Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRes umes Ġthe Ġanimation ĊĠĠĠĠ Ġ* ĠShould Ġonly Ġbe Ġused Ġif Ġyou Ġnotice Ġ[. on Attached To Window ] Ġ() } Ġis Ġnot Ġbeing Ġexecuted Ġas Ġexpected ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġresume () Ġ{ ĊĠĠĠĠĠĠĠ Ġis View Shown Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġstart Animation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPause s Ġthe Ġanimation ĊĠĠĠĠ Ġ* ĠShould Ġonly Ġbe Ġused Ġif Ġyou Ġnotice Ġ[. on Detached From Window ] Ġis Ġnot Ġbeing Ġexecuted Ġas Ġexpected ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġis View Shown Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġstop Animation () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġthe Ġanimation ĊĠĠĠĠ Ġ* ĠUn like Ġthe Ġpause Ġfunction , Ġthe Ġstop Ġmethod Ġwill Ġper manently Ġstop Ġthe Ġanimation Ġuntil Ġthe Ġview Ġis Ġrestarted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġis View Shown Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġstopped Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġstop Animation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe starts Ġthe Ġanimation ĊĠĠĠĠ Ġ* ĠOnly Ġuse Ġthis Ġto Ġrestart Ġthe Ġanimation Ġafter Ġstopping Ġit Ġusing Ġ[. stop ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrestart () Ġ{ ĊĠĠĠĠĠĠĠ Ġis View Shown Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġstopped Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġstart Animation () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġpause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠĠĠĠĠ Ġresume () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġhandle Attrs ( attrs : ĠAttributeSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Multi Text With Animation ) ĊĠĠĠĠĠĠĠ Ġthis . texts Ġ= Ġa . getText Array ( R . style able . Multi Text With Animation _ texts ) ĊĠĠĠĠĠĠĠ Ġval Ġin Animation Res Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . getResource Id ( R . style able . Multi Text With Animation _ in Animation , ĠR . anim . fade in ) ĊĠĠĠĠĠĠĠ Ġval Ġout Animation Res Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . getResource Id ( R . style able . Multi Text With Animation _ out Animation , ĠR . anim . fade out ) ĊĊĊĠĠĠĠĠĠĠ Ġin Animation Ġ= ĠAnimation Utils . load Animation ( context , Ġin Animation Res ) ĊĠĠĠĠĠĠĠ Ġout Animation Ġ= ĠAnimation Utils . load Animation ( context , Ġout Animation Res ) ĊĠĠĠĠĠĠĠ Ġthis . timeout Ġ= ĠMath . abs ( a . getInteger ( R . style able . Multi Text With Animation _ timeout , Ġ 1 4 5 0 0 )) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getInteger ( android . R . integer . config _ long Anim Time ) ĊĊĠĠĠĠĠĠĠ Ġval Ġshuffle Ġ= Ġa . getBoolean ( R . style able . Multi Text With Animation _ shuffle , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ( shuffle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshuffle Labels () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġa . recycle () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSh uffle Ġthe Ġstrings ĊĠĠĠĠ Ġ* ĠEach Ġtime Ġthis Ġmethod Ġis Ġran Ġthe Ġorder Ġof Ġthe Ġstrings Ġwill Ġbe Ġrandom ized ĊĠĠĠĠ Ġ* ĠAfter Ġyou Ġset Ġtexts Ġdynamically Ġyou Ġwill Ġhave Ġto Ġcall Ġshuffle Ġagain ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshuffle Labels () Ġ{ ĊĠĠĠĠĠĠĠ Ġarray ListOf ( texts ). shuffle () ĊĠĠĠĠĠĠĠ Ġthis . texts Ġ= Ġtexts ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġa Ġlist Ġof Ġthe Ġtexts ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġtexts Ġarray ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Texts (): ĠArray < CharSequence >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtexts ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġtexts Ġto Ġbe Ġsh uffled Ġusing Ġa Ġstring Ġarray ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtexts ĠThe Ġstring Ġarray Ġto Ġuse Ġfor Ġthe Ġtexts ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Texts ( texts : ĠArray < CharSequence >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( texts . isNotEmpty ()) Ġ{ Ġ" There Ġmust Ġbe Ġat Ġleast Ġone Ġtext " Ġ} ĊĠĠĠĠĠĠĠ Ġthis . texts Ġ= Ġtexts ĊĠĠĠĠĠĠĠ Ġstop Animation () ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġstart Animation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġtexts Ġto Ġbe Ġsh uffled Ġusing Ġa Ġstring Ġarray Ġresource ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtexts ĠThe Ġstring Ġarray Ġresource Ġto Ġuse Ġfor Ġthe Ġtexts ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Texts ( texts : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( resources . getString Array ( texts ). isNotEmpty ()) Ġ{ Ġ" There Ġmust Ġbe Ġat Ġleast Ġone Ġtext " Ġ} ĊĠĠĠĠĠĠĠ Ġthis . texts Ġ= Ġresources . getText Array ( texts ) ĊĠĠĠĠĠĠĠ Ġstop Animation () ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġstart Animation () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġshould Ġonly Ġbe Ġused Ġto Ġforce fully Ġapply Ġtimeout Ġchanges ĊĠĠĠĠ Ġ* ĠIt Ġwill Ġdismiss Ġthe Ġcurrently Ġqueued Ġanimation Ġchange Ġand Ġstart Ġa Ġnew Ġanimation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġforce Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Animation () ĊĠĠĠĠĠĠĠ Ġstart Animation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġlength Ġof Ġtime Ġto Ġwait Ġbetween Ġtext Ġchanges Ġin Ġmilliseconds ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout ĠThe Ġlength Ġof Ġtime Ġto Ġwait Ġbetween Ġtext Ġchange Ġin Ġmilliseconds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetTimeout ( timeout : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( timeout Ġ>= Ġ 1 ) Ġ{ Ġ" Timeout Ġmust Ġbe Ġlonger Ġthan Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġthis . timeout Ġ= Ġtimeout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġlength Ġof Ġtime Ġto Ġwait Ġbetween Ġtext Ġchanges Ġin Ġspecific Ġtime Ġunits ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout Ġ ĠThe Ġlength Ġof Ġtime Ġto Ġwait Ġbetween Ġtext Ġchange ĊĠĠĠĠ Ġ* Ġ@ param Ġtime Unit ĠThe Ġtime Ġunit Ġto Ġuse Ġfor Ġthe Ġtimeout Ġparameter ĊĠĠĠĠ Ġ* ĠMust Ġbe Ġof Ġ[ TimeUnit ] Ġtype . ĠĠĠ ĠEither Ġ[. MILLISECONDS ] Ġor ĊĠĠĠĠ Ġ* Ġ[. SECONDS ] Ġor ĊĠĠĠĠ Ġ* Ġ[. MIN UTES ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetTimeout ( timeout : ĠDouble , time Unit : ĠTimeUnit ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( timeout Ġ> Ġ 0 ) Ġ{ Ġ" Timeout Ġmust Ġbe Ġlonger Ġthan Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmultiplier : ĠInt Ġ= Ġwhen Ġ( time Unit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS Ġ-> Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MIN UTES Ġ-> Ġ 6 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . timeout Ġ= Ġ( timeout Ġ* Ġmultiplier ). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetTimeout ( timeout : ĠLong , Ġtime Unit : ĠTimeUnit ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( timeout Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Timeout Ġmust Ġbe Ġlonger Ġthan Ġ 0 ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . timeout Ġ= ĠTimeUnit . MILLISECONDS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. convert ( timeout , Ġtime Unit ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġthe Ġspecified Ġanimation Ġnow Ġif Ġshould ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġanimation Ġthe Ġanimation Ġto Ġstart Ġnow ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstart Animation ( animation : ĠAnimation ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is View Shown Ġ&& Ġ! stopped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . start Animation ( animation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġthe Ġcurrently Ġactive Ġanimation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstop Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġanimation Handler !!. remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( animation Ġ!= Ġnull ) Ġanimation . cancel () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġthe Ġanimation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġstart Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isIn Edit Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtexts ! ![ position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Animation ( in Animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Handler !!. post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Animation ( out Animation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimation . set Animation Listener ( object Ġ: ĠAnimation . Animation Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAnimation ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAnimation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is View Shown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġif Ġ( position Ġ== Ġtexts !!. size Ġ- Ġ 1 ) Ġ 0 Ġelse Ġposition Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠAnimation ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġtimeout . to Long ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ TIME _ OUT Ġ= Ġ 1 5 0 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIL LI SECONDS Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSE CON DS Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN UTES Ġ= Ġ 3 ĊĠĠĠ Ġ} Ċ }