/* Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠĠĠ ĠCopyright Ġ 2 0 1 8 . Ġiota 9 star Ċ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* ĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġ Ġ* ĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* Ġ Ġ* ĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* ĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġ Ġ* ĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ Ġ* ĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* Ġ Ġ* ĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġ Ġ* ĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ package Ġstar . i ota . k is ss ub . widget . ken Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ Ċ import Ġcom . af ol le st ad . a est hetic . A est hetic ImageView Ċ Ċ class ĠKen Burn s View Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull ) Ġ: ĠA est hetic ImageView ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġm Matrix Ġ= ĠMatrix () ĊĊĠĠĠ Ġprivate Ġvar Ġm Trans Gen : ĠTransition Generator Ġ= ĠRandom Transition Generator () ĊĊĠĠĠ Ġprivate Ġvar Ġm Transition Listener : ĠTransition Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar ĠmCurrent Trans : ĠTransition ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġm Viewport Rect Ġ= ĠRect F () ĊĊĠĠĠ Ġprivate Ġvar Ġm Drawable Rect : ĠRect F ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġm Elapsed Time : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġm Last Frame Time : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġm Paused : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . set Scale Type ( ImageView . Scale Type . MATRIX ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġset Scale Type ( scale Type : ĠImageView . Scale Type ) Ġ{ ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġset Visibility ( visibility : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setVisibility ( visibility ) ĊĠĠĠĠĠĠĠ Ġif Ġ( visibility Ġ== ĠView . VISIBLE ) Ġresume () ĊĠĠĠĠĠĠĠ Ġelse Ġpause () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġset Image Bitmap ( bm : ĠBitmap ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setImage Bitmap ( bm ) ĊĠĠĠĠĠĠĠ Ġhandle Image Change () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġset Image Resource ( res Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setImage Resource ( res Id ) ĊĠĠĠĠĠĠĠ Ġhandle Image Change () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġset Image URI ( uri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setImage URI ( uri ) ĊĠĠĠĠĠĠĠ Ġhandle Image Change () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġset Image Drawable ( drawable : ĠDrawable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setImage Drawable ( drawable ) ĊĠĠĠĠĠĠĠ Ġhandle Image Change () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĠĠĠĠĠĠĠ Ġrestart () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġdrawable ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Paused Ġ&& Ġd Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Drawable Rect !!. isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Drawable Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( has Bounds ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Trans Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart New Transition () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Current Trans ?. dest iny Rect Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Elapsed Time Ġ+= ĠSystem . currentTimeMillis () Ġ- Ġm Last Frame Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Rect Ġ= ĠmCurrent Trans !!. get Interpol ated Rect ( m Elapsed Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Scale Ġ= Ġm Drawable Rect !!. width () Ġ/ Ġcurrent Rect . width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Scale Ġ= Ġm Drawable Rect !!. height () Ġ/ Ġcurrent Rect . height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Rect To D rw Scale Ġ= ĠMath . min ( width Scale , Ġheight Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvp Width Scale Ġ= Ġm Viewport Rect . width () Ġ/ Ġcurrent Rect . width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvp Height Scale Ġ= Ġm Viewport Rect . height () Ġ/ Ġcurrent Rect . height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Rect To Vp Scale Ġ= ĠMath . min ( vp Width Scale , Ġvp Height Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Scale Ġ= Ġcurr Rect To D rw Scale Ġ* Ġcurr Rect To Vp Scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrans l X Ġ= Ġtotal Scale Ġ* Ġ( m Drawable Rect !!. center X () Ġ- Ġcurrent Rect . left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrans l Y Ġ= Ġtotal Scale Ġ* Ġ( m Drawable Rect !!. center Y () Ġ- Ġcurrent Rect . top ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Matrix . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Matrix . post Translate (- m Drawable Rect !!. width () Ġ/ Ġ 2 , Ġ- m Drawable Rect !!. height () Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Matrix . post Scale ( total Scale , Ġtotal Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Matrix . post Translate ( trans l X , Ġtrans l Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Matrix Ġ= Ġm Matrix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Elapsed Time Ġ>= ĠmCurrent Trans !!. duration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfire Transition End ( m Current Trans ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart New Transition () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfire Transition End ( m Current Trans ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Frame Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate Delayed ( FRAME _ DELAY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart New Transition () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Bounds ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠmCurrent Trans Ġ= Ġm Trans Gen . generate Next Transition ( m Drawable Rect , Ġm Viewport Rect ) ĊĠĠĠĠĠĠĠ Ġm Elapsed Time Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġm Last Frame Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġfire Transition Start ( m Current Trans ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestart () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ== Ġ 0 Ġ|| Ġheight Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Viewport ( width . toFloat (), Ġheight . toFloat ()) ĊĠĠĠĠĠĠĠ Ġupdate Drawable Bounds () ĊĠĠĠĠĠĠĠ Ġstart New Transition () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Bounds (): ĠBoolean Ġ= Ġ! m Viewport Rect . isEmpty ĊĊĠĠĠ Ġprivate Ġfun Ġfire Transition Start ( transition : ĠTransition ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Transition Listener Ġ!= Ġnull Ġ&& Ġtransition Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Transition Listener !!. on Transition Start ( transition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfire Transition End ( transition : ĠTransition ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Transition Listener Ġ!= Ġnull Ġ&& Ġtransition Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Transition Listener !!. on Transition End ( transition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Transition Generator ( trans gen : ĠTransition Generator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Trans Gen Ġ= Ġtrans gen ĊĠĠĠĠĠĠĠ Ġstart New Transition () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Viewport ( width : ĠFloat , Ġheight : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Viewport Rect . set ( 0 f , Ġ 0 f , Ġwidth , Ġheight ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Drawable Bounds () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Drawable Rect Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drawable Rect Ġ= ĠRect F () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġdrawable ĊĠĠĠĠĠĠĠ Ġif Ġ( d Ġ!= Ġnull Ġ&& Ġd . intrinsic Height Ġ> Ġ 0 Ġ&& Ġd . intrinsic Width Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drawable Rect !!. set ( 0 f , Ġ 0 f , Ġd . intrinsic Width . toFloat (), Ġd . intrinsic Height . toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Image Change () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Drawable Bounds () ĊĠĠĠĠĠĠĠ Ġstart New Transition () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġset Transition Listener ( transition Listener : ĠTransition Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Transition Listener Ġ= Ġtransition Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Paused Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresume () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Paused Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġm Last Frame Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠTransition Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Transition Start ( transition : ĠTransition ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Transition End ( transition : ĠTransition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFRAME _ DELAY Ġ= Ġ( 1 0 0 0 Ġ/ Ġ 6 0 ). to Long () ĊĠĠĠ Ġ} Ċ } Ċ