package Ġcom . example . app . calculator Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ Ċ import Ġcom . drawable .* Ċ import Ġcom . util . Color Ċ import Ġcom . util . Gravity Ċ Ċ import Ġcom . util . Utility . getRandom Int Ċ Ċ class ĠGr avity Sim ( context : ĠContext ) Ġ: ĠView ( context ), ĠRunnable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġshape Arr : ĠArray < Drawable > Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCircle ( 1 0 0 . 0 , Ġ 1 0 0 . 0 , Ġ 4 0 . 0 , ĠColor . parse Color ("# 3 3 c 4 4 6 "), Ġ 2 . 0 , Ġ 0 . 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCircle ( 2 0 0 . 0 , Ġ 1 0 0 . 0 , Ġ 4 0 . 0 , ĠColor . RED , Ġ 2 . 0 , Ġ 0 . 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSquare ( 3 0 0 . 0 , Ġ 1 0 0 . 0 , Ġ 5 0 , ĠColor . MAG ENT A ), ĠRight Triangle ( 1 0 0 . 0 , Ġ 1 0 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ArrayOf ( 7 5 . 0 , Ġ 7 5 . 0 ), ĠColor . parse Color ("# 0 6 7 5 d 1 "), Ġ 2 . 0 , Ġ 0 . 0 ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġvar Ġstart Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠ Ġprivate Ġvar Ġdistance Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġgravity Manager : ĠGr avity ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġgravity Manager Ġ= ĠGr avity ( shape Arr , Ġ 0 . 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġe . x ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġe . y ĊĠĠĠĠĠĠĠ Ġval Ġstart : ĠLong ĊĠĠĠĠĠĠĠ Ġval Ġstop : ĠLong ĊĊĠĠĠĠĠĠĠ Ġif Ġ( e . action Ġ== ĠMotion Event . ACTION _ DOWN Ġ|| Ġe . action Ġ== ĠMotion Event . ACTION _ MOVE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . count Ġ< Ġ 1 ) Ġthis . start Ġ= Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( d Ġin Ġshape Arr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . x Ġ= Ġx . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . y Ġ= Ġy . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d Ġis ĠComplex Drawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . x 2 Ġ= Ġd . x Ġ+ Ġ( d . x 2 Ġ- Ġd . x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . y 2 Ġ= Ġd . y Ġ+ Ġ( d . y 2 Ġ- Ġd . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . action Ġ== ĠMotion Event . ACTION _ MOVE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . distance Ġ+= Ġ 1 0 0 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( e . action Ġ== ĠMotion Event . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Elapsed Ġ= Ġstop Ġ- Ġthis . start Ġ+ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtemp Ġ= ĠgetRandom Int ( 1 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( d Ġin Ġshape Arr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Ġ> Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . x Velocity Ġ= Ġ( this . distance Ġ/ Ġtime Elapsed ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= ĠgetRandom Int ( 1 , Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . x Velocity Ġ= Ġ(- ( this . distance Ġ/ Ġtime Elapsed )). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Ġ= ĠgetRandom Int ( 6 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . y Velocity Ġ= Ġ( if Ġ( getRandom Int ( 1 , Ġ 1 0 ) Ġ> Ġ 5 ) Ġthis . distance Ġ/ Ġtime Elapsed Ġelse Ġ-( this . distance Ġ/ Ġtime Elapsed )). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . distance Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġperform Click () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġperform Click (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . perform Click () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( d Ġin Ġshape Arr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd . draw ( canvas , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgravity Manager . start ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep (( 1 0 0 0 Ġ/ Ġ 6 0 ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }