package Ġcom . lh . k ete . views Ċ Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġjava . util .* ĊĊ Ċ class ĠAnimation Drawable ( view : ĠView ) Ġ{ ĊĠĠĠ Ġ// ĠSet Ġc á»© ng Ġ ĠcÃ¡c Ġth u á»Ļ c Ġt ÃŃ nh Ġanimation ĊĠĠĠ Ġprivate Ġval ĠMAX _ ANIM ATION _ TIME Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġprivate Ġval ĠMIL IS _ PER _ FRAME Ġ= Ġ 1 0 0 0 Ġ/ Ġ 6 0 f ĊĠĠĠ Ġprivate Ġval ĠNE ON _ COLOR Ġ= ĠColor . parse Color ("# 3 9 ff 1 4 ") ĊĠĠĠ Ġprivate Ġval Ġm Points : ĠLinkedList < Pair < Pair < Float , ĠFloat >, ĠLong >> Ġ= ĠLinkedList () ĊĠĠĠ Ġprivate Ġval Ġview Context : ĠView Ġ= Ġview ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠAnimation Drawable :: class . java . canonical Name ĊĊĠĠĠ Ġfun Ġadd Next Point ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Next Point ( x , Ġy , ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠ Ġinvalidate Self () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Points . isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( canvas Ġ== Ġnull Ġ|| Ġhas Done ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= Ġ 1 5 f ĊĠĠĠĠĠĠĠ Ġpaint . path Effect Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . ST RO KE ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġm Points . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġget Color From Point ( m Points [ i Ġ+ Ġ 1 ], ĠcurrentTime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Points [ i ]. first . first , Ġm Points [ i ]. first . second , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Points [ i Ġ+ Ġ 1 ]. first . first , Ġm Points [ i Ġ+ Ġ 1 ]. first . second , Ġpaint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinvalidate Self () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Done (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Points . size Ġ< Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Points . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinvalidate Self () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIn validate Ġtime ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġm Points . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġit . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentTime Ġ- Ġpoint . second Ġ> ĠMAX _ ANIM ATION _ TIME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Points . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġrequire Ġview . invalidate ĊĠĠĠĠĠĠĠ Ġview Context . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Color From Point ( point : ĠPair < Pair < Float , ĠFloat >, ĠLong >, ĠcurrentTime : ĠLong ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Passed Ġ= ĠcurrentTime Ġ- Ġpoint . second ĊĠĠĠĠĠĠĠ Ġval Ġalpha F Ġ= ĠMath . min ( time Passed Ġ/ ĠMAX _ ANIM ATION _ TIME . toFloat (), Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġval Ġalpha Ġ= Ġ(( 1 Ġ- Ġalpha F ) Ġ* Ġ 2 5 5 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠColor . red ( NEON _ COLOR ) ĊĠĠĠĠĠĠĠ Ġval Ġg Ġ= ĠColor . green ( NEON _ COLOR ) ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠColor . blue ( NEON _ COLOR ) ĊĠĠĠĠĠĠĠ Ġreturn ĠColor . arg b ( alpha , Ġr , Ġg , Ġb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Next Point ( x : ĠFloat , Ġy : ĠFloat , Ġtime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Points . size Ġ> Ġ 0 Ġ&& Ġtime Ġ- Ġm Points . last . second Ġ< ĠMIL IS _ PER _ FRAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġposition Pair Ġ= ĠPair ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= ĠPair ( position Pair , Ġtime ) ĊĠĠĠĠĠĠĠ Ġm Points . add ( point ) ĊĠĠĠ Ġ} Ċ }