/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . compose . foundation . gest ures Ċ Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Event Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Input Change Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Input Scope Ċ import Ġandroidx . compose . ui . input . pointer . any Position Change Cons umed Ċ import Ġandroidx . compose . ui . input . pointer . consume All Changes Ċ import Ġandroidx . compose . ui . input . pointer . position Changed Ċ import Ġandroidx . compose . ui . util . fast Any Ċ import Ġandroidx . compose . ui . util . fast ForEach Ċ import Ġandroidx . compose . ui . util . fast Sum By Ċ import Ġkotlin . contracts . Experimental Contracts Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . atan 2 Ċ Ċ /** Ċ Ġ* ĠA Ġgesture Ġdetector Ġfor Ġrotation g , Ġp anning , Ġand Ġzoom . ĠOnce Ġtouch Ġs lop Ġhas Ġbeen Ġreached , Ġthe Ċ Ġ* Ġuser Ġcan Ġuse Ġrotation , Ġp anning Ġand Ġzoom Ġgest ures . Ġ[ on Rotate ] Ġwill Ġbe Ġcalled Ġwhen Ġrotation Ċ Ġ* Ġoccurs , Ġpassing Ġthe Ġangle Ġin Ġdegrees , Ġ[ on Zoom ] Ġwill Ġbe Ġcalled Ġwhen Ġzoom Ġoccurs , Ġand Ġ[ on Pan ] Ċ Ġ* Ġwill Ġbe Ġcalled Ġwhen Ġa Ġpan Ġoccurs . ĠEach Ġof Ġthese Ġchanges Ġis Ġa Ġdifference Ġbetween Ġthe Ġprevious Ċ Ġ* Ġcall Ġand Ġthe Ġcurrent Ġgesture . ĠThis Ġwill Ġconsume Ġall Ġposition Ġchanges Ġafter Ġtouch Ġs lop Ġhas Ċ Ġ* Ġbeen Ġreached . Ċ Ġ* Ċ Ġ* ĠIf Ġ[ pan Zoom Lock ] Ġis Ġ` true `, Ġrotation Ġis Ġallowed Ġonly Ġif Ġtouch Ġs lop Ġis Ġdetected Ġfor Ġrotation Ċ Ġ* Ġbefore Ġpan Ġor Ġzoom Ġmot ions . ĠIf Ġnot , Ġpan Ġand Ġzoom Ġgest ures Ġwill Ġbe Ġdetected , Ġbut Ġrotation Ċ Ġ* Ġgest ures Ġwill Ġnot Ġbe . ĠIf Ġ[ pan Zoom Lock ] Ġis Ġ` false `, Ġonce Ġtouch Ġs lop Ġis Ġreached , Ġall Ġthree Ċ Ġ* Ġgest ures Ġare Ġdetected . Ċ Ġ* Ċ Ġ* ĠExample ĠUsage : Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Detect Mult it ouch Gest ures Ċ Ġ*/ Ċ suspend Ġfun ĠPointer Input Scope . detect Mult it ouch Gest ures ( ĊĠĠĠ Ġpan Zoom Lock : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġon Gesture : Ġ( centroid : ĠOffset , Ġpan : ĠOffset , Ġzoom : ĠFloat , Ġrotation : ĠFloat ) Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠforEach Gesture Ġ{ ĊĠĠĠĠĠĠĠ Ġawait Pointer Event Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrotation Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġzoom Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpan Ġ= ĠOffset . Zero ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpast Touch S lop Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtouch S lop Ġ= Ġview Configuration . touch S lop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlocked To Pan Zoom Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait First Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġawait Pointer Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanceled Ġ= Ġevent . changes . fast Any Ġ{ Ġit . any Position Change Cons umed () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! c anceled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzoom Change Ġ= Ġevent . calculate Zoom () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Change Ġ= Ġevent . calculate Rotation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpan Change Ġ= Ġevent . calculate Pan () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! past Touch S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Ġ*= Ġzoom Change ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Ġ+= Ġrotation Change ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpan Ġ+= Ġpan Change ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcentroid Size Ġ= Ġevent . calculate Cent roid Size ( use Current Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzoom Motion Ġ= Ġabs ( 1 Ġ- Ġzoom ) Ġ* Ġcentroid Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Motion Ġ= Ġabs ( rotation Ġ* ĠPI . toFloat () Ġ* Ġcentroid Size Ġ/ Ġ 1 8 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpan Motion Ġ= Ġpan . get Distance () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( zoom Motion Ġ> Ġtouch S lop Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Motion Ġ> Ġtouch S lop Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpan Motion Ġ> Ġtouch S lop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpast Touch S lop Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocked To Pan Zoom Ġ= Ġpan Zoom Lock Ġ&& Ġrotation Motion Ġ< Ġtouch S lop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( past Touch S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcentroid Ġ= Ġevent . calculate Cent roid ( use Current Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeffective Rotation Ġ= Ġif Ġ( locked To Pan Zoom ) Ġ 0 f Ġelse Ġrotation Change ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( effective Rotation Ġ!= Ġ 0 f Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Change Ġ!= Ġ 1 f Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpan Change Ġ!= ĠOffset . Zero ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Gesture ( centroid , Ġpan Change , Ġzoom Change , Ġeffective Rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . changes . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . position Changed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . consume All Changes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! c anceled Ġ&& Ġevent . changes . fast Any Ġ{ Ġit . current . down Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġrotation , Ġin Ġdegrees , Ġof Ġthe Ġpointers Ġbetween Ġthe Ġ[ Pointer Input Change . previous ] Ċ Ġ* Ġand Ġ[ Pointer Input Change . current ] Ġstates . ĠOnly Ġthe Ġpointers Ġthat Ġare Ġdown Ġin Ġboth Ġprevious Ċ Ġ* Ġand Ġcurrent Ġstates Ġare Ġconsidered . Ċ Ġ* Ċ Ġ* ĠExample ĠUsage : Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Calculate Rotation Ċ Ġ*/ Ċ fun ĠPointer Event . calculate Rotation (): ĠFloat Ġ{ ĊĠĠĠ Ġval Ġpointer Count Ġ= Ġchanges . fast Sum By Ġ{ Ġif Ġ( it . previous . down Ġ&& Ġit . current . down ) Ġ 1 Ġelse Ġ 0 Ġ} ĊĠĠĠ Ġif Ġ( pointer Count Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 f ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcurrent Cent roid Ġ= Ġcalculate Cent roid ( use Current Ġ= Ġtrue ) ĊĠĠĠ Ġval Ġprevious Cent roid Ġ= Ġcalculate Cent roid ( use Current Ġ= Ġfalse ) ĊĠĠĠ Ġvar Ġrotation Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġrotation Weight Ġ= Ġ 0 f ĊĊĠĠĠ Ġ// ĠWe Ġwant Ġto Ġwe igh Ġeach Ġpointer Ġdifferently Ġso Ġthat Ġmot ions Ġfar ther Ġfrom Ġthe ĊĠĠĠ Ġ// Ġcentroid Ġhave Ġmore Ġweight Ġthan Ġpointers Ġclose Ġto Ġthe Ġcentroid . ĠEss entially , ĊĠĠĠ Ġ// Ġa Ġsmall Ġdistance Ġchange Ġnear Ġthe Ġcentroid Ġcould Ġequ ate Ġto Ġa Ġlarge Ġangle ĊĠĠĠ Ġ// Ġchange Ġand Ġwe Ġdon 't Ġwant Ġit Ġto Ġaffect Ġthe Ġrotation Ġas Ġmuch Ġas Ġpointers Ġfar ther ĊĠĠĠ Ġ// Ġfrom Ġthe Ġcentroid , Ġwhich Ġshould Ġbe Ġmore Ġstable . ĊĊĠĠĠ Ġchanges . fast ForEach Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( change . current . down Ġ&& Ġchange . previous . down ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Position Ġ= Ġchange . current . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Position Ġ= Ġchange . previous . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Offset Ġ= Ġprevious Position Ġ- Ġprevious Cent roid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Offset Ġ= Ġcurrent Position Ġ- Ġcurrent Cent roid ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Angle Ġ= Ġprevious Offset . angle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Angle Ġ= Ġcurrent Offset . angle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Diff Ġ= Ġcurrent Angle Ġ- Ġprevious Angle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Ġ= Ġ( current Offset Ġ+ Ġprevious Offset ). get Distance () Ġ/ Ġ 2 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwe igh Ġthe Ġrotation Ġwith Ġthe Ġdistance Ġto Ġthe Ġcentroid . ĠThis Ġgives ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmore Ġweight Ġto Ġangle Ġchanges Ġfrom Ġpointers Ġfar ther Ġfrom Ġthe Ġcentroid Ġthan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthose Ġthat Ġare Ġcloser . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Ġ+= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġangle Diff Ġ> Ġ 1 8 0 f Ġ-> Ġangle Diff Ġ- Ġ 3 6 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġangle Diff Ġ< Ġ- 1 8 0 f Ġ-> Ġangle Diff Ġ+ Ġ 3 6 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġangle Diff ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ* Ġweight ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġweight Ġits Ġcontribution Ġby Ġthe Ġdistance Ġto Ġthe Ġcentroid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Weight Ġ+= Ġweight ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġif Ġ( rotation Weight Ġ== Ġ 0 f ) Ġ 0 f Ġelse Ġrotation Ġ/ Ġrotation Weight Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġangle Ġof Ġthe Ġ[ Offset ] Ġbetween Ġ- 1 8 0 Ġand Ġ 1 8 0 , Ġor Ġ 0 Ġif Ġ[ Offset . Zero ]. Ċ Ġ*/ Ċ private Ġfun ĠOffset . angle (): ĠFloat Ġ= ĊĠĠĠ Ġif Ġ( x Ġ== Ġ 0 f Ġ&& Ġy Ġ== Ġ 0 f ) Ġ 0 f Ġelse Ġ- atan 2 ( x , Ġy ) Ġ* Ġ 1 8 0 f Ġ/ ĠPI . toFloat () Ċ Ċ /** Ċ Ġ* ĠUses Ġthe Ġchange Ġof Ġthe Ġcentroid Ġsize Ġbetween Ġthe Ġ[ Pointer Input Change . previous ] Ġand Ċ Ġ* Ġ[ Pointer Input Change . current ] Ġto Ġdetermine Ġhow Ġmuch Ġzoom Ġwas Ġintended . Ċ Ġ* Ċ Ġ* ĠExample ĠUsage : Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Calculate Zoom Ċ Ġ*/ Ċ fun ĠPointer Event . calculate Zoom (): ĠFloat Ġ{ ĊĠĠĠ Ġval Ġcurrent Cent roid Size Ġ= Ġcalculate Cent roid Size ( use Current Ġ= Ġtrue ) ĊĠĠĠ Ġval Ġprevious Cent roid Size Ġ= Ġcalculate Cent roid Size ( use Current Ġ= Ġfalse ) ĊĠĠĠ Ġif Ġ( current Cent roid Size Ġ== Ġ 0 f Ġ|| Ġprevious Cent roid Size Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 1 f ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcurrent Cent roid Size Ġ/ Ġprevious Cent roid Size Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġchange Ġin Ġthe Ġcentroid Ġlocation Ġbetween Ġthe Ġprevious Ġand Ġthe Ġcurrent Ġpointers Ġthat Ċ Ġ* Ġare Ġdown . ĠPointer s Ġthat Ġare Ġnewly Ġdown Ġor Ġraised Ġare Ġnot Ġconsidered Ġin Ġthe Ġcentroid Ċ Ġ* Ġmovement . Ċ Ġ* Ċ Ġ* ĠExample ĠUsage : Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Calculate Pan Ċ Ġ*/ Ċ fun ĠPointer Event . calculate Pan (): ĠOffset Ġ{ ĊĠĠĠ Ġval Ġcurrent Cent roid Ġ= Ġcalculate Cent roid ( use Current Ġ= Ġtrue ) ĊĠĠĠ Ġif Ġ( current Cent roid Ġ== ĠOffset . Unspecified ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠOffset . Zero ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġprevious Cent roid Ġ= Ġcalculate Cent roid ( use Current Ġ= Ġfalse ) ĊĠĠĠ Ġreturn Ġcurrent Cent roid Ġ- Ġprevious Cent roid Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġaverage Ġdistance Ġfrom Ġthe Ġcentroid Ġfor Ġall Ġpointers Ġthat Ġare Ġcurrently Ċ Ġ* Ġand Ġwere Ġpreviously Ġdown . ĠIf Ġno Ġpointers Ġare Ġdown , Ġ` 0 ` Ġis Ġreturned . Ċ Ġ* ĠIf Ġ[ use Current ] Ġis Ġ` true `, Ġthe Ġsize Ġof Ġthe Ġ[ Pointer Input Change . current ] Ġis Ġreturned Ġand Ġif Ċ Ġ* Ġ` false `, Ġthe Ġsize Ġof Ġ[ Pointer Input Change . previous ] Ġis Ġreturned . ĠOnly Ġpointers Ġthat Ġare Ġdown Ċ Ġ* Ġin Ġboth Ġthe Ġprevious Ġand Ġcurrent Ġstate Ġare Ġused Ġto Ġcalculate Ġthe Ġcentroid Ġsize . Ċ Ġ* Ċ Ġ* ĠExample ĠUsage : Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Calculate Cent roid Size Ċ Ġ*/ Ċ fun ĠPointer Event . calculate Cent roid Size ( use Current : ĠBoolean Ġ= Ġtrue ): ĠFloat Ġ{ ĊĠĠĠ Ġval Ġcentroid Ġ= Ġcalculate Cent roid ( use Current ) ĊĠĠĠ Ġif Ġ( centroid Ġ== ĠOffset . Unspecified ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġdistance To Cent roid Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġdistance Weight Ġ= Ġ 0 ĊĠĠĠ Ġchanges . fast ForEach Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( change . current . down Ġ&& Ġchange . previous . down ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġif Ġ( use Current ) Ġchange . current Ġelse Ġchange . previous ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistance To Cent roid Ġ+= Ġ( data . position Ġ- Ġcentroid ). get Distance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Weight ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdistance To Cent roid Ġ/ Ġdistance Weight . toFloat () Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġcentroid Ġof Ġall Ġpointers Ġthat Ġare Ġdown Ġand Ġwere Ġpreviously Ġdown . ĠIf Ġno Ġpointers Ċ Ġ* Ġare Ġdown , Ġ[ Offset . Unspecified ] Ġis Ġreturned . ĠIf Ġ[ use Current ] Ġis Ġ` true `, Ġthe Ġcentroid Ġof Ġthe Ċ Ġ* Ġ[ Pointer Input Change . current ] Ġis Ġreturned Ġand Ġif Ġ` false `, Ġthe Ġcentroid Ġof Ġthe Ċ Ġ* Ġ[ Pointer Input Change . previous ] Ġis Ġreturned . ĠOnly Ġpointers Ġthat Ġare Ġdown Ġin Ġboth Ġthe Ġprevious Ġand Ċ Ġ* Ġcurrent Ġstate Ġare Ġused Ġto Ġcalculate Ġthe Ġcentroid . Ċ Ġ* Ċ Ġ* ĠExample ĠUsage : Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Calculate Cent roid Size Ċ Ġ*/ Ċ @ Opt In ( Experimental Contracts :: class ) Ċ fun ĠPointer Event . calculate Cent roid ( ĊĠĠĠ Ġuse Current : ĠBoolean Ġ= Ġtrue Ċ ): ĠOffset Ġ{ ĊĠĠĠ Ġvar Ġcentroid Ġ= ĠOffset . Zero ĊĠĠĠ Ġvar Ġcentroid Weight Ġ= Ġ 0 ĊĊĠĠĠ Ġchanges . fast ForEach Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( change . current . down Ġ&& Ġchange . previous . down ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġif Ġ( use Current ) Ġchange . current Ġelse Ġchange . previous ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid Ġ+= Ġdata . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid Weight ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġif Ġ( centroid Weight Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠOffset . Unspecified ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcentroid Ġ/ Ġcentroid Weight . toFloat () ĊĠĠĠ Ġ} Ċ } Ċ