package Ġcom . ook am isoft . draw on image Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . os . Build Ċ import Ġandroid . support . annotation . Requires Api Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . widget . ImageView Ċ import Ġjava . util .* Ċ Ċ class ĠDraw On ImageView Ġ: ĠImageView Ġ{ ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattribute Set : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattribute Set ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattribute Set : ĠAttributeSet , Ġdef Style Int : ĠInt ) Ġ: Ġsuper ( context , Ġattribute Set , Ġdef Style Int ) ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattribute Set : ĠAttributeSet , Ġdef Style Int : ĠInt , Ġdef Style Res : ĠInt ) Ġ: Ġsuper ( context , Ġattribute Set , Ġdef Style Int , Ġdef Style Res ) ĊĊĠĠĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠ Ġprivate Ġval Ġer aser Paint Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĊĠĠĠ Ġprivate Ġval Ġprevious Paths : ĠLinkedList < Draw On Image Path > Ġ= ĠLinkedList () ĊĠĠĠ Ġprivate Ġvar Ġcurrent Path Ġ= ĠPath () ĊĊĠĠĠ Ġprivate Ġvar Ġis E ras er On Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġpath Layer Bitmap : ĠBitmap ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpath Layer Canvas : ĠCanvas ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Paint ( paint ) ĊĠĠĠĠĠĠĠ Ġsetup Paint ( eras er Paint ) ĊĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠ Ġer aser Paint . color Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠ Ġer aser Paint . xfer mode Ġ= ĠPort er D uff X fer mode ( Port er D uff . Mode . CLEAR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġevent ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Paths . add ( Draw On Image Path ( current Path , Ġis E ras er On )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path Ġ= ĠPath () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path . inc Reserve ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Line To Path ( current Path , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ) ĊĠĠĠĠĠĠĠ Ġif ( w Ġ== Ġ 0 || Ġh Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprevious Bitmap Ġ= Ġpath Layer Bitmap ĊĠĠĠĠĠĠĠ Ġif Ġ( previous Bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Layer Bitmap Ġ= ĠBitmap . create Bitmap ( width , Ġheight , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Layer Bitmap Ġ= ĠBitmap . create Bitmap ( previous Bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Bitmap . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpath Layer Canvas Ġ= ĠCanvas ( path Layer Bitmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġcanvas ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Layer Canvas ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Paths . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= Ġif Ġ( it . is E ras er Path ) Ġer aser Paint Ġelse Ġpaint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Path ( it . path , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Path ( current Path , Ġif Ġ( is E ras er On ) Ġer aser Paint Ġelse Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Layer Bitmap ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Bitmap ( it , Ġ 0 f , Ġ 0 f , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġundo Move () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( previous Paths . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Layer Bitmap ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Layer Bitmap Ġ= ĠBitmap . create Bitmap ( it . width , Ġit . height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Layer Canvas Ġ= ĠCanvas ( path Layer Bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Paths . remove Last () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Bitmap ( auto Scale : ĠBoolean Ġ= Ġfalse ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġdestroy Drawing Cache () ĊĠĠĠĠĠĠĠ Ġbuild Drawing Cache () ĊĠĠĠĠĠĠĠ Ġreturn Ġget Drawing Cache ( auto Scale ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġturn E ras er On () Ġ{ ĊĠĠĠĠĠĠĠ Ġis E ras er On Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġturn E ras er Off () Ġ{ ĊĠĠĠĠĠĠĠ Ġis E ras er On Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Line To Path ( path : ĠPath , Ġevent : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( path . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Paint ( paint : ĠPaint ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpaint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= Ġ 1 0 f ĊĠĠĠĠĠĠĠ Ġpaint . path Effect Ġ= ĠCor ner Path Effect ( 5 0 f ) ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠDraw On Image Path ( val Ġpath : ĠPath , Ġval Ġis E ras er Path : ĠBoolean ) Ċ }