package Ġdev . sk ym ans andy . scratch card layout . ui Ċ Ċ import Ġdev . sk ym ans andy . scratch card layout . R Ċ import Ġdev . sk ym ans andy . scratch card layout . listener . Scratch Listener Ċ import Ġdev . sk ym ans andy . scratch card layout . util . Scratch Card Utils Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġkotlin . math . abs Ċ Ċ internal Ġclass ĠScr atch Card ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style : ĠInt ) Ġ: ĠView ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Path : ĠPath ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Inner Paint : ĠPaint ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Outer Paint : ĠPaint ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Bitmap : ĠBitmap ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Canvas : ĠCanvas ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Scratch Drawable : ĠDrawable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Listener : ĠScr atch Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Scratch Width Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Last Touch X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Last Touch Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Re veal Full At Percent Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Re veal Listener : ĠScr atch Card Interface ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Enable Scratch ing Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context , Ġattrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Custom View Style able ") Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Scratch Card Layout ) ĊĠĠĠĠĠĠĠ Ġm Scratch Drawable Ġ= Ġa . get Drawable ( R . style able . Scratch Card Layout _ scratch Drawable ) ĊĠĠĠĠĠĠĠ Ġm Scratch Width Ġ= Ġa . get Dimension ( R . style able . Scratch Card Layout _ scratch Width , ĠScr atch Card Utils . dip To Px ( context , Ġ 3 0 f )) ĊĠĠĠĠĠĠĠ Ġm Re veal Full At Percent Ġ= Ġa . getInteger ( R . style able . Scratch Card Layout _ scratch Re veal Full At Percent , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġm Enable Scratch ing Ġ= Ġa . getBoolean ( R . style able . Scratch Card Layout _ scratch Enabled , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġa . recycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold Width : ĠInt , Ġold Height : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold Width , Ġold Height ) ĊĠĠĠĠĠĠĠ Ġsetup Scratch Drawable On View () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Path Ġ= ĠPath () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Inner Paint Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint !!. is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint !!. is D ither Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint !!. style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint !!. is Filter Bitmap Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint !!. stroke Join Ġ= ĠPaint . Join . ROUND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint !!. stroke Cap Ġ= ĠPaint . Cap . ROUND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint !!. stroke Width Ġ= Ġm Scratch Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint !!. xfer mode Ġ= ĠPort er D uff X fer mode ( Port er D uff . Mode . CLEAR ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Outer Paint Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Outer Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Enable Scratch ing ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Touch X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Touch Y Ġ= Ġevent . y ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Path ?. reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Path ?. moveTo ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġm Path ?. lineTo ( current Touch X , Ġcurrent Touch Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġabs ( current Touch X Ġ- Ġm Last Touch X ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġabs ( current Touch Y Ġ- Ġm Last Touch Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dx Ġ>= Ġ 4 Ġ|| Ġdy Ġ>= Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 1 Ġ= Ġm Last Touch X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy 1 Ġ= Ġm Last Touch Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 2 Ġ= Ġ( current Touch X Ġ+ Ġm Last Touch X ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy 2 Ġ= Ġ( current Touch Y Ġ+ Ġm Last Touch Y ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Path ?. quad To ( x 1 , Ġy 1 , Ġx 2 , Ġy 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġm Bitmap ?. width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġm Bitmap ?. height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġwidth !! Ġ* Ġheight !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( j Ġ< Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Bitmap ?. get Pixel ( i , Ġj ) Ġ== Ġ 0 x 0 0 0 0 0 0 0 0 ) Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj Ġ+= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercent Completed Ġ= Ġ( count . toFloat () Ġ/ Ġtotal Ġ* Ġ 9 Ġ* Ġ 1 0 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Completed Ġ== Ġ 0 Ġ-> Ġm Listener ?. on Scratch Started () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Completed Ġ== Ġ 1 0 0 Ġ-> Ġstop Scratch ing And Re veal Full () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Completed Ġ>= Ġm Re veal Full At Percent Ġ-> Ġstop Scratch ing And Re veal Full () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġm Listener ?. on Scratch Progress ( parent Ġas ĠScr atch Card Layout , Ġpercent Completed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Canvas ?. draw Path ( m Path !! , Ġm Inner Paint !! ) ĊĠĠĠĠĠĠĠ Ġm Last Touch X Ġ= Ġcurrent Touch X ĊĠĠĠĠĠĠĠ Ġm Last Touch Y Ġ= Ġcurrent Touch Y ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Scratch ing And Re veal Full () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Re veal Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Re veal Listener ?. on Full Re veal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener ?. on Scratch Complete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( m Bitmap !! , Ġ 0 f , Ġ 0 f , Ġm Outer Paint ) ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bitmap ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bitmap Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Scratch Drawable ( m Scratch Drawable : ĠDrawable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Scratch Drawable Ġ= Ġm Scratch Drawable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Scratch Width Dip ( m Scratch Width : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Scratch Width Ġ= Ġm Scratch Width ĊĠĠĠĠĠĠĠ Ġif Ġ( m Inner Paint Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Inner Paint ?. stroke Width Ġ= Ġm Scratch Width ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Listener ( m Listener : ĠScr atch Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Listener Ġ= Ġm Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Re veal Full At Percent ( m Re veal Full At Percent : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Re veal Full At Percent Ġ= Ġm Re veal Full At Percent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Re veal Listener ( scratch Card Layout : ĠScr atch Card Layout ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Re veal Listener Ġ= Ġscratch Card Layout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Scratch Enabled ( enable Scratch ing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Enable Scratch ing Ġ= Ġenable Scratch ing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Scratch () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ!= Ġ 0 Ġ&& Ġheight Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Scratch Drawable On View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreveal Scratch () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Scratch ing And Re veal Full () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Scratch Drawable On View () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Bitmap Ġ!= Ġnull ) Ġm Bitmap !!. recycle () ĊĠĠĠĠĠĠĠ Ġm Bitmap Ġ= ĠBitmap . create Bitmap ( width , Ġheight , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġm Canvas Ġ= ĠCanvas ( m Bitmap !! ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Scratch Drawable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Scratch Drawable ?. setBounds ( 0 , Ġ 0 , Ġm Bitmap !!. width , Ġm Bitmap !!. height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Scratch Drawable ?. draw ( m Canvas !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Canvas !!. draw Color (- 0 x 3 f 3 f 4 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinterface ĠScr atch Card Interface Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Full Re veal () ĊĠĠĠ Ġ} Ċ }