package Ġcom . d fl aming o . w eca ht wave . widget Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . floor Ċ import Ġkotlin . math . sin Ċ Ċ class ĠRecord Wave View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġis D ither Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . parse Color ("# 7 4 B 3 FF ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġline Height Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġstart Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġidea Height Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġdensity Ġ= Ġ 0 f ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdensity Ġ= Ġresources . display Metrics . density ĊĠĠĠĠĠĠĠ Ġidea Height Ġ= Ġdensity Ġ* Ġ 3 ĊĠĠĠĠĠĠĠ Ġline Height Ġ= Ġdensity Ġ* Ġ 3 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ) ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġfloor (( w Ġ/ Ġ( density Ġ* Ġ 3 )). toDouble ()). toInt () ĊĠĠĠĠĠĠĠ Ġif Ġ( count . rem ( 2 ) Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstart Ġ= Ġ( w Ġ- Ġcount Ġ* Ġline Height ) Ġ/ Ġ 2 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġdegrees Ġ= Ġ 0 . 0 ĊĊĠĠĠ Ġprivate Ġvar ĠcurrentIndex Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ ä¸Ńå¿ĥ çĤ¹ , åģļ åģı ç§» æĵįä½ľ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ä¿®æĶ¹ é«ĺåº¦ ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġcount ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġabs ( sin ( Math . to Degrees ( degrees Ġ+ Ġstart Ġ+ Ġline Height Ġ* Ġit ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġ( it Ġ+ Ġ 1 ). rem ( 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdt Ġ= Ġif Ġ( f Ġ<= Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ* Ġamplitude ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 0 Ġ- Ġf ) Ġ* Ġamplitude ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Wave Ġ= Ġif Ġ( currentIndex Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== ĠcurrentIndex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidea Height Ġ* Ġ 0 . 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( currentIndex Ġ- Ġ 1 Ġ== Ġit Ġ|| ĠcurrentIndex Ġ+ Ġ 1 Ġ== Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidea Height Ġ* Ġ 0 . 6 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( currentIndex Ġ- Ġ 2 Ġ== Ġit Ġ|| ĠcurrentIndex Ġ+ Ġ 2 Ġ== Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidea Height Ġ* Ġ 0 . 4 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Round Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ+ Ġline Height Ġ* Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( meas ured Height Ġ/ Ġ 2 f Ġ- Ġdensity Ġ* Ġ 4 Ġ- Ġdy Ġ* Ġdt Ġ- Ġline Wave ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ+ Ġline Height Ġ* Ġit Ġ+ Ġdensity Ġ* Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( meas ured Height Ġ/ Ġ 2 f Ġ+ Ġdensity Ġ* Ġ 4 Ġ+ Ġdy Ġ* Ġdt Ġ+ Ġline Wave ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdensity Ġ* Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdensity Ġ* Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Wave () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġamplitude Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġd Offset Ġ= Ġ 0 . 0 0 0 5 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Amp litude (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ?. getValue () Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlistener : ĠWave Value Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġset Amp Listener ( listener : ĠWave Value Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠWave Value Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠgetValue (): ĠInt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä»İ ä¸ŃéĹ´ è¾ Ĳ å°Ħ åĪ° ä¸¤ è¾¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġpre Value Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġpre MaxValue Ġ= Ġ 0 f // è®°å½ķ ä¸Ĭ æ¬¡ æľĢå¤§ åĢ¼ , ä½Ĩæĺ¯ æľª è¾¾ åĪ° æŃ¤ å· ħ å³ ° ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Wave () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġget Amp litude () ĊĠĠĠĠĠĠĠ Ġif Ġ( current Ġ> Ġ 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġ 7 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// å· ħ å³ ° åĪ° è¾¾ æľĢ ä½İ ĊĠĠĠĠĠĠĠ Ġif Ġ( pre MaxValue Ġ!= Ġ 0 f Ġ&& Ġcurrent Ġ!= Ġ 0 ) Ġ{// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pre MaxValue Ġ< Ġcurrent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre MaxValue Ġ= Ġcurrent . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( pre MaxValue Ġ== Ġ 0 f Ġ&& Ġcurrent Ġ!= Ġ 0 Ġ&& Ġpre Value Ġ< Ġcurrent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre MaxValue Ġ= Ġcurrent . toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( pre Value Ġ>= Ġpre MaxValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre MaxValue Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( pre MaxValue Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pre Value Ġ!= Ġ 0 f Ġ&& Ġcurrent Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Value Ġ-= Ġ 0 . 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pre Value Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Value Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( current Ġ< Ġpre Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Value Ġ-= Ġ 0 . 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Value Ġ= Ġcurrent . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pre Value Ġ< Ġpre MaxValue Ġ&& Ġpre MaxValue Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Value Ġ+= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pre Value Ġ> Ġ 7 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre Value Ġ= Ġ 7 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġamplitude Ġ= Ġpre Value ĊĠĠĠĠĠĠĠ Ġ// æ²¡æľī ä¿¡åı· æ³¢ åħ¥ ä¾ µ Ġæ¨¡ æĭŁ ä¸ĢæĿ¡ ä»İ å·¦ åĪ° åı³ çļĦ åħ¥ ä¾ µ ä¿¡åı· ĊĠĠĠĠĠĠĠ Ġif Ġ( pre Value Ġ== Ġ 0 f Ġ&& Ġcurrent Ġ== Ġ 0 Ġ&& Ġpre MaxValue Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Line Ġ+= Ġ 0 . 4 f ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġoffset Line . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentIndex Ġ> Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Line Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġamplitude Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Line Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentIndex Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdegrees Ġ+= Ġd Offset ĊĠĠĠĠĠĠĠ Ġpost Invalidate On Animation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġoffset Line Ġ= Ġ 0 f Ċ }