package Ġcom . magic go op . tag sphere Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . Gesture Detector Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . Velocity Tracker Ċ import Ġandroid . view . View Configuration Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . sqrt Ċ Ċ internal Ġclass ĠGest ure Delegate ( context : ĠContext , Ġprivate Ġval Ġgesture Listener : ĠOn Gesture Listener ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġlast Touch X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġlast Touch Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġis Dragging : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġvelocity Tracker : ĠVe locity Tracker ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġminimum Velocity : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġtouch S lop : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġdx : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġdy : ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġval Ġsingle Tap Gesture Ġ= ĠGest ure Detector ( context , ĠSingle Tap Gesture ()) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( View Configuration . get ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch S lop Ġ= Ġscaled Touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġminimum Velocity Ġ= Ġscaled Minimum Fl ing Velocity ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Touch Event ( ev : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġev . action ĊĠĠĠĠĠĠĠ Ġif Ġ( ev . pointer Count Ġ> Ġ 1 ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġsingle Tap Gesture . on Touch Event ( ev ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action Ġand ĠMotion Event . ACTION _ MASK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Touch X Ġ= Ġev . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Touch Y Ġ= Ġev . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdx Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdy Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Dragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker Ġ= ĠVe locity Tracker . obtain () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker ?. run Ġ{ Ġadd Movement ( ev ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Listener . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx : ĠFloat Ġ= Ġev . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy : ĠFloat Ġ= Ġev . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx : ĠFloat Ġ= Ġx Ġ- Ġlast Touch X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy : ĠFloat Ġ= Ġy Ġ- Ġlast Touch Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Dragging Ġ= Ġsqrt ( dx Ġ* Ġdx Ġ+ Ġdy Ġ* Ġdy ) Ġ>= Ġtouch S lop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dx Ġ= Ġdx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dy Ġ= Ġdy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Touch X Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Touch Y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker ?. run Ġ{ Ġadd Movement ( ev ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Listener . on Delta Changed ( dx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker ?. run Ġ{ Ġre cycle () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdx Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdy Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Dragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Listener . on Delta Changed ( dx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdx Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdy Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Dragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Listener . on Delta Changed ( dx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Touch X Ġ= Ġev . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Touch Y Ġ= Ġev . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Movement ( ev ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . compute Current Velocity ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv X Ġ= Ġit . x Velocity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Y Ġ= Ġit . y Velocity ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max ( abs ( v X ), Ġabs ( vY )) Ġ>= Ġminimum Velocity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Listener . on Fl ing ( v X , Ġv Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker ?. run Ġ{ Ġre cycle () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠSingle Tap Gesture Ġ: ĠGest ure Detector . Simple On Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Single Tap Up ( e : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Listener . on Single Tap ( it . x , Ġit . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġsuper . on Single Tap Confirmed ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Long Press ( e : ĠMotion Event ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Listener . on Long Pressed ( it . x , Ġit . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }