package Ġcom . try d roid . co board . views Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ Ċ type alias ĠOn Draw Listener Ġ= Ġ( List < Point > ?) Ġ-> ĠUnit Ċ Ċ /** Ċ Ġ* ĠCustom ize Ġform Ġoriginal Ġsource Ċ Ġ* Ġ- Ġhttps :// github . com / john car l 8 1 / android draw / blob / master / src / main / java / org / example / android draw / Simple Draw View . java Ċ Ġ* Ġ- Ġhttps :// github . com / By ox Code / Draw View / blob / master / draw view / src / main / java / com / by ox / draw view / views / Draw View . java Ċ Ġ* Ġ*/ Ċ class ĠSimple Draw View ( context : ĠContext , Ġattribute Set : ĠAttributeSet ) Ġ: ĠView ( context , Ġattribute Set ), ĠView . On Touch Listener Ġ{ Ċ ĉ private Ġval Ġm Line History List : ĠMutable List < Mutable List < Point >> Ġ= Ġmutable ListOf () Ċ ĉ private Ġval Ġm Paint : ĠPaint Ġby Ġlazy Ġ{ Ċĉ ĉ Paint ( Paint . ANTI _ ALIAS _ FLAG ). apply Ġ{ Ċĉĉ ĉ stroke Width Ġ= ĠST RO KE _ WIDTH Ċĉĉ ĉ style Ġ= ĠPaint . Style . ST RO KE Ċĉĉ ĉ color Ġ= ĠColor . RED Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ var Ġdraw Listener : ĠOn Draw Listener ? Ġ= Ġnull ĊĊ ĉ init Ġ{ Ċĉ ĉ is Focus able Ġ= Ġtrue Ċĉ ĉ is Focus able In Touch Mode Ġ= Ġtrue Ċĉ ĉ this . setOn Touch Listener ( this ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ Ċĉ ĉ m Line History List . forEach Ġ{ Ġline Ġ-> Ċĉĉ ĉ if Ġ( line . size Ġ== Ġ 1 ) Ġ{ Ċĉĉĉ ĉ on Draw Point ( canvas , Ġline ) Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ{ Ċĉĉĉ ĉ on Draw Line ( canvas , Ġline ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġon Touch ( view : ĠView , Ġevent : ĠMotion Event ): ĠBoolean Ġ{ Ċĉ ĉ when Ġ( event . action ) Ġ{ Ċĉĉ ĉ Motion Event . ACTION _ DOWN Ġ-> Ġ{ Ċĉĉĉ ĉ on Touch Start ( event ) Ċĉĉ ĉ } Ċĉĉ ĉ Motion Event . ACTION _ MOVE Ġ-> Ġ{ Ċĉĉĉ ĉ on Touch Move ( event ) Ċĉĉ ĉ } Ċĉĉ ĉ Motion Event . ACTION _ UP ĠĠ Ġ-> Ġ{ Ċĉĉĉ ĉ on Touch End () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ return Ġtrue Ċ ĉ } ĊĊ ĉ fun Ġclear () Ġ{ Ċĉ ĉ m Line History List . clear () Ċĉ ĉ invalidate () Ċ ĉ } ĊĊ ĉ fun Ġdraw Line ( line List : ĠList < Point >) Ġ{ Ċĉ ĉ m Line History List . add ( line List . to Mutable List ()) Ċĉ ĉ invalidate () Ċ ĉ } ĊĊ ĉ private Ġfun Ġon Draw Point ( canvas : ĠCanvas , Ġline : ĠMutable List < Point >) Ġ{ Ċĉ ĉ line . first OrNull () Ċĉĉ ĉ ?. let Ġ{ Ġpoint Ġ-> Ġcanvas . draw Point ( point . x . toFloat (), Ġpoint . y . toFloat (), Ġm Paint ) Ġ} Ċ ĉ } ĊĊ ĉ private Ġfun Ġon Draw Line ( canvas : ĠCanvas , Ġline : ĠList < Point >) Ġ{ Ċĉ ĉ val Ġpath Ġ= ĠPath () Ċĉ ĉ line . forEach Indexed Ġ{ Ġindex , Ġpoint Ġ-> Ċĉĉ ĉ val Ġx Ġ= Ġpoint . x . toFloat () Ċĉĉ ĉ val Ġy Ġ= Ġpoint . y . toFloat () Ċĉĉ ĉ if Ġ( index Ġ== Ġ 0 ) Ġ{ Ċĉĉĉ ĉ path . moveTo ( x , Ġy ) Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ{ Ċĉĉĉ ĉ path . lineTo ( x , Ġy ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ canvas . draw Path ( path , Ġm Paint ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġon Touch Start ( event : ĠMotion Event ) Ġ{ Ċĉ ĉ m Line History List . add ( mutable ListOf ()) Ċĉ ĉ add Point To Current Line History ( event . x , Ġevent . y ) Ċĉ ĉ invalidate () Ċ ĉ } ĊĊ ĉ private Ġfun Ġon Touch Move ( event : ĠMotion Event ) Ġ{ Ċĉ ĉ add Point To Current Line History ( event . x , Ġevent . y ) Ċĉ ĉ invalidate () Ċ ĉ } ĊĊ ĉ private Ġfun Ġon Touch End () Ġ{ Ċĉ ĉ draw Listener ?. invoke ( m Line History List . last OrNull ()) Ċ ĉ } ĊĊ ĉ private Ġfun Ġadd Point To Current Line History ( x : ĠFloat , Ġy : ĠFloat ) Ġ{ Ċĉ ĉ Point (). apply Ġ{ Ċĉĉ ĉ this . x Ġ= Ġx . toInt () Ċĉĉ ĉ this . y Ġ= Ġy . toInt () Ċĉ ĉ }. let Ġ{ Ġpoint Ġ-> Ċĉĉ ĉ m Line History List . last (). add ( point ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ private Ġval ĠST RO KE _ WIDTH Ġ= Ġ 4 f Ċ ĉ } Ċ } Ċ