package Ġcom . xia op o . f lying . st icker Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . graphics . PointF Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Configuration Ċ import Ġandroidx . annotation . Int Def Ċ import Ġandroidx . databinding . Observable Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . xia op o . f lying . st icker . St icker View . Flip Ċ import Ġcom . xia op o . f lying . st icker . St icker View . On St icker Area Touch Listener Ċ import Ġtim ber . log . Tim ber Ċ import Ġkotlin . math . pow Ċ Ċ open Ġclass ĠSt icker ViewModel Ġ: ĊĠĠĠ ĠViewModel () Ġ{ ĊĠĠĠ Ġvar Ġis Locked : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġvar Ġmust Lock To Pan : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġvar Ġis Crop Active : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġvar Ġrotation Enabled : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġvar Ġconstr ained : ĠMutable LiveData < Boolean > Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġvar Ġbring To Front Current St icker Ġ= ĠMutable LiveData ( true ) ĊĊĠĠĠ Ġvar Ġcanvas Matrix : ĠCustom Mutable LiveData < Observable Matrix > Ġ= ĠCustom Mutable LiveData ( Observable Matrix ()) ĊĊĠĠĠ Ġvar Ġstick ers : ĠMutable LiveData < ArrayList < St icker >> Ġ= ĠMutable LiveData ( ArrayList ()) ĊĠĠĠ Ġvar Ġicons : ĠMutable LiveData < ArrayList < Bitmap St icker Icon >> Ġ= ĠMutable LiveData ( ArrayList ()) ĊĠĠĠ Ġvar Ġactive Icons : ĠMutable LiveData < List < Bitmap St icker Icon >> Ġ= ĠMutable LiveData ( ArrayList ( 4 )) ĊĠĠĠ Ġvar Ġhandling St icker : ĠMutable LiveData < St icker ?> Ġ= ĠMutable LiveData ( null ) ĊĊĠĠĠ Ġvar Ġgesture Listener : ĠMutable LiveData < Gesture Listener > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġgesture Listener . value Ġ= ĠGest ure Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcurrent FileName : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġon St icker Area Touch Listener : ĠOn St icker Area Touch Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġlateinit Ġvar Ġst icker Operation Listener : ĠSt icker View . On St icker Operation Listener ĊĊĠĠĠ Ġprivate Ġval Ġst icker World Matrix Ġ= ĠMatrix () ĊĠĠĠ Ġprivate Ġval Ġst icker Screen Matrix Ġ= ĠMatrix () ĊĠĠĠ Ġprivate Ġval Ġmove Matrix Ġ= ĠMatrix () ĊĠĠĠ Ġprivate Ġval Ġpoint Ġ= ĠFloat Array ( 2 ) ĊĠĠĠ Ġprivate Ġval Ġcurrent Center Point Ġ= ĠPoint F () ĊĠĠĠ Ġprivate Ġval Ġtmp Ġ= ĠFloat Array ( 2 ) ĊĠĠĠ Ġprivate Ġvar Ġpointer Id Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġmid Point Ġ= ĠPoint F () ĊĊĠĠĠ Ġprivate Ġval ĠDEFAULT _ MIN _ CLICK _ DELAY _ TIME Ġ= Ġ 2 0 0 ĊĠĠĠ Ġprivate Ġvar Ġmin Click Delay Time Ġ= ĠDEFAULT _ MIN _ CLICK _ DELAY _ TIME ĊĊĠĠĠ Ġ// the Ġfirst Ġpoint Ġdown Ġposition ĊĠĠĠ Ġprivate Ġvar Ġdown X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġdown Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġdown X Scaled Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġdown YS ca led Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġold Distance Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġold Rotation Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġprevious Rotation Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġlast Click Time : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ Int Def ( ĊĠĠĠĠĠĠĠ ĠAction Mode . NONE , ĊĠĠĠĠĠĠĠ ĠAction Mode . DR AG , ĊĠĠĠĠĠĠĠ ĠAction Mode . ZO OM _ WITH _ TWO _ F ING ER , ĊĠĠĠĠĠĠĠ ĠAction Mode . ICON , ĊĠĠĠĠĠĠĠ ĠAction Mode . CLICK , ĊĠĠĠĠĠĠĠ ĠAction Mode . CAN V AS _ DR AG , ĊĠĠĠĠĠĠĠ ĠAction Mode . CAN V AS _ ZO OM _ WITH _ TWO _ F ING ER ĊĠĠĠ Ġ) ĊĠĠĠ Ġ@ kotlin . annotation . Retention ( Annotation Retention . SOURCE ) ĊĠĠĠ Ġannotation Ġclass ĠAction Mode Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠNONE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠDR AG Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠZ O OM _ WITH _ TWO _ F ING ER Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠICON Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠC LIC K Ġ= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠCAN V AS _ DR AG Ġ= Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠCAN V AS _ ZO OM _ WITH _ TWO _ F ING ER Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcurrent Mode Ġ= ĠMutable LiveData ( Action Mode . NONE ) ĊĊĠĠĠ Ġvar Ġcurrent Icon : ĠMutable LiveData < Bitmap St icker Icon ?> Ġ= ĠMutable LiveData ( null ) ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġval Ġon Touch Listener Ġ= ĠView . On Touch Listener Ġ{ Ġv , Ġevent Ġ-> Ġon Touch Event ( v Ġas ĠSt icker View , Ġevent ) Ġ} ĊĊĠĠĠ Ġfun Ġadd St icker ( st icker : ĠSt icker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd St icker ( st icker , ĠSt icker . Position . CENTER ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd St icker ( st icker : ĠSt icker , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġst icker . set Canvas Matrix ( canvas Matrix . value !!. get Matrix ()) ĊĠĠĠĠĠĠĠ Ġst icker . re calc Final Matrix () ĊĠĠĠĠĠĠĠ Ġstick ers . value !!. add ( st icker ) ĊĠĠĠĠĠĠĠ Ġhandling St icker . value Ġ= Ġst icker ĊĠĠĠĠĠĠĠ Ġst icker Operation Listener . on St icker Added ( st icker , Ġposition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset View () Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas Matrix . value !!. set Matrix ( Matrix ()) ĊĠĠĠĠĠĠĠ Ġupdate Canvas Matrix () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Canvas Matrix () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstick ers . value !!. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst icker : ĠSt icker Ġ= Ġstick ers . value ! ![ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . set Canvas Matrix ( canvas Matrix . value !!. get Matrix ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġst icker Operation Listener . on Invalidate View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Current St icker (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( handling St icker . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġremove St icker ( handling St icker . value !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove St icker ( st icker : ĠSt icker ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( stick ers . value !!. contains ( st icker )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstick ers . value !!. remove ( st icker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on St icker Deleted ( st icker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handling St icker . value Ġ== Ġst icker ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandling St icker . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on Invalidate View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" remove : Ġthe Ġst icker Ġis Ġnot Ġin Ġthis ĠSt icker View ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove All Stick ers () Ġ{ ĊĠĠĠĠĠĠĠ Ġstick ers . value ?. clear () ĊĠĠĠĠĠĠĠ Ġif Ġ( handling St icker . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandling St icker . value !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandling St icker . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Icon . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġst icker Operation Listener . on Invalidate View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Current St icker C ro pping () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandling St icker . value ?. let ( this :: reset St icker C ro pping ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset St icker C ro pping ( st icker : ĠSt icker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Locked . value Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . set C ropped Bounds ( Rect F ( st icker . get Real Bounds ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on Invalidate View () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Current St icker Zoom () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandling St icker . value ?. let ( this :: reset St icker Zoom ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset St icker Zoom ( st icker : ĠSt icker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Locked . value Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp 2 Ġ= Ġfloat ArrayOf ( st icker . center Point . x , Ġst icker . center Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . matrix . map Points ( temp 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . matrix . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . matrix . post Translate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp 2 [ 0 ] Ġ- Ġst icker . width Ġ/ Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp 2 [ 1 ] Ġ- Ġst icker . height Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . re calc Final Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on Invalidate View () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Canvas Motion ( view : ĠSt icker View , Ġevent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġhandling St icker . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcurrent Icon . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! on Touch Down Canvas ( event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Id Ġ= Ġevent . get Pointer Id ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġevent . pointer Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . get Pointer Id ( i ) Ġ!= Ġpointer Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Down ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Id Ġ= Ġevent . get Pointer Id ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Distance Ġ= ĠSt icker Math . calculate Distance ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Rotation Ġ= ĠSt icker Math . calculate Rotation ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point Ġ= Ġcalculate Mid Point ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst icker World Matrix . set ( canvas Matrix . value !!. get Matrix ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Mode . value Ġ= ĠAction Mode . CAN V AS _ ZO OM _ WITH _ TWO _ F ING ER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġevent . pointer Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . get Pointer Id ( i ) Ġ!= Ġpointer Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Down ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Id Ġ= Ġevent . get Pointer Id ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Move Action Canvas ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Up Canvas ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Mode . value Ġ== ĠAction Mode . CAN V AS _ ZO OM _ WITH _ TWO _ F ING ER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Id Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! on Touch Down Canvas ( event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Up Canvas ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġst icker Operation Listener . on Invalidate View () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠMotion Event Ġreceived Ġfrom Ġ[ )][ . on Touch Event ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġon Touch Down Canvas ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Mode . value Ġ= ĠAction Mode . CAN V AS _ DR AG ĊĠĠĠĠĠĠĠ Ġcalculate Down ( event ) ĊĠĠĠĠĠĠĠ Ġmid Point Ġ= Ġcalculate Mid Point () ĊĠĠĠĠĠĠĠ Ġold Distance Ġ= ĠSt icker Math . calculate Distance ( mid Point . x , Ġmid Point . y , Ġdown X , Ġdown Y ) ĊĠĠĠĠĠĠĠ Ġold Rotation Ġ= ĠSt icker Math . calculate Rotation ( mid Point . x , Ġmid Point . y , Ġdown X , Ġdown Y ) ĊĠĠĠĠĠĠĠ Ġst icker World Matrix . set ( canvas Matrix . value !!. get Matrix ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġon Touch Up Canvas ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= ĠSystem Clock . uptime Millis () ĊĠĠĠĠĠĠĠ Ġpointer Id Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġcurrent Mode . value Ġ= ĠAction Mode . NONE ĊĠĠĠĠĠĠĠ Ġlast Click Time Ġ= ĠcurrentTime ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġhandle Move Action Canvas ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( current Mode . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction Mode . CAN V AS _ DR AG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . set ( st icker World Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . post Translate ( event . x Ġ- Ġdown X , Ġevent . y Ġ- Ġdown Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas Matrix . value !!. set Matrix ( move Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Canvas Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction Mode . CAN V AS _ ZO OM _ WITH _ TWO _ F ING ER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Distance Ġ= ĠSt icker Math . calculate Distance ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// float Ġnew Rotation Ġ= ĠSt icker Math . calculate Rotation ( event ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . set ( st icker World Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . post Scale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Distance Ġ/ Ġold Distance , Ġnew Distance Ġ/ Ġold Distance , Ġmid Point . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// move Matrix . post Rotate ( new Rotation Ġ- Ġold Rotation , Ġmid Point . x , Ġmid Point . y ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas Matrix . value !!. set Matrix ( move Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Canvas Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Moving Canvas (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Mode . value Ġ== ĠAction Mode . CAN V AS _ DR AG Ġ|| Ġcurrent Mode . value Ġ== ĠAction Mode . CAN V AS _ ZO OM _ WITH _ TWO _ F ING ER ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġfun Ġon Touch Event ( view : ĠSt icker View , Ġevent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Locked . value Ġ== Ġtrue Ġ|| Ġis Moving Canvas ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhandle Canvas Motion ( view , Ġevent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Motion Event . ACTION _ DOWN Ġevent __: Ġ% s ", Ġevent . toString ()); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on St icker Area Touch Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon St icker Area Touch Listener . on St icker Area Touch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! on Touch Down ( view , Ġevent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( must Lock To Pan . value Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Canvas Motion ( view , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Move Action ( view , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġon Touch Up ( view , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ UP Ġ-> Ġif Ġ( current Mode . value Ġ== ĠAction Mode . ZO OM _ WITH _ TWO _ F ING ER Ġ&& Ġhandling St icker . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on St icker Zoom Finished ( handling St icker . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! on Touch Down ( view , Ġevent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( must Lock To Pan . value Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Canvas Motion ( view , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Mode . value Ġ= ĠAction Mode . DR AG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Mode . value Ġ= ĠAction Mode . NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġst icker Operation Listener . on Invalidate View () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠMotion Event Ġreceived Ġfrom Ġ[ )][ . on Touch Event ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġon Touch Down ( view : ĠSt icker View , Ġevent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Mode . value Ġ= ĠAction Mode . DR AG ĊĠĠĠĠĠĠĠ Ġcalculate Down ( event ) ĊĠĠĠĠĠĠĠ Ġmid Point Ġ= ĠSt icker Math . calculate Mid Point ( handling St icker . value ) ĊĠĠĠĠĠĠĠ Ġold Distance Ġ= ĠSt icker Math . calculate Distance ( mid Point . x , Ġmid Point . y , Ġdown X , Ġdown Y ) ĊĠĠĠĠĠĠĠ Ġold Rotation Ġ= ĠSt icker Math . calculate Rotation ( mid Point . x , Ġmid Point . y , Ġdown X , Ġdown Y ) ĊĠĠĠĠĠĠĠ Ġcurrent Icon . value Ġ= Ġfind Current Icon Tou ched () ĊĊĠĠĠĠĠĠĠ Ġ// ĠH ACK Ġif Ġapplication Ġlogic Ġis Ġreally Ġmeant Ġto Ġbe Ġhandled Ġin Ġthe ĠViewModel , Ġhow Ġdo Ġyou ĊĠĠĠĠĠĠĠ Ġ// Ġcommunicate Ġfrom Ġthe ĠView Ġto Ġthe ĠViewModel ? ĠThere Ġcan 't Ġbe Ġa ĠGest ure Detector Ġin Ġthe ĊĠĠĠĠĠĠĠ Ġ// ĠViewModel Ġbecause Ġit Ġret ains Ġthe Ġactivity 's Ġcontext . ĊĠĠĠĠĠĠĠ Ġview . detect Icon Gesture ( event ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Icon . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Mode . value Ġ= ĠAction Mode . ICON ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Icon . value !!. on Action Down ( view , Ġthis , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTim ber . d (" current _ icon : Ġ% s ", Ġcurrent Icon . get Drawable Name ()); ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandling St icker . value Ġ= Ġfind Handling St icker () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠ Ġhandling St icker . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker World Matrix . set ( it . get Matrix ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Screen Matrix . set ( it . get Final Matrix ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( br ing To Front Current St icker . value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstick ers . value !!. remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstick ers . value !!. add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on St icker Tou ched Down ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Icon . value Ġ!= Ġnull Ġ|| Ġhandling St icker . value Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġon Touch Up ( view : ĠSt icker View , Ġevent : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtouch S lop Ġ= ĠView Configuration . get ( view . context ). scaled Touch S lop ĊĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= ĠSystem Clock . uptime Millis () ĊĠĠĠĠĠĠĠ Ġif Ġ( current Mode . value Ġ== ĠAction Mode . ICON Ġ&& Ġcurrent Icon . value Ġ!= Ġnull Ġ&& Ġhandling St icker . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Icon . value !!. on Action Up ( view , Ġthis , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTim ber . d (" current _ icon : Ġ% s ", Ġcurrent Icon . get Drawable Name ()); ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Mode . value Ġ== ĠAction Mode . DR AG Ġ&& ĠMath . abs ( event . x Ġ- Ġdown X ) Ġ< Ġtouch S lop Ġ&& ĠMath . abs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . y Ġ- Ġdown Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ< Ġtouch S lop Ġ&& Ġhandling St icker . value Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Mode . value Ġ= ĠAction Mode . CLICK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on St icker Clicked ( handling St icker . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentTime Ġ- Ġlast Click Time Ġ< Ġmin Click Delay Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on St icker Double T apped ( handling St icker . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Mode . value Ġ== ĠAction Mode . DR AG Ġ&& Ġhandling St icker . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on St icker Drag Finished ( handling St icker . value !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Mode . value Ġ= ĠAction Mode . NONE ĊĠĠĠĠĠĠĠ Ġlast Click Time Ġ= ĠcurrentTime ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscreen To World ( vx : ĠFloat , Ġvy : ĠFloat ): ĠPoint F Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvec Ġ= Ġfloat ArrayOf ( vx , Ġvy ) ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġcanvas Matrix . value !!. invert ( a ) ĊĠĠĠĠĠĠĠ Ġa . map Vectors ( vec ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPoint F ( vec [ 0 ], Ġvec [ 1 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġhandle Move Action ( view : ĠSt icker View , Ġevent : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( current Mode . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction Mode . NONE , ĠAction Mode . CLICK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction Mode . DR AG Ġ-> Ġif Ġ( handling St icker . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . set ( st icker World Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvec Ġ= Ġscreen To World ( event . x Ġ- Ġdown X , Ġevent . y Ġ- Ġdown Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . post Translate ( vec . x , Ġvec . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandling St icker . value !!. set Matrix ( move Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constrained . value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstr ain St icker ( view , Ġhandling St icker . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst icker Operation Listener . on St icker Moved ( handling St icker . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction Mode . ZO OM _ WITH _ TWO _ F ING ER Ġ-> Ġif Ġ( handling St icker . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Distance Ġ= ĠSt icker Math . calculate Distance Scaled ( event , Ġcanvas Matrix . value !!. get Matrix ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Rotation Ġ= ĠSt icker Math . calculate Rotation ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . set ( st icker World Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . post Scale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Distance Ġ/ Ġold Distance , Ġnew Distance Ġ/ Ġold Distance , Ġmid Point . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Enabled . value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . post Rotate ( new Rotation Ġ- Ġold Rotation , Ġmid Point . x , Ġmid Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandling St icker . value !!. set Matrix ( move Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAction Mode . ICON Ġ-> Ġif Ġ( handling St icker . value Ġ!= Ġnull Ġ&& Ġcurrent Icon . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Icon . value !!. on Action Move ( view , Ġthis , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġzoom And Rotate Current St icker ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġzoom And Rotate St icker ( handling St icker . value , Ġevent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġzoom And Rotate St icker ( st icker : ĠSt icker ?, Ġevent : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( st icker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġfloat ArrayOf ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas Matrix . value !!. invert ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . map Points ( temp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp 2 Ġ= Ġfloat ArrayOf ( st icker . center Point C ropped . x , Ġst icker . center Point C ropped . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker World Matrix . map Points ( temp 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// canvas Matrix . map Points ( temp 2 ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . x Ġ= Ġtemp 2 [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . y Ġ= Ġtemp 2 [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Distance Ġ= ĠSt icker Math . calculate Distance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown X Scaled , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown YS ca led ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Distance Ġ= ĠSt icker Math . calculate Distance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Rotation Ġ= ĠSt icker Math . calculate Rotation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . set ( st icker World Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . post Scale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Distance Ġ/ Ġold Distance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Distance Ġ/ Ġold Distance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rotation Enabled . value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Matrix . post Rotate ( new Rotation Ġ- Ġold Rotation , Ġmid Point . x , Ġmid Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandling St icker . value !!. set Matrix ( move Matrix ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġconstr ain St icker ( view : ĠSt icker View , Ġst icker : ĠSt icker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmove X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġmove Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġwidth : ĠInt Ġ= Ġview . getWidth () ĊĠĠĠĠĠĠĠ Ġval Ġheight : ĠInt Ġ= Ġview . getHeight () ĊĠĠĠĠĠĠĠ Ġst icker . get Mapped Center Point ( current Center Point , Ġpoint , Ġtmp ) ĊĠĠĠĠĠĠĠ Ġif Ġ( current Center Point . x Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove X Ġ= Ġ- current Center Point . x ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Center Point . x Ġ> Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove X Ġ= Ġwidth Ġ- Ġcurrent Center Point . x ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Center Point . y Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Y Ġ= Ġ- current Center Point . y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( current Center Point . y Ġ> Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Y Ġ= Ġheight Ġ- Ġcurrent Center Point . y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġst icker . matrix . post Translate ( move X , Ġmove Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcrop Current St icker ( event : ĠMotion Event , Ġgravity : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcrop St icker ( handling St icker . value , Ġevent , Ġgravity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert F lipped Gravity ( st icker : ĠSt icker , Ġgravity : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( st icker . is F lipped H orizontally ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( st icker . is F lipped Vert ically ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( gravity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . LEFT _ TOP Ġ-> ĠBitmap St icker Icon . RIGHT _ BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . LEFT _ BOTTOM Ġ-> ĠBitmap St icker Icon . RIGHT _ TOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . RIGHT _ TOP Ġ-> ĠBitmap St icker Icon . LEFT _ BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . RIGHT _ BOTTOM Ġ-> ĠBitmap St icker Icon . LEFT _ TOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġgravity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( gravity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . LEFT _ TOP Ġ-> ĠBitmap St icker Icon . RIGHT _ TOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . LEFT _ BOTTOM Ġ-> ĠBitmap St icker Icon . RIGHT _ BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . RIGHT _ TOP Ġ-> ĠBitmap St icker Icon . LEFT _ TOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . RIGHT _ BOTTOM Ġ-> ĠBitmap St icker Icon . LEFT _ BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġgravity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( st icker . is F lipped Vert ically ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( gravity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . LEFT _ TOP Ġ-> ĠBitmap St icker Icon . LEFT _ BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . LEFT _ BOTTOM Ġ-> ĠBitmap St icker Icon . LEFT _ TOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . RIGHT _ TOP Ġ-> ĠBitmap St icker Icon . RIGHT _ BOTTOM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . RIGHT _ BOTTOM Ġ-> ĠBitmap St icker Icon . RIGHT _ TOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġgravity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgravity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġfun Ġcrop St icker ( st icker : ĠSt icker ?, Ġevent : ĠMotion Event , Ġgravity : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( st icker Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġevent . x ĊĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġevent . y ĊĠĠĠĠĠĠĠ Ġval Ġinv Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġst icker . canvas Matrix . invert ( inv ) ĊĠĠĠĠĠĠĠ Ġval Ġinv 2 Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġst icker . matrix . invert ( inv 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġfloat ArrayOf ( dx , Ġdy ) ĊĠĠĠĠĠĠĠ Ġinv . map Points ( temp ) ĊĠĠĠĠĠĠĠ Ġinv 2 . map Points ( temp ) ĊĠĠĠĠĠĠĠ Ġval Ġc ropped Ġ= ĠRect F ( st icker . getC ropped Bounds ()) ĊĠĠĠĠĠĠĠ Ġval Ġpx Ġ= Ġtemp [ 0 ]. toInt () ĊĠĠĠĠĠĠĠ Ġval Ġpy Ġ= Ġtemp [ 1 ]. toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġf lipped Gravity Ġ= Ġconvert F lipped Gravity ( st icker , Ġgravity ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( f lipped Gravity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . LEFT _ TOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ropped . left Ġ= ĠMath . min ( px . toFloat (), Ġc ropped . right ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ropped . top Ġ= ĠMath . min ( py . toFloat (), Ġc ropped . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . RIGHT _ TOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ropped . right Ġ= ĠMath . max ( px . toFloat (), Ġc ropped . left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ropped . top Ġ= ĠMath . min ( py . toFloat (), Ġc ropped . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . LEFT _ BOTTOM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ropped . left Ġ= ĠMath . min ( px . toFloat (), Ġc ropped . right ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ropped . bottom Ġ= ĠMath . max ( py . toFloat (), Ġc ropped . top ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap St icker Icon . RIGHT _ BOTTOM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ropped . right Ġ= ĠMath . max ( px . toFloat (), Ġc ropped . left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc ropped . bottom Ġ= ĠMath . max ( py . toFloat (), Ġc ropped . top ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġst icker . set C ropped Bounds ( c ropped ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġduplicate Current St icker () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandling St icker . value ?. let Ġ{ Ġduplicate St icker ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġduplicate St icker ( st icker : ĠSt icker ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew St icker Ġ= ĠDrawable St icker ( st icker Ġas ĠDrawable St icker ) ĊĠĠĠĠĠĠĠ Ġadd St icker ( new St icker ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġfind Current Icon Tou ched (): ĠBitmap St icker Icon ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( icon Ġin Ġactive Icons . value !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx : ĠFloat Ġ= Ġicon . x Ġ+ Ġicon . icon Radius Ġ- Ġdown X Scaled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy : ĠFloat Ġ= Ġicon . y Ġ+ Ġicon . icon Radius Ġ- Ġdown YS ca led ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Pow 2 Ġ= Ġx Ġ* Ġx Ġ+ Ġy Ġ* Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance Pow 2 Ġ<= Ġ(( icon . icon Radius Ġ+ Ġicon . icon Radius ) Ġ* Ġ 1 . 2 f . toDouble ()). pow ( 2 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġicon ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġfind Ġthe Ġtouched ĠSt icker ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġfind Handling St icker (): ĠSt icker ? Ġ{ ĊĠĠĠĠĠĠĠ Ġstick ers . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġit . indices . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isIn St icker Area C ropped ( it [ i ], Ġdown X , Ġdown Y )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠisIn St icker Area ( st icker : ĠSt icker , Ġdown X : ĠFloat , Ġdown Y : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtmp [ 0 ] Ġ= Ġdown X ĊĠĠĠĠĠĠĠ Ġtmp [ 1 ] Ġ= Ġdown Y ĊĠĠĠĠĠĠĠ Ġreturn Ġst icker . contains ( tmp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠisIn St icker Area C ropped ( st icker : ĠSt icker , Ġdown X : ĠFloat , Ġdown Y : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtmp [ 0 ] Ġ= Ġdown X ĊĠĠĠĠĠĠĠ Ġtmp [ 1 ] Ġ= Ġdown Y ĊĠĠĠĠĠĠĠ Ġreturn Ġst icker . contains C ropped ( tmp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġcalculate Mid Point ( event : ĠMotion Event ?): ĠPoint F Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== Ġnull Ġ|| Ġevent . pointer Count Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . set ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmid Point ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpts Ġ= Ġfloat ArrayOf ( event . getX ( 0 ), Ġevent . getY ( 0 ), Ġevent . getX ( 1 ), Ġevent . getY ( 1 )) ĊĠĠĠĠĠĠĠ Ġ// canvas Matrix . map Points ( pts ); ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ( pts [ 0 ] Ġ+ Ġpts [ 2 ]) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġ( pts [ 1 ] Ġ+ Ġpts [ 3 ]) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġmid Point . set ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmid Point ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġcalculate Down ( event : ĠMotion Event ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ== Ġnull Ġ|| Ġevent . pointer Count Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdown X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdown Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdown X Scaled Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdown YS ca led Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpts Ġ= Ġfloat ArrayOf ( event . getX ( 0 ), Ġevent . getY ( 0 )) ĊĠĠĠĠĠĠĠ Ġdown X Ġ= Ġpts [ 0 ] ĊĠĠĠĠĠĠĠ Ġdown Y Ġ= Ġpts [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġcanvas Matrix . value !!. invert ( a ) ĊĠĠĠĠĠĠĠ Ġa . map Points ( pts ) ĊĠĠĠĠĠĠĠ Ġdown X Scaled Ġ= Ġpts [ 0 ] ĊĠĠĠĠĠĠĠ Ġdown YS ca led Ġ= Ġpts [ 1 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġcalculate Mid Point (): ĠPoint F Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( handling St icker . value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmid Point . set ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmid Point ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhandling St icker . value !!. get Mapped Center Point ( mid Point , Ġpoint , Ġtmp ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmid Point ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġflip Current St icker ( direction : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandling St icker . value ?. let Ġ{ Ġflip ( it , Ġdirection ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġflip ( st icker : ĠSt icker , Ġ@ Flip Ġdirection : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġst icker . get Center Point ( mid Point ) ĊĠĠĠĠĠĠĠ Ġif Ġ( direction Ġand ĠSt icker View . FLI P _ H ORIZ ONT ALLY Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . matrix . pre Scale (- 1 f , Ġ 1 f , Ġmid Point . x , Ġmid Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . is F lipped H orizontally Ġ= Ġ! st icker . is F lipped H orizontally ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( direction Ġand ĠSt icker View . FLI P _ VERT IC ALLY Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . matrix . pre Scale ( 1 f , Ġ- 1 f , Ġmid Point . x , Ġmid Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġst icker . is F lipped Vert ically Ġ= Ġ! st icker . is F lipped Vert ically ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġst icker . re calc Final Matrix () ĊĠĠĠĠĠĠĠ Ġst icker Operation Listener . on St icker F lipped ( st icker ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Current St icker () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandling St icker . value ?. setVisible ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhide Current St icker () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandling St icker . value ?. setVisible ( false ) ĊĠĠĠ Ġ} Ċ } Ċ