package Ġapp li key solutions . com . moon refresh Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Anim atable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . view . animation . Accel erate Interpolator Ċ import Ġandroid . view . animation . De cel erate Interpolator Ċ import Ġapp li key solutions . com . moon refresh . Constants . Companion . DURATION _ FIN ISH Ċ import Ġapp li key solutions . com . moon refresh . Constants . Companion . ST RO KE _ WIDTH Ċ import Ġapp li key solutions . com . moon refresh . Constants . Companion . TARGET _ DEG REE Ċ import Ġjava . util .* ĊĊ Ċ class ĠMo on Refresh View Ġconstructor ( layout : ĠMo on Refresh ) Ġ: ĠDrawable (), ĠAnim atable Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpath Ġ= ĠPath () ĊĠĠĠ Ġprivate Ġval Ġback Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġfront Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġouter Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġfinish Paint Ġ= ĠPaint () ĊĊĠĠĠ Ġprivate Ġval ĠlistOf Points Ġ= ĠArrayList < PointF >() ĊĊĠĠĠ Ġprivate Ġvar Ġwave Height Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġspring Ratio Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġfinish Ratio Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġb oll Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġb oll Radius Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġhead Height Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġscreen Width Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġrefresh Stop Ġ= Ġ 9 0 ĊĠĠĠ Ġprivate Ġvar Ġrefresh Start Ġ= Ġ 9 0 ĊĠĠĠ Ġprivate Ġvar Ġinte Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġshow B oll Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġshow Outer Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġshow B oll Tail Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġouter Is Start Ġ= Ġtrue ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout . post Ġ{ Ġinitiate Dim ens ( layout . width ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġback Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfront Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwith ( finish Paint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= ĠST RO KE _ WIDTH . toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith ( outer Paint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= ĠST RO KE _ WIDTH . toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Bounds ( left : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setBounds ( left , Ġtop , Ġright , Ġtop ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Running (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstart () Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdraw Wave ( canvas , Ġhead Height ) ĊĠĠĠĠĠĠĠ Ġdraw Spring Up ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw B oll ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Outer ( canvas ) ĊĠĠĠĠĠĠĠ Ġdraw Finish ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Opacity (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPixel Format . TRANSL UC ENT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Alpha ( alpha : ĠInt ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġset Color Filter ( cf : ĠColor Filter ?) Ġ{} ĊĊĠĠĠ Ġfun Ġset BackgroundColor ( backgroundColor : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġback Paint . color Ġ= ĠbackgroundColor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Ball Color ( ball Color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfront Paint . color Ġ= Ġball Color ĊĠĠĠĠĠĠĠ Ġouter Paint . color Ġ= Ġball Color ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Finish Color ( finish Color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfinish Paint . color Ġ= Ġfinish Color ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Pull ing Down ( head Height : ĠInt , Ġoffset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . head Height Ġ= Ġhead Height ĊĠĠĠĠĠĠĠ Ġwave Height Ġ= ĠMath . max ( offset Ġ- Ġhead Height , Ġ 0 ) Ġ* Ġ. 8 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Pull ing Top ( head Height : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . head Height Ġ= Ġhead Height ĊĠĠĠĠĠĠĠ Ġinvalidate Self () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Refresh Released () Ġ{ ĊĠĠĠĠĠĠĠ Ġb oll Radius Ġ= Ġ( head Height Ġ/ Ġ 6 ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġinterpol ator Ġ= ĠDec el erate Interpolator () ĊĠĠĠĠĠĠĠ Ġval Ġre bound Height Ġ= ĠMath . min ( wave Height Ġ* Ġ 0 . 8 f , Ġ( head Height Ġ/ Ġ 2 ). toFloat ()) ĊĠĠĠĠĠĠĠ Ġval Ġwave Animator Ġ= ĠValue Animator . of Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave Height , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-( re bound Height Ġ* Ġ 1 . 0 f ), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-( re bound Height Ġ* Ġ 0 . 4 f ), Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwave Animator . add Update Listener ( object Ġ: ĠValue Animator . Animator Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġspeed Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġspring B oll Y : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġspring Ratio Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġspring Status Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Update ( animation : ĠValue Animator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Value Ġ= Ġanimation . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( spring Status Ġ== Ġ 0 Ġ&& Ġcur Value Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspring Status Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= ĠMath . abs ( cur Value Ġ- Ġwave Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( spring Status Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspring Ratio Ġ= Ġ- cur Value Ġ/ Ġre bound Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( spring Ratio Ġ>= Ġthis @ Moon Refresh View . spring Ratio ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Moon Refresh View . spring Ratio Ġ= Ġspring Ratio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oll Y Ġ= Ġhead Height Ġ+ Ġcur Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeed Ġ= ĠMath . abs ( cur Value Ġ- Ġwave Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspring Status Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Moon Refresh View . spring Ratio Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow B oll Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow B oll Tail Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspring B oll Y Ġ= Ġb oll Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( spring Status Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b oll Y Ġ> Ġhead Height Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oll Y Ġ= ĠMath . max (( head Height Ġ/ Ġ 2 ). toFloat (), Ġb oll Y Ġ- Ġspeed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbol ly Ġ= Ġanimation . animated Fraction Ġ* Ġ( head Height Ġ/ Ġ 2 Ġ- Ġspring B oll Y ) Ġ+ Ġspring B oll Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b oll Y Ġ> Ġbol ly ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oll Y Ġ= Ġbol ly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show B oll Tail Ġ&& Ġcur Value Ġ< Ġwave Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Outer Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow B oll Tail Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Is Start Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Start Ġ= Ġ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Stop Ġ= Ġ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave Height Ġ= Ġcur Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġwave Animator . interpol ator Ġ= Ġinterpol ator ĊĠĠĠĠĠĠĠ Ġwave Animator . duration Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġwave Animator . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Finish ( callback : ĠFinish Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġshow Outer Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġshow B oll Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġanim ator Ġ= ĠValue Animator . of Float ( 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġanim ator . add Update Listener Ġ{ Ġanimation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Ratio Ġ= Ġanimation . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanim ator . interpol ator Ġ= ĠAccel erate Interpolator () ĊĠĠĠĠĠĠĠ Ġanim ator . duration Ġ= ĠD URATION _ FIN ISH . to Long () ĊĠĠĠĠĠĠĠ Ġanim ator . start () ĊĠĠĠĠĠĠĠ Ġanim ator . addListener ( object Ġ: ĠAn imator . Animator Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . apply () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( animation : ĠAn imator ) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠAn imator ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinvalidate () Ġ{ ĊĠĠĠĠĠĠĠ Ġinvalidate Self () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitiate Dim ens ( view Width : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view Width Ġ<= Ġ 0 Ġ|| Ġview Width Ġ== Ġscreen Width ) Ġreturn ĊĠĠĠĠĠĠĠ Ġscreen Width Ġ= Ġview Width ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Finish ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( finish Ratio Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbefore Color Ġ= Ġouter Paint . color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( finish Ratio Ġ< Ġ 0 . 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle (( canvas . width Ġ/ Ġ 2 ). toFloat (), Ġb oll Y , Ġb oll Radius , Ġfront Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter R Ġ= Ġ( b oll Radius Ġ+ Ġouter Paint . stroke Width Ġ* Ġ 2 f Ġ* Ġ( 1 Ġ+ Ġfinish Ratio Ġ/ Ġ 0 . 3 f )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Paint . color Ġ= Ġfinish Paint . color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Arc ( Rect F (( canvas . width Ġ/ Ġ 2 Ġ- Ġouter R ). toFloat (), Ġb oll Y Ġ- Ġouter R , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( canvas . width Ġ/ Ġ 2 Ġ+ Ġouter R ). toFloat (), Ġb oll Y Ġ+ Ġouter R ), Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 6 0 f , Ġfalse , Ġouter Paint ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Line ( canvas , Ġcanvas . width Ġ/ Ġ 2 Ġ+ Ġb oll Radius Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oll Y Ġ- Ġb oll Radius Ġ/ Ġ 5 , Ġcanvas . width Ġ/ Ġ 2 Ġ- Ġb oll Radius Ġ/ Ġ 1 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oll Y Ġ+ Ġb oll Radius Ġ/ Ġ 3 , Ġcanvas . width Ġ/ Ġ 2 Ġ- Ġb oll Radius Ġ/ Ġ 1 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oll Y Ġ+ Ġb oll Radius Ġ/ Ġ 3 , Ġcanvas . width Ġ/ Ġ 2 Ġ- Ġb oll Radius Ġ/ Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oll Y Ġ+ Ġb oll Radius Ġ/ Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter Paint . color Ġ= Ġbefore Color ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( finish Ratio Ġ>= Ġ 0 . 3 Ġ&& Ġfinish Ratio Ġ< Ġ 0 . 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfraction Ġ= Ġ( finish Ratio Ġ- Ġ 0 . 3 f ) Ġ/ Ġ 0 . 4 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oll Y Ġ= Ġ( head Height Ġ/ Ġ 2 Ġ+ Ġ( head Height Ġ- Ġhead Height Ġ/ Ġ 2 ) Ġ* Ġfraction ). toInt (). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle (( canvas . width Ġ/ Ġ 2 ). toFloat (), Ġb oll Y , Ġb oll Radius , Ġfront Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b oll Y Ġ>= Ġhead Height Ġ- Ġb oll Radius Ġ* Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow B oll Tail Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw B oll Tail ( canvas , Ġcanvas . width , Ġfraction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow B oll Tail Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( finish Ratio Ġin Ġ 0 . 7 .. 1 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfraction Ġ= Ġ( finish Ratio Ġ- Ġ 0 . 7 f ) Ġ/ Ġ 0 . 3 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft X Ġ= Ġ(( canvas . width Ġ/ Ġ 2 ). toFloat () Ġ- Ġb oll Radius Ġ- Ġ 2 f Ġ* Ġb oll Radius Ġ* Ġfraction ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( left X . toFloat (), Ġhead Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . quad To (( canvas . width Ġ/ Ġ 2 ). toFloat (), Ġhead Height Ġ- Ġb oll Radius Ġ* Ġ( 1 Ġ- Ġfraction ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( canvas . width Ġ- Ġleft X ). toFloat (), Ġhead Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( path , Ġfront Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Wave ( canvas : ĠCanvas , Ġview Height : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbase Height Ġ= ĠMath . min ( head Height , Ġview Height ). toFloat () ĊĠĠĠĠĠĠĠ Ġif Ġ( wave Height Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( canvas . width . toFloat (), Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( canvas . width . toFloat (), Ġbase Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . quad To (( canvas . width Ġ/ Ġ 2 ). toFloat (), Ġbase Height Ġ+ Ġwave Height Ġ* Ġ 2 , Ġ 0 f , Ġbase Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( path , Ġback Paint ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( 0 f , Ġ 0 f , Ġcanvas . width . toFloat (), Ġbase Height , Ġback Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Spring Up ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( spring Ratio Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft X Ġ= Ġcanvas . width Ġ/ Ġ 2 Ġ- Ġ 4 Ġ* Ġb oll Radius Ġ+ Ġspring Ratio Ġ* Ġ 3 f Ġ* Ġb oll Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( spring Ratio Ġ< Ġ 0 . 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( left X , Ġb oll Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . quad To (( canvas . width Ġ/ Ġ 2 ). toFloat (), Ġb oll Y Ġ- Ġb oll Radius Ġ* Ġspring Ratio Ġ* Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . width Ġ- Ġleft X , Ġb oll Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( path , Ġfront Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle (( canvas . width Ġ/ Ġ 2 ). toFloat (), Ġb oll Y , Ġb oll Radius , Ġfront Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw B oll ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( show B oll ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle (( canvas . width Ġ/ Ġ 2 ). toFloat (), Ġb oll Y , Ġb oll Radius , Ġfront Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw B oll Tail ( canvas , Ġcanvas . width , Ġ( head Height Ġ+ Ġwave Height ) Ġ/ Ġhead Height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw B oll Tail ( canvas : ĠCanvas , Ġview Width : ĠInt , Ġfraction : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( show B oll Tail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġhead Height Ġ+ Ġwave Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġb oll Y Ġ+ Ġb oll Radius Ġ* Ġfraction Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart X Ġ= Ġview Width Ġ/ Ġ 2 Ġ+ ĠMath . sqrt (( b oll Radius Ġ* Ġb oll Radius Ġ* Ġ( 1 Ġ- Ġfraction Ġ* Ġfraction Ġ/ Ġ 4 )). toDouble ()). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe zier 1 x Ġ= Ġview Width Ġ/ Ġ 2 Ġ+ Ġb oll Radius Ġ* Ġ 3 Ġ/ Ġ 4 Ġ* Ġ( 1 Ġ- Ġfraction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe zier 2 x Ġ= Ġbe zier 1 x Ġ+ Ġb oll Radius ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( start X , Ġstart Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . quad To ( bezier 1 x , Ġbottom , Ġbe zier 2 x , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( view Width Ġ- Ġbe zier 2 x , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . quad To ( view Width Ġ- Ġbe zier 1 x , Ġbottom , Ġview Width Ġ- Ġstart X , Ġstart Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( path , Ġfront Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Outer ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( show Outer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter R Ġ= Ġb oll Radius Ġ+ Ġouter Paint . stroke Width Ġ* Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Start Ġ+= Ġif Ġ( outer Is Start ) Ġ 3 Ġelse Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Stop Ġ+= Ġif Ġ( outer Is Start ) Ġ 1 0 Ġelse Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Start Ġ% = Ġ 3 6 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Stop Ġ% = Ġ 3 6 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġswipe Ġ= Ġrefresh Stop Ġ- Ġrefresh Start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Ġ= Ġif Ġ( swipe Ġ< Ġ 0 ) Ġswipe Ġ+ Ġ 3 6 0 Ġelse Ġswipe ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Arc ( Rect F ( canvas . width Ġ/ Ġ 2 Ġ- Ġouter R , Ġb oll Y Ġ- Ġouter R , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . width Ġ/ Ġ 2 Ġ+ Ġouter R , Ġb oll Y Ġ+ Ġouter R ), Ġrefresh Start . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe . toFloat (), Ġfalse , Ġouter Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( swipe Ġ>= ĠTARGET _ DEG REE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Is Start Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( swipe Ġ<= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Is Start Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Line ( canvas : ĠCanvas , Ġstart First Line X : ĠFloat , Ġstart First Line Y : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish First Line X : ĠFloat , Ġfinish First Line Y : ĠFloat , Ġstart Sec Line X : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Sec Line Y : ĠFloat , Ġfinish Sec Line X : ĠFloat , Ġfinish Sec Line Y : ĠFloat ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfill Points To Draw ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart First Line X , Ġstart First Line Y , Ġfinish First Line X , Ġfinish First Line Y , Ġstart Sec Line X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Sec Line Y , Ġfinish Sec Line X , Ġfinish Sec Line Y ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmy Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġwith ( my Paint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġfinish Paint . color ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġ 5 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( inte Ġ< ĠlistOf Points . size Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( listOf Points [ 0 ]. x , ĠlistOf Points [ 0 ]. y , ĠlistOf Points [ inte ]. x , ĠlistOf Points [ inte ]. y , Ġmy Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinte ++ ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( start First Line X , Ġstart First Line Y , Ġfinish First Line X , Ġfinish First Line Y , Ġmy Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inte Ġ>= ĠlistOf Points . size Ġ/ Ġ 2 Ġ&& Ġinte Ġ< ĠlistOf Points . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( listOf Points [ 6 ]. x , ĠlistOf Points [ 6 ]. y , ĠlistOf Points [ inte ]. x , ĠlistOf Points [ inte ]. y , Ġmy Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinte ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( start First Line X , Ġstart First Line Y , Ġfinish First Line X , Ġfinish First Line Y , Ġmy Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( start Sec Line X , Ġstart Sec Line Y , Ġfinish Sec Line X , Ġfinish Sec Line Y , Ġmy Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill Points To Draw ( start First Line X : ĠFloat , Ġstart First Line Y : ĠFloat , Ġfinish First Line X : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish First Line Y : ĠFloat , Ġstart Sec Line X : ĠFloat , Ġstart Sec Line Y : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Sec Line X : ĠFloat , Ġfinish Sec Line Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf Points . clear () ĊĠĠĠĠĠĠĠ Ġ( 1 .. 6 ). map To ( listOf Points ) Ġ{ ĠPoint F ( start First Line X Ġ+ Ġit Ġ* Ġ( finish First Line X Ġ- Ġstart First Line X ) Ġ/ Ġ 6 , Ġstart First Line Y Ġ+ Ġit Ġ* Ġ( finish First Line Y Ġ- Ġstart First Line Y ) Ġ/ Ġ 6 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ( 1 .. 6 ). map To ( listOf Points ) Ġ{ ĠPoint F ( start Sec Line X Ġ+ Ġit Ġ* Ġ( finish Sec Line X Ġ- Ġstart Sec Line X ) Ġ/ Ġ 6 , Ġstart Sec Line Y Ġ+ Ġit Ġ* Ġ( finish Sec Line Y Ġ- Ġstart Sec Line Y ) Ġ/ Ġ 6 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠFinish Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġapply () ĊĠĠĠ Ġ} Ċ } Ċ