package Ġcom . dok ar . lazy re cycl ers ample . te tris . control Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Message Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . Velocity Tracker Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Configuration Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ Ċ class ĠSw ipe Game Controller ( context : ĠContext ) Ġ: ĠGame Controller (), ĠView . On Touch Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġdown X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġdown Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġcurr Down Event Ġ= ĠNONE ĊĊĠĠĠ Ġprivate Ġvar Ġdistance Threshold Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġvelocity Threshold Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġtouch S lop : ĠInt Ġ= ĠView Configuration . get ( context ). scaled Touch S lop ĊĊĠĠĠ Ġprivate Ġval Ġvelocity Tracker : ĠVe locity Tracker Ġ= ĠVe locity Tracker . obtain () ĊĊĠĠĠ Ġprivate Ġval Ġdelayed EventDispatcher Ġ= ĠDelay ed EventDispatcher ( this ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdensity Ġ= Ġcontext . resources . display Metrics . density ĊĠĠĠĠĠĠĠ Ġdistance Threshold Ġ= Ġ( 1 6 Ġ* Ġdensity ). toInt () ĊĠĠĠĠĠĠĠ Ġvelocity Threshold Ġ= Ġ( 2 0 Ġ* Ġdensity ). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch ( v : ĠView ?, Ġevent : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvelocity Tracker . add Movement ( event ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown Y Ġ= Ġevent . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Down Event Ġ= ĠNONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed EventDispatcher . send Empty Message Delayed ( SINGLE _ T AP _ DOWN , Ġ 1 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( curr Down Event Ġ!= ĠNONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġevent . x Ġ- Ġdown X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġevent . y Ġ- Ġdown Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker . compute Current Velocity ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvx Ġ= Ġvelocity Tracker . x Velocity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvy Ġ= Ġvelocity Tracker . y Velocity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( dx ) Ġ> Ġabs ( dy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( dx ) Ġ> Ġdistance Threshold Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( vx ) Ġ> Ġvelocity Threshold ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Down Event Ġ= Ġif Ġ( dx Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT _ KEY _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT _ KEY _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( dy ) Ġ> Ġdistance Threshold Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( vy ) Ġ> Ġvelocity Threshold ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Down Event Ġ= Ġif Ġ( dy Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDOWN _ KEY _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUP _ KEY _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( curr Down Event Ġ!= ĠNONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed EventDispatcher . remove Messages ( SINGLE _ T AP _ DOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Event ( curr Down Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġmax ( abs ( event . x Ġ- Ġdown X ), Ġabs ( event . y Ġ- Ġdown Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( curr Down Event Ġ== ĠNONE Ġ&& Ġdelta Ġ<= Ġtouch S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Down Event Ġ= ĠS INGLE _ T AP _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed EventDispatcher . remove Messages ( curr Down Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Event ( curr Down Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Up Event ( curr Down Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch Up Event ( pressed Event : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( pressed Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT _ KEY _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Event ( LEFT _ KEY _ UP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT _ KEY _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Event ( RIGHT _ KEY _ UP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUP _ KEY _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Event ( UP _ KEY _ UP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDOWN _ KEY _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Event ( DOWN _ KEY _ UP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS INGLE _ T AP _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Event ( SINGLE _ T AP _ UP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDelay ed EventDispatcher ( controller : ĠSw ipe Game Controller ) Ġ: ĊĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġref Ġ= ĠWeak Reference ( controller ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġref . get () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġmsg . what ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . curr Down Event Ġ= Ġevent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . dispatchEvent ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ