package Ġcom . program mers box . fun utils . views Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . graphics . PointF Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . sqrt Ċ Ċ class ĠF inger Detector Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ ĠnumberOf F ingers : ĠInt Ġ= Ġ 2 , ĊĠĠĠ Ġhold Down Delay : ĠLong Ġ= Ġ 1 0 0 L , ĊĠĠĠ Ġup Delay : ĠLong Ġ= Ġ 5 0 L , ĊĠĠĠ Ġ/** Ġwhether Ġto Ġconsume Ġthe Ġtouch Ġevent Ġafter Ġhandling */ ĊĠĠĠ Ġvar Ġis Consume Touch Events : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġvar Ġon F inger Listener : ĠF inger Listener ? Ġ= Ġnull Ċ ) Ġ: ĠView . On Touch Listener Ġ{ ĊĠĠĠ Ġ/** Ġnumber Ġof Ġallowed Ġf ingers , Ġthat Ġwill Ġbe Ġdetected */ ĊĠĠĠ Ġvar ĠnumberOf F ingers : ĠInt Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ingers Ġ= ĠArray ( value ) Ġ{ ĠF inger () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġtwice Ġas Ġmany Ġrun n ables , Ġas Ġthe Ġnumber Ġof Ġallowed Ġf ingers , Ġfor Ġ 4 - Runnable Ġ=> Ġ 2 - Hold Down Ġ+ Ġ 2 - Up ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Run n ables Ġ= ĠarrayOf Null s < Change State ? >( value Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrunnable Ġfor Ġchanging Ġfinger Ġstate Ġto Ġ- H OLD _ DOWN Ġor Ġ- UP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Run n ables [ i ] Ġ= ĠChange State ( i , ĠState . H OLD _ DOWN ) Ġ// Ġfirst Ġhalf Ġfor Ġhold Ġdown ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Run n ables [ i Ġ+ Ġvalue ] Ġ= ĠChange State ( i , ĠState . UP ) Ġ// Ġsecond Ġhalf Ġfor Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun n ables Ġ= Ġtemp Run n ables . require No Null s () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġdelay Ġtime Ġafter Ġwhich Ġif Ġfinger Ġis Ġ- hold Ġdown , Ġstate Ġwill Ġbe Ġchanged Ġto ĠH OLD _ DOWN */ ĊĠĠĠ Ġvar Ġhold Down Delay : ĠLong Ġ= Ġhold Down Delay ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġdelay Ġtime Ġafter Ġwhich Ġif Ġfinger Ġis Ġ- sw ip ed , Ġstate Ġwill Ġbe Ġchanged Ġto ĠUP */ ĊĠĠĠ Ġvar Ġup Delay : ĠLong Ġ= Ġup Delay ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġf ingers : ĠArray < F inger > Ġ= ĠarrayOf () ĊĠĠĠ Ġprivate Ġval Ġhandler : ĠHandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠ Ġprivate Ġvar Ġrun n ables : ĠArray < Change State > Ġ= ĠarrayOf () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . numberOf F ingers Ġ= ĠnumberOf F ingers ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġon ĠACTION _ DOWN Ġ|| ĠACTION _ POINTER _ DOWN Ġevents , Ġto Ġdetect Ġand Ġset ĊĠĠĠĠ Ġ* Ġnew Ġcurrent Ġstate , Ġfor Ġa Ġcertain Ġfinger . ĠRemove Ġdelay Ġcallback Ġfor ĊĠĠĠĠ Ġ* Ġup Ġstate Ġand Ġset Ġnew Ġone Ġfor Ġhold - down Ġstate , Ġand Ġfinally Ġcall Ġlistener Ġmethod . ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠĠĠĠĠĠĠ Ġmotion Ġevent Ġfrom Ġthe Ġon Touch Ġevent ĊĠĠĠĠ Ġ* Ġ@ param Ġarray Index ĠĠ Ġindex Ġcorresponding Ġto Ġconsecutive Ġfinger Ġon Ġscreen ĊĠĠĠĠ Ġ* Ġ@ param Ġpointer Index Ġpointer Ġindex Ġused , Ġto Ġget Ġcurrent Ġfinger Ġposition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdown ( event : ĠMotion Event , Ġarray Index : ĠInt , Ġpointer Index : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġfinger Ġstate Ġand Ġtracking ĊĠĠĠĠĠĠĠ Ġf ingers [ array Index ]. tracking Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġf ingers [ array Index ]. detect State ( event , Ġpointer Index ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġremove Ġcallback Ġfor Ġchange Ġcurrent Ġstate Ġto Ġ- up ĊĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( run n ables [ array Index Ġ+ Ġf ingers . size ]) ĊĊĠĠĠĠĠĠĠ Ġ// Ġpost Ġa Ġdelay Ġcallback Ġfor Ġdetect ing Ġhold - down Ġstate ĊĠĠĠĠĠĠĠ Ġhandler . post Delayed ( run n ables [ array Index ], Ġhold Down Delay ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcall Ġlistener Ġmethod , Ġf ot Ġstate Ġchange ĊĠĠĠĠĠĠĠ Ġon F inger Listener ?. on StateChange ( f ingers , Ġarray Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġon ĠACTION _ UP Ġ|| ĠACTION _ POINTER _ UP Ġevents , Ġto Ġdetect Ġand Ġset ĊĠĠĠĠ Ġ* Ġnew Ġcurrent Ġstate , Ġfor Ġa Ġcertain Ġfinger . ĠRemove Ġdelay Ġcallback Ġfor ĊĠĠĠĠ Ġ* Ġhold - down Ġstate Ġand Ġset Ġnew Ġone Ġfor Ġup Ġstate , Ġand Ġfinally Ġcall Ġlistener Ġmethod . ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Ġmotion Ġevent Ġfrom Ġthe Ġon Touch Ġevent ĊĠĠĠĠ Ġ* Ġ@ param Ġarray Index Ġindex Ġcorresponding Ġto Ġconsecutive Ġfinger Ġon Ġscreen ĊĠĠĠĠ Ġ* Ġ@ param Ġpointer Index Ġpointer Ġindex Ġused , Ġto Ġget Ġcurrent Ġfinger Ġposition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġup ( event : ĠMotion Event , Ġarray Index : ĠInt , Ġpointer Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġset Ġfinger Ġstate Ġand Ġtracking ĊĠĠĠĠĠĠĠ Ġf ingers [ array Index ]. tracking Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġf ingers [ array Index ]. detect State ( event , Ġpointer Index ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġcallback Ġfor Ġup Ġstate , Ġif Ġswipe Ġor Ġdouble Ġtap Ġevent Ġis Ġmade !!! ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġf ingers [ array Index ]. state Current ĊĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠState . SW I PE _ DOWN Ġ|| Ġstate Ġ== ĠState . SW I PE _ LEFT Ġ|| Ġstate Ġ== ĠState . SW I PE _ RIGHT Ġ|| Ġstate Ġ== ĠState . SW I PE _ UP Ġ|| Ġstate Ġ== ĠState . DOUBLE _ T AP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( run n ables [ array Index Ġ+ Ġf ingers . size ], Ġup Delay ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġremove Ġlistener Ġcallback Ġfor Ġhold - down Ġstate ĊĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( run n ables [ array Index ]) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcall Ġlistener Ġmethod Ġfor Ġstate Ġchange ĊĠĠĠĠĠĠĠ Ġon F inger Listener ?. on StateChange ( f ingers , Ġarray Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnum Ġ= Ġevent . pointer Count ĊĠĠĠĠĠĠĠ Ġfor Ġ( pointer Index Ġin Ġ 0 Ġuntil Ġnum ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Index Ġ= Ġevent . get Pointer Id ( pointer Index ) Ġ// Ġid Ġcorresponding Ġto Ġarray Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġit Ġis Ġbeing Ġtracked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( array Index Ġ< Ġf ingers . size Ġ&& Ġf ingers [ array Index ]. tracking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġlast Ġand Ġcurrent Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ingers [ array Index ]. detect State ( event , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcall Ġonly Ġif Ġstate Ġis Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f ingers [ array Index ]. state Last Ġ!= Ġf ingers [ array Index ]. state Current ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon F inger Listener ?. on StateChange ( f ingers , Ġarray Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġactual Ġmove Ġis Ġmade Ġreset Ġthe Ġcallback Ġfor Ġthe Ġhold - down ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f ingers [ array Index ]. update Last ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( run n ables [ array Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Delayed ( run n ables [ array Index ], Ġhold Down Delay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch ( v : ĠView ?, Ġevent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpointer Index Ġ= Ġevent . action Index ĊĠĠĠĠĠĠĠ Ġval Ġarray Index Ġ= Ġevent . get Pointer Id ( pointer Index ) Ġ// Ġcorresponds Ġto Ġarray Ġindex , Ġsince Ġit Ġis Ġconst . ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action Ġand ĠMotion Event . ACTION _ MASK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN , ĠMotion Event . ACTION _ POINTER _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( array Index Ġ< Ġf ingers . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdown ( event , Ġarray Index , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP , ĠMotion Event . ACTION _ POINTER _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( array Index Ġ< Ġf ingers . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ( event , Ġarray Index , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġmove ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġis Consume Touch Events ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRunnable Ġimplementation Ġclass Ġthat Ġhold Ġthe Ġarray Ġindex , Ġand Ġthe Ġnew Ġstate ĊĠĠĠĠ Ġ* Ġfor Ġthe Ġcorresponding Ġfinger . ĠRunnable Ġis Ġset Ġfor Ġdelay Ġcallback , Ġfor Ġchanging ĊĠĠĠĠ Ġ* Ġfinger Ġstate , Ġwhenever Ġa Ġstate Ġshould Ġbe Ġchanged Ġafter Ġa Ġdelay Ġtimeout . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġinner Ġclass ĠChange State ( private Ġval Ġarray Index : ĠInt , Ġprivate Ġval ĠnewState : ĠState ) Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġlast Ġstate , Ġbefore Ġchanging Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ingers [ array Index ]. state Last Ġ= Ġf ingers [ array Index ]. state Current ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf ingers [ array Index ]. state Current Ġ= ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon F inger Listener ?. on StateChange ( f ingers , Ġarray Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPublic Ġinterface Ġwith Ġone Ġmethod , Ġthat Ġcan Ġbe Ġimplemented Ġand Ġlisten Ġfor ĊĠĠĠĠ Ġ* Ġf ingers Ġstate Ġchanges . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinterface ĠF inger Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġfinger Ġstate Ġis Ġchanged , Ġfirst Ġarguments Ġhold Ġthe Ġarray Ġwith ĊĠĠĠĠĠĠĠĠ Ġ* Ġall Ġfinger Ġobjects , Ġsecond Ġargument Ġis Ġthe Ġfinger Ġindex Ġshowing Ġwhich ĊĠĠĠĠĠĠĠĠ Ġ* Ġfinger Ġhas Ġa Ġstate Ġchange . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġf ingers Ġarray Ġwith Ġall Ġfinger Ġobjects ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfinger Index Ġfinger Ġindex Ġwhose Ġstate Ġis Ġchanged ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon StateChange ( f ingers : ĠArray < F inger >, Ġfinger Index : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠState ( private Ġval Ġstring : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠNONE (" NONE "), ĊĠĠĠĠĠĠĠ ĠS WI PE _ UP (" SW I PE ĠUP "), ĠS WI PE _ DOWN (" SW I PE ĠDOWN "), ĠS WI PE _ LEFT (" SW I PE ĠLEFT "), ĠS WI PE _ RIGHT (" SW I PE ĠRIGHT "), ĊĠĠĠĠĠĠĠ ĠH OLD _ DOWN (" H OLD ĠDOWN "), ĊĠĠĠĠĠĠĠ ĠDOWN (" DOWN "), ĠUP (" UP "), ĊĠĠĠĠĠĠĠ ĠMOVE _ UP (" MOVE ĠUP "), ĠMOVE _ DOWN (" MOVE ĠDOWN "), ĠMOVE _ LEFT (" MOVE ĠLEFT "), ĠMOVE _ RIGHT (" MOVE ĠRIGHT "), ĊĠĠĠĠĠĠĠ ĠDOUBLE _ T AP (" DOUBLE ĠT AP "); ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġstring ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠF inger ( ĊĠĠĠ Ġ/** min Ġdistance Ġthe Ġfinger Ġmust Ġtravel , Ġbefore Ġswipe Ġevent Ġcan Ġbe Ġdetected */ ĊĠĠĠ Ġvar Ġmin Distance Swipe : ĠInt , ĊĠĠĠ Ġ/** max Ġtime Ġafter Ġwhich Ġthe Ġswipe Ġevent ĠWILL ĠNOT Ġbe Ġdetected Ġ( ms ) */ ĊĠĠĠ Ġvar Ġmax Duration Swipe : ĠInt , ĊĠĠĠ Ġ/** min Ġdistance Ġthe Ġfinger Ġmust Ġtravel , Ġbefore Ġmove Ġevent Ġcan Ġbe Ġdetected */ ĊĠĠĠ Ġvar Ġmin Distance Move : ĠInt , ĊĠĠĠ Ġ/** max Ġdelay Ġtime Ġbetween Ġthe Ġtwo Ġ- down Ġevents Ġfor Ġthe Ġdouble Ġtap Ġ( ms ) */ ĊĠĠĠ Ġvar Ġmax Duration Double Tap : ĠInt , ĊĠĠĠ Ġ/** max Ġtime Ġthe Ġfinger Ġcan Ġbe Ġhold Ġdown Ġfor Ġthe Ġtwo Ġ- down Ġevents Ġ( ms ) */ ĊĠĠĠ Ġvar Ġmax Down Double Tap : ĠInt , ĊĠĠĠ Ġ/** slope Ġint olerance Ġfor Ġswipe Ġand Ġmove */ ĊĠĠĠ Ġvar Ġslope Int olerance : ĠDouble , ĊĠĠĠ Ġ/** current Ġfinger Ġstate Ġ- Ġdown , Ġup , Ġswipe _ left ... */ ĊĠĠĠ Ġvar Ġstate Current : ĠF inger Detector . State , ĊĠĠĠ Ġ/** previous Ġfinger Ġstate */ ĊĠĠĠ Ġvar Ġstate Last : ĠF inger Detector . State , ĊĠĠĠ Ġ/** distance Ġbetween Ġ- position Current Ġand Ġ- position Initial */ ĊĠĠĠ Ġvar Ġdistance Initial : ĠDouble , ĊĠĠĠ Ġ/** distance Ġbetween Ġ- position Current Ġand Ġ- position Last */ ĊĠĠĠ Ġvar Ġdistance Last : ĠDouble , ĊĠĠĠ Ġ/** duration Ġbetween Ġ- ACTION _ DOWN Ġand Ġcurrent Ġevent */ ĊĠĠĠ Ġvar Ġduration Initial : ĠDouble , ĊĠĠĠ Ġ/** duration Ġbetween Ġthe Ġprevious Ġand Ġcurrent Ġevent */ ĊĠĠĠ Ġvar Ġduration Last : ĠDouble , ĊĠĠĠ Ġ/** initial Ġtime Ġwhen Ġthe Ġfinger Ġis Ġpressed Ġdown Ġfrom Ġ- ACTION _ DOWN Ġevent */ ĊĠĠĠ Ġvar Ġtime Initial : ĠLong , ĊĠĠĠ Ġ/** previous ly Ġdetected Ġtime Ġfrom Ġ- ACTION _ UP , ĠACTION _ MOVE Ġevents */ ĊĠĠĠ Ġvar Ġtime Last : ĠLong , ĊĠĠĠ Ġ/** current Ġdetected Ġtime Ġfrom Ġ- ACTION _ UP , ĠACTION _ MOVE Ġevents */ ĊĠĠĠ Ġvar Ġtime Current : ĠLong , ĊĠĠĠ Ġ/** if Ġfinger Ġis Ġtracked Ġset Ġfrom Ġ- ACTION _ UP ( false ) Ġand Ġ- ACTION _ DOWN ( true ) Ġevents */ ĊĠĠĠ Ġvar Ġtracking : ĠBoolean , ĊĠĠĠ Ġ/** if Ġ- position Last Ġshould Ġbe Ġupdated Ġfrom Ġcurrent Ġevent */ ĊĠĠĠ Ġvar Ġupdate Last : ĠBoolean , ĊĠĠĠ Ġposition Delta Initial : ĠPoint F , Ġposition Delta Last : ĠPoint F , Ġposition Initial : ĠPoint F , Ġposition Last : ĠPoint F , Ġposition Current : ĠPoint F Ċ ) Ġ{ ĊĠĠĠ Ġ/** difference Ġbetween Ġ- position Current Ġand Ġ- position Initial */ ĊĠĠĠ Ġvar Ġposition Delta Initial : ĠPoint F Ġ= Ġposition Delta Initial . copy () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** difference Ġbetween Ġ- position Current Ġand Ġ- position Last */ ĊĠĠĠ Ġvar Ġposition Delta Last : ĠPoint F Ġ= Ġposition Delta Last . copy () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** initial Ġfinger Ġposition Ġwhen Ġit Ġis Ġpressed Ġdown Ġfor Ġ- ACTION _ DOWN Ġevent */ ĊĠĠĠ Ġvar Ġposition Initial : ĠPoint F Ġ= Ġposition Initial . copy () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** previous Ġfinger Ġposition Ġfrom Ġ- ACTION _ UP , ĠACTION _ MOVE Ġevents */ ĊĠĠĠ Ġvar Ġposition Last : ĠPoint F Ġ= Ġposition Last . copy () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** current Ġfinger Ġposition Ġfrom Ġ Ġ- ACTION _ UP , ĠACTION _ MOVE Ġevents */ ĊĠĠĠ Ġvar Ġposition Current : ĠPoint F Ġ= Ġposition Current . copy () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** last Ġfinger Ġobject Ġfrom Ġprevious Ġevent , Ġused Ġto Ġdetect Ġdouble Ġtap */ ĊĠĠĠ Ġvar Ġlast F inger : ĠF inger ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġmin Distance Swipe : ĠInt Ġ= ĠMIN _ DISTANCE _ SW I PE , Ġmax Duration Swipe : ĠInt Ġ= ĠMAX _ DURATION _ SW I PE , ĊĠĠĠĠĠĠĠ Ġmin Distance Move : ĠInt Ġ= ĠMIN _ DISTANCE _ MOVE , ĊĠĠĠĠĠĠĠ Ġmax Duration Double Tap : ĠInt Ġ= ĠMAX _ DURATION _ DOUBLE _ T AP , Ġmax Down Double Tap : ĠInt Ġ= ĠMAX _ DOWN _ DOUBLE _ T AP , ĊĠĠĠĠĠĠĠ Ġslope Int olerance : ĠInt Ġ= ĠS LO PE _ IN TO LER ANCE ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġmin Distance Swipe , Ġmax Duration Swipe , Ġmin Distance Move , ĊĠĠĠĠĠĠĠ Ġmax Duration Double Tap , Ġmax Down Double Tap , Ġslope Int olerance . toDouble (), ĠF inger Detector . State . NONE , ĊĠĠĠĠĠĠĠ ĠF inger Detector . State . NONE , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠ 0 , Ġ 0 , Ġ 0 , Ġfalse , Ġtrue , ĠPoint F (), ĠPoint F (), ĊĠĠĠĠĠĠĠ ĠPoint F (), ĠPoint F (), ĠPoint F () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġconstructor ( f : ĠF inger ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġf . min Distance Swipe , Ġf . max Duration Swipe , Ġf . min Distance Move , Ġf . max Duration Double Tap , ĊĠĠĠĠĠĠĠ Ġf . max Down Double Tap , Ġf . slope Int olerance , Ġf . state Current , Ġf . state Last , Ġf . distance Initial , ĊĠĠĠĠĠĠĠ Ġf . distance Last , Ġf . duration Initial , Ġf . duration Last , Ġf . time Initial , Ġf . time Last , ĊĠĠĠĠĠĠĠ Ġf . time Current , Ġf . tracking , Ġf . update Last , Ġf . position Delta Initial , ĊĠĠĠĠĠĠĠ Ġf . position Delta Last , Ġf . position Initial , Ġf . position Last , Ġf . position Current ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun ĠPoint F . copy (): ĠPoint F Ġ= ĠPoint F ( x , Ġy ) ĊĊĠĠĠ Ġprivate Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Current Ġ= ĠF inger Detector . State . NONE ĊĠĠĠĠĠĠĠ Ġstate Last Ġ= ĠF inger Detector . State . NONE ĊĠĠĠĠĠĠĠ Ġdistance Initial Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġdistance Last Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġduration Initial Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġduration Last Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġtime Initial Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtime Last Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtime Current Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtracking Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġupdate Last Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġposition Delta Initial Ġ= ĠPoint F () ĊĠĠĠĠĠĠĠ Ġposition Delta Last Ġ= ĠPoint F () ĊĠĠĠĠĠĠĠ Ġposition Initial Ġ= ĠPoint F () ĊĠĠĠĠĠĠĠ Ġposition Last Ġ= ĠPoint F () ĊĠĠĠĠĠĠĠ Ġposition Current Ġ= ĠPoint F () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermine Ġif Ġdouble Ġtap Ġis Ġmade Ġusing Ġinitial Ġtime Ġfrom Ġboth Ġfinger ĊĠĠĠĠ Ġ* Ġobject Ġ- current Ġand Ġ- last Ġto Ġdetermine Ġgesture Ġduration Ġand Ġuse Ġinitial ĊĠĠĠĠ Ġ* Ġduration Ġfrom Ġboth Ġfinger Ġobjects Ġto Ġdetermine Ġthe Ġfinger Ġdown Ġdelay . ĊĠĠĠĠ Ġ* ĠAnd Ġcheck Ġif Ġthose Ġvalues Ġare Ġin Ġallowed Ġranges . ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis Double Tap : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last F inger Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtime Initial Ġ- Ġlast F inger !!. time Initial Ġ< Ġmax Duration Double Tap Ġ&& Ġduration Initial Ġ< Ġmax Down Double Tap Ġ&& Ġlast F inger !!. duration Initial Ġ< Ġmax Down Double Tap ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġthat Ġdetermine Ġthe Ġnew Ġstate Ġand Ġsets Ġcurrent Ġfinger Ġobject ĊĠĠĠĠ Ġ* Ġstate Ġvalue . ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠĠĠĠĠĠĠ Ġon Touch Ġmotion Ġevent ĊĠĠĠĠ Ġ* Ġ@ param Ġpointer Index Ġpointer Ġindex Ġused , Ġto Ġget Ġcurrent Ġfinger Ġposition ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdetect State ( event : ĠMotion Event , Ġpointer Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Last Ġ= Ġstate Current ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġevent . action Ġand ĠMotion Event . ACTION _ MASK ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠMotion Event . ACTION _ DOWN Ġ|| Ġaction Ġ== ĠMotion Event . ACTION _ POINTER _ DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġfinger Ġis Ġpressed Ġdown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Initial ( event , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Current Ġ= ĠF inger Detector . State . DOWN ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( action Ġ== ĠMotion Event . ACTION _ UP Ġ|| Ġaction Ġ== ĠMotion Event . ACTION _ POINTER _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Last Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġfinger Ġis Ġlift Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( event , Ġpointer Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Double Tap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Current Ġ= ĠF inger Detector . State . DOUBLE _ T AP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( position Delta Initial . x ) Ġ< Ġmin Distance Swipe Ġ&& Ġabs ( position Delta Initial . y ) Ġ< Ġmin Distance Swipe Ġ|| Ġduration Initial Ġ> Ġmax Duration Swipe ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġminimum Ġdistance Ġis Ġnot Ġreached Ġor Ġthe Ġmaximum Ġtime Ġis Ġpassed , Ġswipe Ġis ĠNOT Ġdetected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Current Ġ= ĠF inger Detector . State . UP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetermine Ġthe Ġswipe Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġposition Delta Initial . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġposition Delta Initial . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- y Ġ> Ġslope Int olerance Ġ* Ġabs ( x ) Ġ-> ĠF inger Detector . State . SW I PE _ UP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ> Ġslope Int olerance Ġ* Ġabs ( x ) Ġ-> ĠF inger Detector . State . SW I PE _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- x Ġ> Ġslope Int olerance Ġ* Ġabs ( y ) Ġ-> ĠF inger Detector . State . SW I PE _ LEFT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ> Ġslope Int olerance Ġ* Ġabs ( y ) Ġ-> ĠF inger Detector . State . SW I PE _ RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġstate Current Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( action Ġ== ĠMotion Event . ACTION _ MOVE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġfinger Ġis Ġmoved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( event , Ġpointer Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġfinger Ġmoved Ġto Ġminimum Ġdistance Ġbefore , Ġdetect ing Ġthe Ġmove Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( position Delta Last . x ) Ġ< Ġmin Distance Move Ġ&& Ġabs ( position Delta Last . y ) Ġ< Ġmin Distance Move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Last Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Last Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetermine Ġthe Ġdirection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġposition Delta Last . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġposition Delta Last . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- y Ġ> Ġslope Int olerance Ġ* Ġabs ( x ) Ġ-> ĠF inger Detector . State . MOVE _ UP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ> Ġslope Int olerance Ġ* Ġabs ( x ) Ġ-> ĠF inger Detector . State . MOVE _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- x Ġ> Ġslope Int olerance Ġ* Ġabs ( y ) Ġ-> ĠF inger Detector . State . MOVE _ LEFT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ> Ġslope Int olerance Ġ* Ġabs ( y ) Ġ-> ĠF inger Detector . State . MOVE _ RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ Ġstate Current Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvent Ġthat Ġis Ġcalled Ġwhen Ġfinger Ġis Ġpressed Ġdown . ĠMethod Ġsaves ĊĠĠĠĠ Ġ* Ġfinger Ġobject Ġvalues Ġto Ġ- last F inger Ġobject Ġbefore Ġreset ting Ġcurrent ĊĠĠĠĠ Ġ* Ġfinger Ġvalues Ġto Ġdefault . ĠTh an Ġset Ġinitial Ġtime Ġand Ġfinger Ġposition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠĠĠĠĠĠĠ Ġ- Ġon Touch Ġmotion Ġevent ĊĠĠĠĠ Ġ* Ġ@ param Ġpointer Index Ġ- Ġfinger Ġindex Ġwhose Ġstate Ġwill Ġbe Ġchanged ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Initial ( event : ĠMotion Event , Ġpointer Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast F inger Ġ= ĠF inger ( this ) Ġ// Ġsave Ġcurrent Ġfinger Ġobject ĊĠĠĠĠĠĠĠ Ġreset () Ġ// Ġreset Ġcurrent ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġinitial Ġtime Ġand Ġposition ĊĠĠĠĠĠĠĠ Ġposition Initial Ġ= ĠPoint F ( event . getX ( pointer Index ), Ġevent . getY ( pointer Index )) ĊĠĠĠĠĠĠĠ Ġtime Initial Ġ= ĠSystem Clock . uptime Millis () ĊĠĠĠĠĠĠĠ Ġtracking Ġ= Ġtrue Ġ// Ġsince Ġit Ġis Ġcalled Ġfrom Ġdown Ġevent Ġand Ġtracking Ġhas Ġbegan ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġprevious Ġand Ġcurrent Ġtime , Ġfinger Ġposition , ĊĠĠĠĠ Ġ* Ġdelta , Ġdistance Ġand Ġduration Ġfor Ġthe Ġgesture ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent ĠĠĠĠĠĠĠ Ġ- Ġon Touch Ġmotion Ġevent ĊĠĠĠĠ Ġ* Ġ@ param Ġpointer Index Ġ- Ġfinger Ġindex Ġwhose Ġstate Ġwill Ġbe Ġchanged ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( event : ĠMotion Event , Ġpointer Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( update Last ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Last Ġ= ĠPoint F ( position Current . x , Ġposition Current . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Last Ġ= Ġtime Current ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġposition Current Ġ= ĠPoint F ( event . getX ( pointer Index ), Ġevent . getY ( pointer Index )) ĊĠĠĠĠĠĠĠ Ġtime Current Ġ= ĠSystem Clock . uptime Millis () ĊĊĠĠĠĠĠĠĠ Ġ// Ġdelta Ġand Ġdistance Ġbetween Ġ- position Current Ġand Ġ- position Last ĊĠĠĠĠĠĠĠ Ġposition Delta Last Ġ= ĠPoint F ( position Current . x Ġ- Ġposition Last . x , Ġposition Current . y Ġ- Ġposition Last . y ) ĊĠĠĠĠĠĠĠ Ġdistance Last Ġ= Ġsqrt ( position Delta Last . x . toDouble (). pow ( 2 . 0 ) Ġ+ Ġposition Delta Last . y . toDouble (). pow ( 2 . 0 )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġdelta Ġand Ġdistance Ġbetween Ġ- position Current Ġand Ġ- position Initial ĊĠĠĠĠĠĠĠ Ġposition Delta Initial Ġ= ĠPoint F ( position Current . x Ġ- Ġposition Initial . x , Ġposition Current . y Ġ- Ġposition Initial . y ) ĊĠĠĠĠĠĠĠ Ġdistance Initial Ġ= Ġsqrt ( position Delta Initial . x . toDouble (). pow ( 2 . 0 ) Ġ+ Ġposition Delta Initial . y . toDouble (). pow ( 2 . 0 )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġduration ĊĠĠĠĠĠĠĠ Ġduration Last Ġ= Ġtime Current Ġ- Ġtime Last . toDouble () ĊĠĠĠĠĠĠĠ Ġduration Initial Ġ= Ġtime Current Ġ- Ġtime Initial . toDouble () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" F inger ( time Current =$ time Current , Ġposition Current =$ position Current , Ġcurrent State =$ state Current )" ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġpublic Ġdefault Ġconstants ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ DISTANCE _ SW I PE Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ DURATION _ SW I PE Ġ= Ġ 4 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ DISTANCE _ MOVE Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ DURATION _ DOUBLE _ T AP Ġ= Ġ 2 5 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ DOWN _ DOUBLE _ T AP Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS LO PE _ IN TO LER ANCE Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRegister Ġa Ġcallback Ġto Ġbe Ġinvoked Ġwhen Ġa Ġfinger / gesture Ġevent Ġis Ġsent Ġto Ġthis Ġview . Ċ Ġ* Ġ@ param ĠnumberOf F ingers Ġthe Ġnumber Ġof Ġf ingers Ġto Ġlisten Ġto Ċ Ġ* Ġ@ param Ġl Ġthe Ġfinger Ġlistener Ġto Ġattach Ġto Ġthis Ġview Ċ Ġ*/ Ċ fun ĠView . setOn F inger Detector ( numberOf F ingers : ĠInt Ġ= Ġ 1 , Ġl : ĠF inger Detector . F inger Listener ?) Ġ= Ġl ĊĠĠĠ Ġ? . let Ġ{ ĠF inger Detector ( numberOf F ingers Ġ= ĠnumberOf F ingers ). apply Ġ{ Ġon F inger Listener Ġ= Ġit Ġ} Ġ} ĊĠĠĠ Ġ. apply Ġ{ Ġset On Touch Listener ( this ) Ġ} Ċ