package Ġcom . ta z . custom application Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View ĊĊ Ċ class ĠDraw ing View ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: ĠView ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġ// drawing ĠSerializable Path ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdraw Path : ĠSerializable Path ĊĊĠĠĠ Ġ// drawing Ġand Ġcanvas Ġpaint ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdraw Paint : ĠPaint Ġ Ġ// drawing Ġand Ġcanvas Ġpaint ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcanvas Paint : ĠPaint ĊĊĠĠĠ Ġ// initial Ġcolor ĊĠĠĠ Ġprivate Ġval Ġpaint Color Ġ= Ġ- 0 x 9 a 0 0 0 0 ĊĊĠĠĠ Ġ// canvas ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdraw Canvas : ĠCanvas ĊĊĠĠĠ Ġ// canvas Ġbitmap ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcanvas Bitmap : ĠBitmap ĊĊĠĠĠ Ġprivate Ġvar Ġcolor : Int Ġ= ĠColor . BLUE ĊĠĠĠ Ġprivate Ġvar ĠstrokeWidth : Float Ġ= Ġ 2 0 f ĊĊĠĠĠ Ġvar Ġpaths Ġ= Ġmutable ListOf < Serializable Path >() ĊĠĠĠ Ġprivate Ġval Ġremoved Paths Ġ= Ġmutable ListOf < Serializable Path >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Drawing () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Drawing () Ġ{ ĊĠĠĠĠĠĠĠ Ġdraw Path Ġ= ĠSerializable Path () ĊĠĠĠĠĠĠĠ Ġdraw Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġdraw Paint . setColor ( Color . BLUE ) ĊĠĠĠĠĠĠĠ Ġdraw Paint . set Anti Alias ( true ) ĊĠĠĠĠĠĠĠ Ġdraw Paint . set Stroke Width ( 2 0 f ) ĊĠĠĠĠĠĠĠ Ġdraw Paint . setStyle ( Paint . Style . ST RO KE ) ĊĠĠĠĠĠĠĠ Ġdraw Paint . set Stroke Join ( Paint . Join . ROUND ) ĊĠĠĠĠĠĠĠ Ġdraw Paint . set Stroke Cap ( Paint . Cap . ROUND ) ĊĠĠĠĠĠĠĠ Ġcanvas Paint Ġ= ĠPaint ( Paint . D IT HER _ FLAG ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun Ġset Color ( color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdraw Paint . color Ġ= Ġcolor ; Ġdraw Path . color Ġ= Ġcolor ; Ġthis . color Ġ= Ġcolor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun Ġset Brush Size ( stroke Width : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdraw Paint . stroke Width Ġ= ĠstrokeWidth ; Ġdraw Path . stroke Width Ġ= ĠstrokeWidth ĊĠĠĠĠĠĠĠ Ġthis . stroke Width Ġ= ĠstrokeWidth ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġremoved Paths . addAll ( paths . reversed ()) ĊĠĠĠĠĠĠĠ Ġpaths . clear () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġundo () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! paths . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Paths . add ( paths . last ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . remove At ( paths . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġredo () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! removed Paths . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . add ( removed Paths . last ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Paths . remove At ( removed Paths . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ) ĊĠĠĠĠĠĠĠ Ġcanvas Bitmap Ġ= ĠBitmap . create Bitmap ( w , Ġh , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġdraw Canvas Ġ= ĠCanvas ( canvas Bitmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġpaths . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Paint . color Ġ= Ġit . color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Paint . stroke Width Ġ= Ġit . stroke Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Path ( it , Ġdraw Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdraw Paint . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġdraw Paint . stroke Width Ġ= ĠstrokeWidth Ċ // ĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( canvas Bitmap , Ġ 0 f , Ġ 0 f , Ġcanvas Paint ) ĊĠĠĠĠĠĠĠ Ġcanvas ?. draw Path ( draw Path , Ġdraw Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtouch X Ġ= Ġevent !!. x ĊĠĠĠĠĠĠĠ Ġval Ġtouch Y Ġ= Ġevent . y ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġdraw Path . moveTo ( touch X , Ġtouch Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġdraw Path . lineTo ( touch X , Ġtouch Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . add ( draw Path ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Canvas . draw Path ( draw Path , Ġdraw Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Path Ġ= ĠSerializable Path (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġthis @ Drawing View . color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġthis @ Drawing View . stroke Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊ Ċ }