package Ġcom . dok i bo . character classification Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Path Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Configuration Ċ import Ġandroidx . core . content . res . Resources Compat Ċ Ċ private Ġconst Ġval ĠST RO KE _ WIDTH Ġ= Ġ 4 0 f Ċ Ċ class ĠDraw Character View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠView ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġextra Canvas : ĠCanvas ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġextra Bitmap : ĠBitmap ĊĊĠĠĠ Ġprivate Ġval ĠbackgroundColor Ġ= ĠResources Compat . getColor ( resources , ĠR . color . white , Ġnull ) ĊĠĠĠ Ġprivate Ġval Ġdraw Color Ġ= ĠResources Compat . getColor ( resources , ĠR . color . black , Ġnull ) ĊĊĠĠĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġdraw Color ĊĠĠĠĠĠĠĠ Ġis Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis D ither Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠ Ġstroke Join Ġ= ĠPaint . Join . ROUND ĊĠĠĠĠĠĠĠ Ġstroke Cap Ġ= ĠPaint . Cap . ROUND ĊĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= ĠST RO KE _ WIDTH ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġst ro kes : ĠMutable List < Path > Ġ= Ġmutable ListOf ( Path ()) ĊĠĠĠ Ġprivate Ġval Ġcurrent Path : ĠPath ĊĠĠĠĠĠĠĠ Ġget () Ġ{ Ġreturn Ġst ro kes . last () Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġmotion Touch Event X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġmotion Touch Event Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġcurrent Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġval Ġtouch Tolerance Ġ= ĠView Configuration . get ( context ). scaled Touch S lop ĊĊĠĠĠ Ġprivate Ġval Ġon Drawing Updated Listeners : ĠMutable List <( bitmap : ĠBitmap ) Ġ-> ĠUnit ?> Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġfun Ġset On Drawing Updated Listener ( listener : Ġ( bitmap : ĠBitmap ) Ġ-> ĠUnit ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Drawing Updated Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 Ġ(:: extra Bitmap . isInitialized ) Ġextra Bitmap . recycle () ĊĠĠĠĠĠĠĠ Ġextra Bitmap Ġ= ĠBitmap . create Bitmap ( w , Ġh , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġextra Canvas Ġ= ĠCanvas ( extra Bitmap ) ĊĠĠĠĠĠĠĠ Ġextra Canvas . draw Color ( backgroundColor ) ĊĠĠĠĠĠĠĠ Ġst ro kes Ġ= Ġmutable ListOf ( Path ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( extra Bitmap , Ġ 0 f , Ġ 0 f , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmotion Touch Event X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠ Ġmotion Touch Event Y Ġ= Ġevent . y ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġtouch Start () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġtouch Move () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġtouch Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtouch Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġhandle Ġmulti - touch ĊĠĠĠĠĠĠĠ Ġcurrent Path . moveTo ( motion Touch Event X , Ġmotion Touch Event Y ) ĊĠĠĠĠĠĠĠ Ġcurrent X Ġ= Ġmotion Touch Event X ĊĠĠĠĠĠĠĠ Ġcurrent Y Ġ= Ġmotion Touch Event Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtouch Move () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdx Ġ= ĠMath . abs ( motion Touch Event X Ġ- Ġcurrent X ) ĊĠĠĠĠĠĠĠ Ġval Ġdy Ġ= ĠMath . abs ( motion Touch Event Y Ġ- Ġcurrent Y ) ĊĠĠĠĠĠĠĠ Ġif Ġ( dx Ġ>= Ġtouch Tolerance Ġ|| Ġdy Ġ>= Ġtouch Tolerance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path . quad To ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent X , Ġcurrent Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( motion Touch Event X Ġ+ Ġcurrent X ) Ġ/ Ġ 2 , Ġ( motion Touch Event Y Ġ+ Ġcurrent Y ) Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent X Ġ= Ġmotion Touch Event X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Y Ġ= Ġmotion Touch Event Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Canvas . draw Path ( current Path , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtouch Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġfinish Ġthe Ġpath Ġby Ġadding Ġa Ġnew Ġone ĊĠĠĠĠĠĠĠ Ġst ro kes . add ( Path ()) ĊĠĠĠĠĠĠĠ Ġon Drawing Updated Listeners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ( extra Bitmap ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġundo Stroke () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" Draw Character View ", Ġ" St ro kes : Ġ${ stro kes . size } Ġ${ stro kes }") ĊĠĠĠĠĠĠĠ Ġif Ġ( stro kes . size Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġst ro kes . remove At ( stro kes . size Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġextra Canvas . draw Color ( backgroundColor ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( path Ġin Ġst ro kes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Canvas . draw Path ( path , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġon Drawing Updated Listeners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ( extra Bitmap ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }