/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . compose . ui . tool ing . preview . animation Ċ Ċ import Ġandroidx . compose . animation . animate Color Ċ import Ġandroidx . compose . animation . core . Internal Animation Api Ċ import Ġandroidx . compose . animation . core . Linear E asing Ċ import Ġandroidx . compose . animation . core . Transition Ċ import Ġandroidx . compose . animation . core . animate Float Ċ import Ġandroidx . compose . animation . core . t ween Ċ import Ġandroidx . compose . animation . core . update Transition Ċ import Ġandroidx . compose . animation . tool ing . Compose Animation Ċ import Ġandroidx . compose . animation . tool ing . Compose Animation Type Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . test . junit 4 . create Compose Rule Ċ import Ġandroidx . test . filters . Medium Test Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertFalse Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Ignore Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ Ċ @ Medium Test Ċ @ Opt In ( Internal Animation Api :: class ) Ċ class ĠPreview Animation Clock Test Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġcompose Rule Ġ= Ġcreate Compose Rule () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtest Clock : ĠTest Preview Animation Clock ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Clock Ġ= ĠTest Preview Animation Clock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcallback Called When Setting Clock Time () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcallback Called Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġclock Ġ= ĠTest Preview Animation Clock Ġ{ Ġcallback Called Count ++ Ġ} ĊĠĠĠĠĠĠĠ Ġclock . set Clock Time ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġclock . set Clock Time ( 2 0 ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcallback Called Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ignore (" b / 1 7 8 9 1 0 7 3 0 ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Animated Properties Returns Values At Current Time () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġrotation Animation : ĠCompose Animation ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Animation : ĠCompose Animation ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġcompose Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Animation Ġ= ĠsetUp Rotation Color Scenario () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Animation Ġ= ĠsetUp Offset Scenario () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcompose Rule . waitFor Idle () ĊĊĠĠĠĠĠĠĠ Ġtest Clock . set Clock Time ( 2 0 0 ) ĊĠĠĠĠĠĠĠ Ġvar Ġanimated Properties Ġ= Ġtest Clock . get Animated Properties ( rotation Animation !! ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġanimated Properties . single Ġ{ Ġit . label Ġ== Ġ" my Rotation " Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġanim ating Ġfrom ĠRC 1 Ġ( 0 Ġdegrees ) Ġto ĠRC 3 Ġ( 3 6 0 Ġdegrees ). ĠThere Ġis Ġa Ġtransition Ġof ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 0 0 0 ms Ġdefined Ġfor Ġthe Ġrotation , Ġand Ġwe Ġset Ġthe Ġclock Ġto Ġ 2 0 % Ġof Ġthis Ġtime . ĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 2 f , Ġrotation . value Ġas ĠFloat , Ġeps ) ĊĊĠĠĠĠĠĠĠ Ġanimated Properties Ġ= Ġtest Clock . get Animated Properties ( offset Animation !! ) ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġanimated Properties . single () ĊĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġanim ating Ġfrom ĠO 1 Ġ( 0 ) Ġto ĠO 2 Ġ( 1 0 0 ). ĠThere Ġis Ġa Ġtransition Ġof Ġ 8 0 0 ms Ġdefined Ġfor ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġoffset , Ġand Ġwe Ġset Ġthe Ġclock Ġto Ġ 2 5 % Ġof Ġthis Ġtime . ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 5 f , Ġoffset . value Ġas ĠFloat , Ġeps ) ĊĊĠĠĠĠĠĠĠ Ġtest Clock . set Clock Time ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġanimated Properties Ġ= Ġtest Clock . get Animated Properties ( rotation Animation !! ) ĊĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġanimated Properties . single Ġ{ Ġit . label Ġ== Ġ" border Color " Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġanim ating Ġfrom ĠRC 1 Ġ( Red ) Ġto ĠRC 3 Ġ( Green ), Ġ 1 0 0 0 ms Ġbeing Ġthe Ġanimation Ġduration . ĊĠĠĠĠĠĠĠ ĠassertEquals ( Color . Blue , Ġcolor . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ignore (" b / 1 7 8 9 1 0 7 3 0 ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmax Duration Returns Lon gest Duration () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthere Ġare Ġno Ġanimations , Ġwe Ġshould Ġreturn Ġan Ġinvalid Ġduration . ĊĠĠĠĠĠĠĠ ĠassertTrue ( test Clock . getMax Duration () Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcompose Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetUp Rotation Color Scenario () Ġ// Ġ 1 0 0 0 ms ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetUp Offset Scenario () Ġ// Ġ 8 0 0 ms ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcompose Rule . waitFor Idle () ĊĠĠĠĠĠĠĠ Ġtest Clock . set Clock Time ( 0 L ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 0 0 , Ġtest Clock . getMax Duration ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdispose Should Notify Un subscribed () Ġ{ ĊĠĠĠĠĠĠĠ Ġcompose Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Clock . track Transition ( update Transition ( Any ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Clock . track Transition ( update Transition ( Any ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcompose Rule . waitFor Idle () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġtest Clock . notify Subscribe Count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġtest Clock . notify Un subscribe Count ) ĊĊĠĠĠĠĠĠĠ Ġtest Clock . dispose () Ġ// Ġdispose () Ġshould Ġunsubscribe Ġall Ġtracked Ġanimations ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġtest Clock . notify Un subscribe Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtrack Transition Should Notify Sub scribed () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġtest Clock . notify Subscribe Count ) ĊĠĠĠĠĠĠĠ Ġcompose Rule . setContent Ġ{ ĠsetUp Offset Scenario () Ġ} ĊĠĠĠĠĠĠĠ Ġcompose Rule . waitFor Idle () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġtest Clock . notify Subscribe Count ) ĊĠĠĠĠĠĠĠ Ġval Ġsubscribed Animation Ġ= Ġtest Clock . subscribed Animation ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġanimation Ġis Ġa Ġtransition Ġanimation ĊĠĠĠĠĠĠĠ ĠassertEquals ( Compose Animation Type . TRANS ITION _ ANIM ATION , Ġsubscribed Animation . type ) ĊĠĠĠĠĠĠĠ Ġval Ġstates Ġ= Ġsubscribed Animation . states ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġstates . size ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( states . contains ( Offset . O 1 )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( states . contains ( Offset . O 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdispose Clear s Cached Animations () Ġ{ ĊĠĠĠĠĠĠĠ Ġcompose Rule . setContent Ġ{ ĠsetUp Offset Scenario () Ġ} ĊĠĠĠĠĠĠĠ Ġcompose Rule . waitFor Idle () ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( test Clock . tracked Transitions . isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertFalse ( test Clock . transition States . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġtest Clock . dispose () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( test Clock . tracked Transitions . isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( test Clock . transition States . isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġupdate From And To States Mod ifies Cached Transition States () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġanimation : ĠCompose Animation ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcompose Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Ġ= ĠsetUp Rotation Color Scenario () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcompose Rule . waitFor Idle () ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Before Update Ġ= Ġtest Clock . transition States . values . single () ĊĠĠĠĠĠĠĠ ĠassertEquals ( Rotation Color . RC 1 , Ġstate Before Update . current ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Rotation Color . RC 3 , Ġstate Before Update . target ) ĊĊĠĠĠĠĠĠĠ Ġtest Clock . update From And To States ( animation !! , ĠRotation Color . RC 2 , ĠRotation Color . RC 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstate After Update Ġ= Ġtest Clock . transition States . values . single () ĊĠĠĠĠĠĠĠ ĠassertEquals ( Rotation Color . RC 2 , Ġstate After Update . current ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Rotation Color . RC 1 , Ġstate After Update . target ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġanimation Label IsSet Explicit ly Or Implicit ly () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsome State Ġ= ĠAny () ĊĠĠĠĠĠĠĠ Ġcompose Rule . setContent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Ġ= Ġupdate Transition ( some State , Ġ" My Ġanimation Ġlabel ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Clock . track Transition ( transition ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetUp Offset Scenario () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcompose Rule . waitFor Idle () ĊĠĠĠĠĠĠĠ Ġval Ġanimation With Label Ġ= Ġtest Clock . tracked Transitions . keys . single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . states . contains ( some State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠLabel Ġexplicitly Ġset ĊĠĠĠĠĠĠĠ ĠassertEquals (" My Ġanimation Ġlabel ", Ġanimation With Label . label ) ĊĊĠĠĠĠĠĠĠ Ġval Ġanimation Without Label Ġ= Ġtest Clock . tracked Transitions . keys . single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . states . contains ( Offset . O 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠLabel Ġis Ġnot Ġexplicitly Ġset , Ġbut Ġinferred Ġfrom Ġthe Ġstate Ġtype ĊĠĠĠĠĠĠĠ ĠassertEquals (" Offset ", Ġanimation Without Label . label ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSets Ġup Ġa Ġtransition Ġanimation Ġscenario , Ġgoing Ġfrom ĠRotation Color . RC 1 Ġto ĠRotation Color . RC 3 . ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġprivate Ġfun ĠsetUp Rotation Color Scenario (): ĠCompose Animation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransition Ġ= Ġupdate Transition ( Rotation Color . RC 1 ) ĊĠĠĠĠĠĠĠ Ġtransition . animate Float ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ" my Rotation ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Spec Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ween ( duration Millis Ġ= Ġ 1 0 0 0 , Ġeasing Ġ= ĠLinear E asing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRotation Color . RC 1 Ġ-> Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRotation Color . RC 2 Ġ-> Ġ 1 8 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRotation Color . RC 3 Ġ-> Ġ 3 6 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtransition . animate Color ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ" border Color ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Spec Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ween ( duration Millis Ġ= Ġ 1 0 0 0 , Ġeasing Ġ= ĠLinear E asing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRotation Color . RC 1 Ġ-> ĠColor . Red ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRotation Color . RC 2 Ġ-> ĠColor . Green ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRotation Color . RC 3 Ġ-> ĠColor . Blue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Clock . track Transition ( transition Ġas ĠTransition < Any >) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= Ġtest Clock . tracked Transitions . keys . single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . states . contains ( Rotation Color . RC 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtest Clock . update From And To States ( animation , ĠRotation Color . RC 1 , ĠRotation Color . RC 3 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġanimation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSets Ġup Ġa Ġtransition Ġanimation Ġscenario , Ġgoing Ġfrom Ġfrom ĠOffset . O 1 Ġto ĠOffset . O 2 . ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġprivate Ġfun ĠsetUp Offset Scenario (): ĠCompose Animation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransition Ġ= Ġupdate Transition ( Offset . O 1 ) ĊĠĠĠĠĠĠĠ Ġtransition . animate Float ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Ġ= Ġ" my Offset ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Spec Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ween ( duration Millis Ġ= Ġ 8 0 0 , Ġeasing Ġ= ĠLinear E asing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOffset . O 1 Ġ-> Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOffset . O 2 Ġ-> Ġ 1 0 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest Clock . track Transition ( transition Ġas ĠTransition < Any >) ĊĠĠĠĠĠĠĠ Ġval Ġanimation Ġ= Ġtest Clock . tracked Transitions . keys . single Ġ{ Ġit . states . contains ( Offset . O 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġtest Clock . update From And To States ( animation , ĠOffset . O 1 , ĠOffset . O 2 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġanimation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠTest Preview Animation Clock ( set Clock Time Callback : Ġ() Ġ-> ĠUnit Ġ= Ġ{}) Ġ: ĊĠĠĠĠĠĠĠ ĠPreview Animation Clock ( set Clock Time Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġsubscribed Animation : ĠCompose Animation ĊĠĠĠĠĠĠĠ Ġvar Ġnotify Subscribe Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnotify Un subscribe Count Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnotify Subscribe ( animation : ĠCompose Animation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Animation Ġ= Ġanimation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Subscribe Count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnotify Un subscribe ( animation : ĠCompose Animation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Un subscribe Count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġenum Ġclass ĠOffset Ġ{ ĠO 1 , ĠO 2 Ġ} Ċ Ċ private Ġenum Ġclass ĠRotation Color Ġ{ ĠRC 1 , ĠRC 2 , ĠRC 3 Ġ} Ċ Ċ private Ġconst Ġval Ġeps Ġ= Ġ 0 . 0 0 0 0 1 f