package Ġja . bur han r ash id 5 2 . photo editor Ċ Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . view . Gesture Detector Ċ import Ġandroid . view . Gesture Detector . Simple On Gesture Listener Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . On Touch Listener Ċ import Ġandroid . widget . ImageView Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠCreated Ġon Ġ 1 8 / 0 1 / 2 0 1 7 . Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Bur han udd in ĠR ash id ]( https :// github . com / bur han r ash id 5 2 ) Ċ Ġ* Ċ Ġ* Ċ Ġ*/ Ċ internal Ġclass ĠMulti Touch Listener ( ĊĠĠĠ Ġdelete View : ĠView ?, ĊĠĠĠ Ġphoto Editor View : ĠPhoto Editor View , ĊĠĠĠ Ġphoto Edit ImageView : ĠImageView ?, ĊĠĠĠ Ġprivate Ġval Ġm Is Pin ch Scal able : ĠBoolean , ĊĠĠĠ Ġon Photo Editor Listener : ĠOn Photo Editor Listener ?, ĊĠĠĠ Ġview State : ĠPhoto Editor ViewState Ċ ) Ġ: ĠOn Touch Listener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm Gesture Listener : ĠGest ure Detector ĊĠĠĠ Ġprivate Ġval Ġis Rotate Enabled Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġval Ġis Translate Enabled Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġval Ġis Scale Enabled Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġval Ġminimum Scale Ġ= Ġ 0 . 5 f ĊĠĠĠ Ġprivate Ġval Ġmaximum Scale Ġ= Ġ 1 0 . 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Active Pointer Id Ġ= ĠINVALID _ POINTER _ ID ĊĠĠĠ Ġprivate Ġvar Ġm Prev X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Prev Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Prev Raw X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġm Prev Raw Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġval Ġm Scale Gesture Detector : ĠScale Gesture Detector ĊĠĠĠ Ġprivate Ġval Ġlocation Ġ= ĠInt Array ( 2 ) ĊĠĠĠ Ġprivate Ġvar Ġout Rect : ĠRect ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġdelete View : ĠView ? ĊĠĠĠ Ġprivate Ġval Ġphoto Edit ImageView : ĠImageView ? ĊĠĠĠ Ġprivate Ġval Ġphoto Editor View : ĠPhoto Editor View ĊĠĠĠ Ġprivate Ġvar Ġon Multi Touch Listener : ĠOn Multi Touch Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm On Gesture Control : ĠOn Gesture Control ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm On Photo Editor Listener : ĠOn Photo Editor Listener ? ĊĠĠĠ Ġprivate Ġval Ġview State : ĠPhoto Editor ViewState ĊĠĠĠ Ġoverride Ġfun Ġon Touch ( view : ĠView , Ġevent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Scale Gesture Detector . on Touch Event ( view , Ġevent ) ĊĠĠĠĠĠĠĠ Ġm Gesture Listener . on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Translate Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġevent . action ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġevent . raw X . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . raw Y . toInt () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action Ġand Ġevent . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Prev X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Prev Y Ġ= Ġevent . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Prev Raw X Ġ= Ġevent . raw X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Prev Raw Y Ġ= Ġevent . raw Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Active Pointer Id Ġ= Ġevent . get Pointer Id ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delete View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . br ing To Front () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfire Photo Editor SDK Listener ( view , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġenable Ġdragging Ġon Ġfocused Ġstick ers . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Ġ=== Ġview State . current Selected View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Move Ġ= Ġevent . find Pointer Index ( m Active Pointer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer Index Move Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr X Ġ= Ġevent . getX ( pointer Index Move ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Y Ġ= Ġevent . getY ( pointer Index Move ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! m Scale Gesture Detector . is InProgress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Translation ( view , Ġcurr X Ġ- Ġm Prev X , Ġcurr Y Ġ- Ġm Prev Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġm Active Pointer Id Ġ= ĠINVALID _ POINTER _ ID ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Active Pointer Id Ġ= ĠINVALID _ POINTER _ ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delete View Ġ!= Ġnull Ġ&& Ġis View In Bounds ( delete View , Ġx , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Multi Touch Listener ?. on Remove View Listener ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! is View In Bounds ( photo Edit ImageView , Ġx , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . animate (). translation Y ( 0 f ). translation Y ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( delete View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfire Photo Editor SDK Listener ( view , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Index Pointer Up Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġand ĠMotion Event . ACTION _ POINTER _ INDEX _ MASK Ġshr ĠMotion Event . ACTION _ POINTER _ INDEX _ SHIFT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpointer Id Ġ= Ġevent . get Pointer Id ( pointer Index Pointer Up ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pointer Id Ġ== Ġm Active Pointer Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Pointer Index Ġ= Ġif Ġ( pointer Index Pointer Up Ġ== Ġ 0 ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Prev X Ġ= Ġevent . getX ( new Pointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Prev Y Ġ= Ġevent . getY ( new Pointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Active Pointer Id Ġ= Ġevent . get Pointer Id ( new Pointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfire Photo Editor SDK Listener ( view : ĠView , Ġis Start : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Tag Ġ= Ġview . tag ĊĠĠĠĠĠĠĠ Ġif Ġ( m On Photo Editor Listener Ġ!= Ġnull Ġ&& Ġview Tag Ġ!= Ġnull Ġ&& Ġview Tag Ġis ĠView Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Start ) Ġm On Photo Editor Listener . onStart View ChangeListener ( view . tag Ġas ĠView Type ) Ġelse Ġm On Photo Editor Listener . on Stop View ChangeListener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . tag Ġas ĠView Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis View In Bounds ( view : ĠView ?, Ġx : ĠInt , Ġy : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġview ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Drawing Rect ( out Rect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Location On Screen ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect ?. offset ( location [ 0 ], Ġlocation [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect ?. contains ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Multi Touch Listener ( on Multi Touch Listener : ĠOn Multi Touch Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on Multi Touch Listener Ġ= Ġon Multi Touch Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠScale Gesture Listener Ġ: ĠScale Gesture Detector . Simple On Scale Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Pivot X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Pivot Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Prev Span Vector Ġ= ĠVector 2 D () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scale Begin ( view : ĠView , Ġdetector : ĠScale Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Pivot X Ġ= Ġdetector . get Focus X () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Pivot Y Ġ= Ġdetector . get Focus Y () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Prev Span Vector . set ( detector . getCurrent Span Vector ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Is Pin ch Scal able ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scale ( view : ĠView , Ġdetector : ĠScale Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠTransform Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . delta Scale Ġ= Ġif Ġ( is Scale Enabled ) Ġdetector . get Scale Factor () Ġelse Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . delta Angle Ġ= Ġif Ġ( is Rotate Enabled ) ĠVector 2 D . get Angle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Prev Span Vector , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetector . getCurrent Span Vector () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġ 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . delta X Ġ= Ġif Ġ( is Translate Enabled ) Ġdetector . get Focus X () Ġ- Ġm Pivot X Ġelse Ġ 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . delta Y Ġ= Ġif Ġ( is Translate Enabled ) Ġdetector . get Focus Y () Ġ- Ġm Pivot Y Ġelse Ġ 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . pivot X Ġ= Ġm Pivot X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . pivot Y Ġ= Ġm Pivot Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . minimum Scale Ġ= Ġminimum Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . maximum Scale Ġ= Ġmaximum Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove ( view , Ġinfo ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! m Is Pin ch Scal able ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠTransform Info Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdelta X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġdelta Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġdelta Scale Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġdelta Angle Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġpivot X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġpivot Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġminimum Scale Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġmaximum Scale Ġ= Ġ 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinterface ĠOn Multi Touch Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon EditText ClickListener ( text : ĠString ?, Ġcolor Code : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Remove View Listener ( removed View : ĠView ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinterface ĠOn Gesture Control Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠonClick () ĊĠĠĠĠĠĠĠ Ġfun Ġon Long Click () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Gesture Control ( on Gesture Control : ĠOn Gesture Control ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm On Gesture Control Ġ= Ġon Gesture Control ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠGest ure Listener Ġ: ĠSimple On Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Single Tap Up ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm On Gesture Control ?. onClick () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Long Press ( e : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Long Press ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm On Gesture Control ?. on Long Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINVALID _ POINTER _ ID Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadjust Angle ( degrees : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdegrees Ġ> Ġ 1 8 0 . 0 f Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdegrees Ġ- Ġ 3 6 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdegrees Ġ< Ġ- 1 8 0 . 0 f Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdegrees Ġ+ Ġ 3 6 0 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdegrees ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmove ( view : ĠView , Ġinfo : ĠTransform Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompute Render Offset ( view , Ġinfo . pivot X , Ġinfo . pivot Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Translation ( view , Ġinfo . delta X , Ġinfo . delta Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscale Ġ= Ġview . scale X Ġ* Ġinfo . delta Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ġ= Ġmax ( info . minimum Scale , Ġmin ( info . maximum Scale , Ġscale )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale X Ġ= Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . scale Y Ġ= Ġscale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġadjust Angle ( view . rotation Ġ+ Ġinfo . delta Angle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . rotation Ġ= Ġrotation ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadjust Translation ( view : ĠView , Ġdelta X : ĠFloat , Ġdelta Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Vector Ġ= Ġfloat ArrayOf ( delta X , Ġdelta Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . matrix . map Vectors ( delta Vector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . translation X Ġ= Ġview . translation X Ġ+ Ġdelta Vector [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . translation Y Ġ= Ġview . translation Y Ġ+ Ġdelta Vector [ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcompute Render Offset ( view : ĠView , Ġpivot X : ĠFloat , Ġpivot Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . pivot X Ġ== Ġpivot X Ġ&& Ġview . pivot Y Ġ== Ġpivot Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Point Ġ= Ġfloat ArrayOf ( 0 . 0 f , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . matrix . map Points ( prev Point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . pivot X Ġ= Ġpivot X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . pivot Y Ġ= Ġpivot Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Point Ġ= Ġfloat ArrayOf ( 0 . 0 f , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . matrix . map Points ( curr Point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset X Ġ= Ġcurr Point [ 0 ] Ġ- Ġprev Point [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Y Ġ= Ġcurr Point [ 1 ] Ġ- Ġprev Point [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . translation X Ġ= Ġview . translation X Ġ- Ġoffset X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . translation Y Ġ= Ġview . translation Y Ġ- Ġoffset Y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġm Scale Gesture Detector Ġ= ĠScale Gesture Detector ( Scale Gesture Listener ()) ĊĠĠĠĠĠĠĠ Ġm Gesture Listener Ġ= ĠGest ure Detector ( Gesture Listener ()) ĊĠĠĠĠĠĠĠ Ġthis . delete View Ġ= Ġdelete View ĊĠĠĠĠĠĠĠ Ġthis . photo Editor View Ġ= Ġphoto Editor View ĊĠĠĠĠĠĠĠ Ġthis . photo Edit ImageView Ġ= Ġphoto Edit ImageView ĊĠĠĠĠĠĠĠ Ġm On Photo Editor Listener Ġ= Ġon Photo Editor Listener ĊĠĠĠĠĠĠĠ Ġout Rect Ġ= Ġif Ġ( delete View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete View . left , Ġdelete View . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete View . right , Ġdelete View . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . view State Ġ= Ġview State ĊĠĠĠ Ġ} Ċ }