/* Ċ Ġ* Ġ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 . samples Ċ Ċ import Ġandroidx . annotation . Sample d Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . gest ures . calculate Cent roid Ċ import Ġandroidx . compose . foundation . gest ures . calculate Cent roid Size Ċ import Ġandroidx . compose . foundation . gest ures . calculate Pan Ċ import Ġandroidx . compose . foundation . gest ures . calculate Rotation Ċ import Ġandroidx . compose . foundation . gest ures . calculate Zoom Ċ import Ġandroidx . compose . foundation . gest ures . detect Mult it ouch Gest ures Ċ import Ġandroidx . compose . foundation . gest ures . forEach Gesture Ċ import Ġandroidx . compose . foundation . gest ures . await First Down Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . offset Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . draw Be hind Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . graphics Layer Ċ import Ġandroidx . compose . ui . input . pointer . pointer Input Ċ Ċ @ Composable Ċ @ Sample d Ċ fun ĠDetect Mult it ouch Gest ures () Ġ{ ĊĠĠĠ Ġvar Ġangle Ġby Ġremember Ġ{ Ġmutable State Of ( 0 f ) Ġ} ĊĠĠĠ Ġvar Ġzoom Ġby Ġremember Ġ{ Ġmutable State Of ( 1 f ) Ġ} ĊĠĠĠ Ġvar Ġoffset X Ġby Ġremember Ġ{ Ġmutable State Of ( 0 f ) Ġ} ĊĠĠĠ Ġvar Ġoffset Y Ġby Ġremember Ġ{ Ġmutable State Of ( 0 f ) Ġ} ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ ĠModifier . offset ({ Ġoffset X Ġ}, Ġ{ Ġoffset Y Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. graphics Layer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X Ġ= Ġzoom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġzoom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Z Ġ= Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( Color . Blue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetect Mult it ouch Gest ures ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Gesture Ġ= Ġ{ Ġ_, Ġpan , Ġgesture Zoom , Ġgesture Rotate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġangle Ġ+= Ġgesture Rotate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Ġ*= Ġgesture Zoom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset X Ġ+= Ġpan . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Y Ġ+= Ġpan . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ @ Sample d Ċ fun ĠCalculate Rotation () Ġ{ ĊĠĠĠ Ġvar Ġangle Ġby Ġremember Ġ{ Ġmutable State Of ( 0 f ) Ġ} ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. graphics Layer ( rotation Z Ġ= Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( Color . Blue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Pointer Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait First Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġawait Pointer Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġevent . calculate Rotation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġangle Ġ+= Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( event . changes . any Ġ{ Ġit . current . down Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ @ Sample d Ċ fun ĠCalculate Zoom () Ġ{ ĊĠĠĠ Ġvar Ġzoom Ġby Ġremember Ġ{ Ġmutable State Of ( 1 f ) Ġ} ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. graphics Layer ( scale X Ġ= Ġzoom , Ġscale Y Ġ= Ġzoom ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( Color . Blue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Pointer Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait First Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġawait Pointer Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom Ġ*= Ġevent . calculate Zoom () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( event . changes . any Ġ{ Ġit . current . down Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ @ Sample d Ċ fun ĠCalculate Pan () Ġ{ ĊĠĠĠ Ġval Ġoffset X Ġ= Ġremember Ġ{ Ġmutable State Of ( 0 f ) Ġ} ĊĠĠĠ Ġval Ġoffset Y Ġ= Ġremember Ġ{ Ġmutable State Of ( 0 f ) Ġ} ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset ({ Ġoffset X . value Ġ}, Ġ{ Ġoffset Y . value Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. graphics Layer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( Color . Blue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Pointer Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait First Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġawait Pointer Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġevent . calculate Pan () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset X . value Ġ+= Ġoffset . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Y . value Ġ+= Ġoffset . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( event . changes . any Ġ{ Ġit . current . down Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ @ Sample d Ċ fun ĠCalculate Cent roid Size () Ġ{ ĊĠĠĠ Ġvar Ġcentroid Size Ġby Ġremember Ġ{ Ġmutable State Of ( 0 f ) Ġ} ĊĠĠĠ Ġvar Ġposition Ġby Ġremember Ġ{ Ġmutable State Of ( Offset . Zero ) Ġ} ĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. draw Be hind Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDraw Ġa Ġcircle Ġwhere Ġthe Ġgesture Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Circle ( Color . Blue , Ġcentroid Size , Ġcenter Ġ= Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Gesture Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Pointer Input Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait First Down (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġit . current . position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġawait Pointer Event () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġevent . calculate Cent roid Size () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcentroid Size Ġ= Ġevent . calculate Cent roid Size () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcentroid Ġ= Ġevent . calculate Cent roid () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( centroid Ġ!= ĠOffset . Unspecified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġcentroid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( event . changes . any Ġ{ Ġit . current . down Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠ Ġ) Ċ }