/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠC ody ĠEn gel Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġge ek fed . com . draw r ur . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . LinearLayout Ċ import Ġcom . jak ew h art on . r xb ind ing 2 . view . Rx View Ċ import Ġge ek fed . com . draw r ur . R Ċ import Ġge ek fed . com . draw r ur . data . Drawing Point Ċ import Ġio . reactivex . Observable Ċ Ċ /** Ċ Ġ* Ġ@ author Ġc ody Ċ Ġ*/ Ċ class ĠDraw ing View Impl ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt , Ġdef Style Res : ĠInt ) Ġ: ĊĠĠĠĠĠĠĠ ĠLinearLayout ( context , Ġattrs , Ġdef Style Attr , Ġdef Style Res ), ĠDraw ing View Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint () ĊĊĠĠĠ Ġprivate Ġvar Ġcached Bitmap : ĠBitmap ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġchange Color Button : ĠButton ĊĊĠĠĠ Ġprivate Ġval Ġreset Button : ĠButton ĊĊĠĠĠ Ġprivate Ġval ĠstrokeWidth Ġ= Ġ 1 0 f ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?) Ġ: Ġthis ( context , Ġnull , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?) Ġ: Ġthis ( context , Ġattrs , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġthis ( context , Ġattrs , Ġdef Style Attr , Ġ 0 ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġchange Color Button Ġ= ĠButton ( context ) ĊĠĠĠĠĠĠĠ Ġreset Button Ġ= ĠButton ( context ) ĊĠĠĠĠĠĠĠ Ġplace Change Color Button () ĊĠĠĠĠĠĠĠ Ġplace Reset Button () ĊĊĠĠĠĠĠĠĠ Ġpaint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠ Ġpaint . stroke Join Ġ= ĠPaint . Join . ROUND ĊĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= ĠstrokeWidth ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Motion Events (): ĠObservable < Motion Event > Ġ= ĠRx View . to uches ( this ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Change Color Click s (): ĠObservable < Any > Ġ= ĠRx View . click s ( change Color Button ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Reset Click s (): ĠObservable < Any > Ġ= ĠRx View . click s ( reset Button ) ĊĊĠĠĠ Ġfun Ġrender ( drawing State : ĠDraw ing State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Attached To Window ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cached Bitmap Ġ== Ġnull Ġ|| Ġdrawing State . redraw ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Bitmap Ġ= ĠBitmap . create Bitmap ( width , Ġheight , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . parse Color ( drawing State . drawing Color ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdrawing Canvas Ġ= ĠCanvas ( cached Bitmap ) ĊĠĠĠĠĠĠĠ Ġdrawing Canvas . draw Path ( generate Drawing Path ( drawing State . drawing Points ), Ġpaint ) ĊĠĠĠĠĠĠĠ Ġbackground Ġ= ĠBitmap Drawable ( resources , Ġcached Bitmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Drawing Path ( drawing Points : ĠList < Drawing Point >): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdrawing Path Ġ= ĠPath () ĊĠĠĠĠĠĠĠ Ġvar Ġprevious Point : ĠDraw ing Point ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( current Point Ġin Ġdrawing Points ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Point ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Point . time Ġ- Ġit . time Ġ< Ġ 2 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawing Path . quad To ( it . x , Ġit . y , Ġcurrent Point . x , Ġcurrent Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawing Path . moveTo ( current Point . x , Ġcurrent Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġdrawing Path . moveTo ( current Point . x , Ġcurrent Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Point Ġ= Ġcurrent Point ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdrawing Path ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplace Reset Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġreset Button . text Ġ= Ġcontext . getString ( R . string . button _ reset ) ĊĠĠĠĠĠĠĠ Ġplace Button ( reset Button , ĠGr avity . END ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplace Change Color Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġchange Color Button . text Ġ= Ġcontext . getString ( R . string . button _ change _ color ) ĊĠĠĠĠĠĠĠ Ġplace Button ( change Color Button , ĠGr avity . START ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplace Button ( button : ĠButton , Ġgravity : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠLinearLayout . LayoutParams ( 0 , ĠLinearLayout . LayoutParams . WRAP _ CONTENT ) ĊĠĠĠĠĠĠĠ Ġparams . gravity Ġ= ĠGr avity . BOTTOM Ġ+ Ġgravity ĊĠĠĠĠĠĠĠ Ġparams . weight Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġadd View ( button , Ġparams ) ĊĠĠĠ Ġ} Ċ }