package Ġnet . ow lf amily . android . ani ext . core Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ import Ġjava . lang . IllegalStateException Ċ import Ġkotlin . math . floor ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby Ġj yun Ċ Ġ* Ċ Ġ* ĠValue Animator Set ĠìĿĺ ĠìŀĲ ìĭĿ ĠClass ĠìĿ´ ëĭ¤ . Ċ Ġ* ĠValue Animator ĠìĿĺ ĠProgress Ġë ¥ ¼ Ġê¸° ë°ĺ ìľ¼ë¡ľ ĠBitmap ĠSequence ĠAnimation ĠìĿ Ħ ĠìĪĺ íĸī íķľëĭ¤ . Ċ Ġ*/ Ċ @ Suppress (" Constant Condition If ", Ġ" Member Visibility Can Be Private ") Ċ class ĠVal ued Bitmap Animator ( ĊĠĠĠ ĠimageView : ĠImageView , ĊĠĠĠ Ġframes : ĠInt Array , ĊĠĠĠ Ġanim ators : ĠArray < Value Animator > Ġ= ĠarrayOf () Ċ ) Ġ: ĠValue Animator Set ( anim ators ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtotal Frames Count : ĠFloat ĊĠĠĠ Ġ/** Ġ Ġanimation Ġframes Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġframes : ĠInt Array ? ĊĠĠĠ Ġprivate Ġval ĠimageView : ĠImageView ? ĊĠĠĠ Ġprivate Ġvar Ġre usable Bitmap Options : ĠBitmap Factory . Options ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġre usable Bitmap : ĠBitmap ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġanimation Cancelled : ĠBoolean ĊĠĠĠ Ġprivate Ġvar Ġcurrent Frame : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġis Reset Animation On Stop Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġcurrent Bitmap : ĠBitmap ? Ġ= Ġnull ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUSE _ RE US ABLE _ BITMAP Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUSE _ PUR G ABLE _ BITMAP Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG _ TAG Ġ= ĠVal ued Bitmap Animator :: class . java . simple Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( frames . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġanimation Cancelled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġthis . imageView Ġ= ĠimageView ĊĠĠĠĠĠĠĠ Ġthis . frames Ġ= Ġframes ĊĠĠĠĠĠĠĠ Ġtotal Frames Count Ġ= Ġframes . size . toFloat () ĊĠĠĠĠĠĠĠ Ġcurrent Frame Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġis Reset Animation On Stop Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( USE _ RE US ABLE _ BITMAP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠBitmap Factory . Options () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . in Mutable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Resource ( imageView . resources , Ġframes [ 0 ], Ġoptions ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġwill Ġcreate Ġempty Ġbitmap Ġby Ġusing Ġthe Ġoption ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre usable Bitmap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Bitmap ( options . out Width , Ġoptions . out Height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre usable Bitmap Options Ġ= ĠBitmap Factory . Options () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre usable Bitmap Options !!. in Bitmap Ġ= Ġre usable Bitmap ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠimageView . add On Attach State ChangeListener ( object Ġ: ĠView . On Attach State ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Attached To Window ( v : ĠView ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Detached From Window ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Clear Ġbitmap Ġwith Ġdet ached Ġview ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . remove On Attach State ChangeListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Frame ( frame : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Frame Ġ= Ġframe ĊĠĠĠĠĠĠĠ Ġif Ġ( imageView Ġ== Ġnull Ġ|| Ġ! imageView . is Shown ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Log . d ( LOG _ TAG ," Image Ġnot Ġshown ! Ġwith Ġframe Ġ" Ġ+ Ġcurrent Frame ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// imageView . setImage Bitmap ( null ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! USE _ RE US ABLE _ BITMAP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! current Bitmap !!. is Re cyc led ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Bitmap !!. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Bitmap Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . setImage Bitmap ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġimage Res Ġ= Ġframes ! ![ current Frame ] ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Bitmap Ġ= Ġif Ġ( USE _ RE US ABLE _ BITMAP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . resources , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Res , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre usable Bitmap Options ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Options Ġ= ĠBitmap Factory . Options () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Resource ( imageView . resources , Ġimage Res , Ġbitmap Options ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . setImage Bitmap ( current Bitmap ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠimageView ?. setImage Bitmap ( null ) ĊĠĠĠĠĠĠĠ Ġif Ġ( reusable Bitmap Ġ!= Ġnull Ġ&& Ġ! reusable Bitmap !!. is Re cyc led ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre usable Bitmap !!. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre usable Bitmap Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Animation Start ( anim ator : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Animation Start ( anim ator ) ĊĠĠĠĠĠĠĠ Ġanimation Cancelled Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( anim ator : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Animation Cancel ( anim ator ) ĊĠĠĠĠĠĠĠ Ġanimation Cancelled Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Animation End ( anim ator : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Animation End ( anim ator ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! animation Cancelled Ġ&& Ġis Reset Animation On Stop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Play Time Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Reset ĠAnimation Ġstate Ġon Ġend ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( anim ator : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Animation Repeat ( anim ator ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Animation Update ( value Animator : ĠValue Animator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Animation Update ( value Animator ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġvalue Animator . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠ Ġvar Ġnew Frame Ġ= Ġfloor ( total Frames Count Ġ* Ġvalue . toDouble ()). toInt () ĊĠĠĠĠĠĠĠ Ġ// index Ġout Ġbound ë¥¼ ĠíĶ ¼ íķĺê¸° ĠìľĦ íķ´ìĦľ ĠìľĦ ì ½Ķëĵľ ìĹĲìĦľ Ġtotal Frame Count - 1 ĠìĿ Ħ Ġíķ ´ë ² Ħ ë¦¬ ë©´ Ġë§Ī ì§Ģ ë§ ī ĠíĶĦ ëłĪ ìŀĦ ìĿ´ Ġì§ ¤ ë¦¬ ê¸° ĠëķĮë¬¸ìĹĲ ĠìķĦëŀĺ ìĻĢ Ġê°Ļ ìĿ´ Ġíķľëĭ¤ . ĊĠĠĠĠĠĠĠ Ġif Ġ( new Frame Ġ>= Ġtotal Frames Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Frame Ġ= Ġ( total Frames Count Ġ- Ġ 1 ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( new Frame Ġ!= Ġcurrent Frame ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Frame ( new Frame ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ