/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġ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 Ċ Ċ import Ġandroidx . compose . animation . core . Animation Spec Ċ import Ġandroidx . compose . animation . core . Spring Spec Ċ import Ġandroidx . compose . foundation . gest ures . Fl ing Behavior Ċ import Ġandroidx . compose . foundation . gest ures . Orientation Ċ import Ġandroidx . compose . foundation . gest ures . Over Scroll Controller Ċ import Ġandroidx . compose . foundation . gest ures . Scroll Scope Ċ import Ġandroidx . compose . foundation . gest ures . Scroll able Defaults Ċ import Ġandroidx . compose . foundation . gest ures . Scroll able State Ċ import Ġandroidx . compose . foundation . gest ures . animate Scroll By Ċ import Ġandroidx . compose . foundation . gest ures . remember Over Scroll Controller Ċ import Ġandroidx . compose . foundation . gest ures . scroll By Ċ import Ġandroidx . compose . foundation . gest ures . scroll able Ċ import Ġandroidx . compose . foundation . interaction . Interaction Source Ċ import Ġandroidx . compose . foundation . interaction . Mutable Interaction Source Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Stable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . runtime . save able . Saver Ċ import Ġandroidx . compose . runtime . save able . remember Save able Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . runtime . struct ural Equality Policy Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . composed Ċ import Ġandroidx . compose . ui . draw . clip Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . geometry . Size Ċ import Ġandroidx . compose . ui . graphics . Outline Ċ import Ġandroidx . compose . ui . graphics . Shape Ċ import Ġandroidx . compose . ui . layout . Intr insic Meas ur able Ċ import Ġandroidx . compose . ui . layout . Intr insic Measure Scope Ċ import Ġandroidx . compose . ui . layout . Layout Modifier Ċ import Ġandroidx . compose . ui . layout . Meas ur able Ċ import Ġandroidx . compose . ui . layout . Measure Result Ċ import Ġandroidx . compose . ui . layout . Measure Scope Ċ import Ġandroidx . compose . ui . platform . Local Layout Direction Ċ import Ġandroidx . compose . ui . platform . debug Inspector Info Ċ import Ġandroidx . compose . ui . semantics . Scroll Axis Range Ċ import Ġandroidx . compose . ui . semantics . horizontal Scroll Axis Range Ċ import Ġandroidx . compose . ui . semantics . scroll By Ċ import Ġandroidx . compose . ui . semantics . semantics Ċ import Ġandroidx . compose . ui . semantics . vertical Scroll Axis Range Ċ import Ġandroidx . compose . ui . unit . Constraints Ċ import Ġandroidx . compose . ui . unit . Density Ċ import Ġandroidx . compose . ui . unit . Layout Direction Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . math . round ToInt Ċ Ċ /** Ċ Ġ* ĠCreate Ġand Ġ[ remember ] Ġthe Ġ[ Scroll State ] Ġbased Ġon Ġthe Ġcurrently Ġappropriate Ġscroll Ċ Ġ* Ġconfiguration Ġto Ġallow Ġchanging Ġscroll Ġposition Ġor Ġob serving Ġscroll Ġbehavior . Ċ Ġ* Ċ Ġ* ĠLearn Ġhow Ġto Ġcontrol Ġthe Ġstate Ġof Ġ[ Modifier . vertical Scroll ] Ġor Ġ[ Modifier . horizontal Scroll ]: Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Control led Scroll able Row Sample Ċ Ġ* Ċ Ġ* Ġ@ param Ġinitial Ġinitial Ġsc roller Ġposition Ġto Ġstart Ġwith Ċ Ġ*/ Ċ @ Composable Ċ fun Ġremember Scroll State ( initial : ĠInt Ġ= Ġ 0 ): ĠScroll State Ġ{ ĊĠĠĠ Ġreturn Ġremember Save able ( sa ver Ġ= ĠScroll State . Saver ) Ġ{ ĊĠĠĠĠĠĠĠ ĠScroll State ( initial Ġ= Ġinitial ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠState Ġof Ġthe Ġscroll . ĠAllows Ġthe Ġdeveloper Ġto Ġchange Ġthe Ġscroll Ġposition Ġor Ġget Ġcurrent Ġstate Ġby Ċ Ġ* Ġcalling Ġmethods Ġon Ġthis Ġobject . ĠTo Ġbe Ġhosted Ġand Ġpassed Ġto Ġ[ Modifier . vertical Scroll ] Ġor Ċ Ġ* Ġ[ Modifier . horizontal Scroll ] Ċ Ġ* Ċ Ġ* ĠTo Ġcreate Ġand Ġautomatically Ġremember Ġ[ Scroll State ] Ġwith Ġdefault Ġparameters Ġuse Ċ Ġ* Ġ[ remember Scroll State ]. Ċ Ġ* Ċ Ġ* ĠLearn Ġhow Ġto Ġcontrol Ġthe Ġstate Ġof Ġ[ Modifier . vertical Scroll ] Ġor Ġ[ Modifier . horizontal Scroll ]: Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Control led Scroll able Row Sample Ċ Ġ* Ċ Ġ* Ġ@ param Ġinitial Ġvalue Ġof Ġthe Ġscroll Ċ Ġ*/ Ċ @ Stable Ċ class ĠScroll State ( initial : ĠInt ) Ġ: ĠScroll able State Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcurrent Ġscroll Ġposition Ġvalue Ġin Ġpixels ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġvalue : ĠInt Ġby Ġmutable State Of ( initial , Ġstructural Equality Policy ()) ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġmaximum Ġbound Ġfor Ġ[ value ], Ġor Ġ[ Int . MAX _ VALUE ] Ġif Ġstill Ġunknown ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar ĠmaxValue : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ max Value State . value ĊĠĠĠĠĠĠĠ Ġinternal Ġset ( new Max ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ max Value State . value Ġ= Ġnew Max ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġnew Max ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnew Max ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ[ Interaction Source ] Ġthat Ġwill Ġbe Ġused Ġto Ġdispatch Ġdrag Ġevents Ġwhen Ġthis ĊĠĠĠĠ Ġ* Ġlist Ġis Ġbeing Ġdrag ged . ĠIf Ġyou Ġwant Ġto Ġknow Ġwhether Ġthe Ġfl ing Ġ( or Ġsmooth Ġscroll ) Ġis Ġin ĊĠĠĠĠ Ġ* Ġprogress , Ġuse Ġ[ is Scroll InProgress ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġinteraction Source : ĠInteraction Source Ġget () Ġ= Ġinternal Interaction Source ĊĊĠĠĠ Ġinternal Ġval Ġinternal Interaction Source : ĠMutable Interaction Source Ġ= ĠMutable Interaction Source () ĊĊĠĠĠ Ġprivate Ġvar Ġ_ max Value State Ġ= Ġmutable State Of ( Int . MAX _ VALUE , Ġstructural Equality Policy ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWe Ġreceive Ġscroll Ġevents Ġin Ġfloats Ġbut Ġrepresent Ġthe Ġscroll Ġposition Ġin Ġints Ġso Ġwe Ġhave Ġto ĊĠĠĠĠ Ġ* Ġmanually Ġaccum ulate Ġthe Ġfraction al Ġpart Ġof Ġthe Ġscroll Ġto Ġnot Ġcompletely Ġignore Ġit . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġaccumulator : ĠFloat Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġval Ġscroll able State Ġ= ĠScroll able State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġabsolute Ġ= Ġ( value Ġ+ Ġit Ġ+ Ġaccumulator ) ĊĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġabsolute . coerce In ( 0 f , ĠmaxValue . toFloat ()) ĊĠĠĠĠĠĠĠ Ġval Ġchanged Ġ= Ġabsolute Ġ!= ĠnewValue ĊĠĠĠĠĠĠĠ Ġval Ġconsumed Ġ= ĠnewValue Ġ- Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġconsumed Int Ġ= Ġconsumed . round ToInt () ĊĠĠĠĠĠĠĠ Ġvalue Ġ+= Ġconsumed Int ĊĠĠĠĠĠĠĠ Ġaccumulator Ġ= Ġconsumed Ġ- Ġconsumed Int ĊĊĠĠĠĠĠĠĠ Ġ// ĠAvoid Ġfloating - point Ġrounding Ġerror ĊĠĠĠĠĠĠĠ Ġif Ġ( changed ) Ġconsumed Ġelse Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġscroll ( ĊĠĠĠĠĠĠĠ Ġscroll Priority : ĠMut ate Priority , ĊĠĠĠĠĠĠĠ Ġblock : Ġsuspend ĠScroll Scope . () Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠUnit Ġ= Ġscroll able State . scroll ( scroll Priority , Ġblock ) ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Raw Delta ( delta : ĠFloat ): ĠFloat Ġ= ĊĠĠĠĠĠĠĠ Ġscroll able State . dispatch Raw Delta ( delta ) ĊĊĠĠĠ Ġoverride Ġval Ġis Scroll InProgress : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġscroll able State . is Scroll InProgress ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScroll Ġto Ġposition Ġin Ġpixels Ġwith Ġanimation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġtarget Ġvalue Ġin Ġpixels Ġto Ġsmooth Ġscroll Ġto , Ġvalue Ġwill Ġbe Ġco er ced Ġto ĊĠĠĠĠ Ġ* Ġ 0 .. max Position ĊĠĠĠĠ Ġ* Ġ@ param Ġanimation Spec Ġanimation Ġcurve Ġfor Ġsmooth Ġscroll Ġanimation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġanimate Scroll To ( ĊĠĠĠĠĠĠĠ Ġvalue : ĠInt , ĊĠĠĠĠĠĠĠ Ġanimation Spec : ĠAnimation Spec < Float > Ġ= ĠSpring Spec () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . animate Scroll By (( value Ġ- Ġthis . value ). toFloat (), Ġanimation Spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInstant ly Ġjump Ġto Ġthe Ġgiven Ġposition Ġin Ġpixels . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCancel s Ġthe Ġcurrently Ġrunning Ġscroll , Ġif Ġany , Ġand Ġsus p ends Ġuntil Ġthe Ġcancellation Ġis ĊĠĠĠĠ Ġ* Ġcomplete . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġanimate Scroll To Ġfor Ġan Ġanimated Ġversion ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġnumber Ġof Ġpixels Ġto Ġscroll Ġby ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġamount Ġof Ġscroll Ġconsumed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġscroll To ( value : ĠInt ): ĠFloat Ġ= Ġthis . scroll By (( value Ġ- Ġthis . value ). toFloat ()) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġdefault Ġ[ Saver ] Ġimplementation Ġfor Ġ[ Scroll State ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠS aver : ĠS aver < Scroll State , Ġ*> Ġ= ĠS aver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Ġ= Ġ{ Ġit . value Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Ġ= Ġ{ ĠScroll State ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠModify Ġelement Ġto Ġallow Ġto Ġscroll Ġvert ically Ġwhen Ġheight Ġof Ġthe Ġcontent Ġis Ġbigger Ġthan Ġmax Ċ Ġ* Ġconstraints Ġallow . Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Vertical Scroll Example Ċ Ġ* Ċ Ġ* ĠIn Ġorder Ġto Ġuse Ġthis Ġmodifier , Ġyou Ġneed Ġto Ġcreate Ġand Ġown Ġ[ Scroll State ] Ċ Ġ* Ġ@ see Ġ[ remember Scroll State ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġstate Ġstate Ġof Ġthe Ġscroll Ċ Ġ* Ġ@ param Ġenabled Ġwhether Ġor Ġnot Ġscrolling Ġvia Ġtouch Ġinput Ġis Ġenabled Ċ Ġ* Ġ@ param Ġfl ing Behavior Ġlogic Ġdescribing Ġfl ing Ġbehavior Ġwhen Ġdrag Ġhas Ġfinished Ġwith Ġvelocity . ĠIf Ċ Ġ* Ġ` null `, Ġdefault Ġfrom Ġ[ Scroll able Defaults . fl ing Behavior ] Ġwill Ġbe Ġused . Ċ Ġ* Ġ@ param Ġreverse Scrolling Ġreverse Ġthe Ġdirection Ġof Ġscrolling , Ġwhen Ġ` true `, Ġ 0 Ġ[ Scroll State . value ] Ċ Ġ* Ġwill Ġmean Ġbottom , Ġwhen Ġ` false `, Ġ 0 Ġ[ Scroll State . value ] Ġwill Ġmean Ġtop Ċ Ġ*/ Ċ fun ĠModifier . vertical Scroll ( ĊĠĠĠ Ġstate : ĠScroll State , ĊĠĠĠ Ġenabled : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġfl ing Behavior : ĠF ling Behavior ? Ġ= Ġnull , ĊĠĠĠ Ġreverse Scrolling : ĠBoolean Ġ= Ġfalse Ċ ) Ġ= Ġscroll ( ĊĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠ Ġis Scroll able Ġ= Ġenabled , ĊĠĠĠ Ġreverse Scrolling Ġ= Ġreverse Scrolling , ĊĠĠĠ Ġfl ing Behavior Ġ= Ġfl ing Behavior , ĊĠĠĠ Ġis Vertical Ġ= Ġtrue Ċ ) Ċ Ċ /** Ċ Ġ* ĠModify Ġelement Ġto Ġallow Ġto Ġscroll Ġh orizontally Ġwhen Ġwidth Ġof Ġthe Ġcontent Ġis Ġbigger Ġthan Ġmax Ċ Ġ* Ġconstraints Ġallow . Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . compose . foundation . samples . Horizontal Scroll Sample Ċ Ġ* Ċ Ġ* ĠIn Ġorder Ġto Ġuse Ġthis Ġmodifier , Ġyou Ġneed Ġto Ġcreate Ġand Ġown Ġ[ Scroll State ] Ċ Ġ* Ġ@ see Ġ[ remember Scroll State ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġstate Ġstate Ġof Ġthe Ġscroll Ċ Ġ* Ġ@ param Ġenabled Ġwhether Ġor Ġnot Ġscrolling Ġvia Ġtouch Ġinput Ġis Ġenabled Ċ Ġ* Ġ@ param Ġfl ing Behavior Ġlogic Ġdescribing Ġfl ing Ġbehavior Ġwhen Ġdrag Ġhas Ġfinished Ġwith Ġvelocity . ĠIf Ċ Ġ* Ġ` null `, Ġdefault Ġfrom Ġ[ Scroll able Defaults . fl ing Behavior ] Ġwill Ġbe Ġused . Ċ Ġ* Ġ@ param Ġreverse Scrolling Ġreverse Ġthe Ġdirection Ġof Ġscrolling , Ġwhen Ġ` true `, Ġ 0 Ġ[ Scroll State . value ] Ċ Ġ* Ġwill Ġmean Ġright , Ġwhen Ġ` false `, Ġ 0 Ġ[ Scroll State . value ] Ġwill Ġmean Ġleft Ċ Ġ*/ Ċ fun ĠModifier . horizontal Scroll ( ĊĠĠĠ Ġstate : ĠScroll State , ĊĠĠĠ Ġenabled : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġfl ing Behavior : ĠF ling Behavior ? Ġ= Ġnull , ĊĠĠĠ Ġreverse Scrolling : ĠBoolean Ġ= Ġfalse Ċ ) Ġ= Ġscroll ( ĊĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠ Ġis Scroll able Ġ= Ġenabled , ĊĠĠĠ Ġreverse Scrolling Ġ= Ġreverse Scrolling , ĊĠĠĠ Ġfl ing Behavior Ġ= Ġfl ing Behavior , ĊĠĠĠ Ġis Vertical Ġ= Ġfalse Ċ ) Ċ Ċ private Ġfun ĠModifier . scroll ( ĊĠĠĠ Ġstate : ĠScroll State , ĊĠĠĠ Ġreverse Scrolling : ĠBoolean , ĊĠĠĠ Ġfl ing Behavior : ĠF ling Behavior ?, ĊĠĠĠ Ġis Scroll able : ĠBoolean , ĊĠĠĠ Ġis Vertical : ĠBoolean Ċ ) Ġ= Ġcomposed ( ĊĠĠĠ Ġfactory Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġover Scroll Controller Ġ= Ġremember Over Scroll Controller () ĊĠĠĠĠĠĠĠ Ġval Ġcoroutine Scope Ġ= Ġremember Coroutine Scope () ĊĠĠĠĠĠĠĠ Ġval Ġis R tl Ġ= ĠLocal Layout Direction . current Ġ== ĠLayout Direction . R tl ĊĠĠĠĠĠĠĠ Ġ// ĠAdd ĠRTL Ġto Ġthe Ġmix : Ġif Ġhorizontal Ġand ĠRTL , Ġreverse Ġreverse Scrolling ĊĠĠĠĠĠĠĠ Ġval Ġresolved Reverse Scrolling Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Vertical Ġ&& Ġis R tl ) Ġ! reverse Scrolling Ġelse Ġreverse Scrolling ĊĠĠĠĠĠĠĠ Ġval Ġsemantics Ġ= ĠModifier . semantics Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Scroll able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccessibility Scroll State Ġ= ĠScroll Axis Range ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ{ Ġstate . value . toFloat () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxValue Ġ= Ġ{ Ġstate . max Value . toFloat () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreverse Scrolling Ġ= Ġresolved Reverse Scrolling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Vertical ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . vertical Scroll Axis Range Ġ= Ġaccessibility Scroll State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . horizontal Scroll Axis Range Ġ= Ġaccessibility Scroll State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġb / 1 5 6 3 8 9 2 8 7 Ġis Ġfixed , Ġthis Ġshould Ġbe Ġproper Ġscroll To Ġwith Ġreverse Ġhandling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll By ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ Ġx : ĠFloat , Ġy : ĠFloat Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Vertical ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( state Ġas ĠScroll able State ). animate Scroll By ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( state Ġas ĠScroll able State ). animate Scroll By ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ scroll By Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġscrolling Ġ= ĠModifier . scroll able ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= Ġif Ġ( is Vertical ) ĠOrientation . Vertical Ġelse ĠOrientation . Horizontal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreverse Ġscroll Ġto Ġhave Ġa Ġ" natural " Ġgesture Ġthat Ġgoes Ġreversed Ġto Ġlayout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreverse Direction Ġ= Ġ! resolved Reverse Scrolling , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Ġ= Ġis Scroll able , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinteraction Source Ġ= Ġstate . internal Interaction Source , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl ing Behavior Ġ= Ġfl ing Behavior , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġover Scroll Controller Ġ= Ġover Scroll Controller ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScroll ing Layout Modifier ( state , Ġreverse Scrolling , Ġis Vertical , Ġover Scroll Controller ) ĊĠĠĠĠĠĠĠ Ġsemantics . clip Scroll able Container ( is Vertical ). then ( scroll ing ). then ( layout ) ĊĠĠĠ Ġ}, ĊĠĠĠ Ġinspector Info Ġ= Ġdebug Inspector Info Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" scroll " ĊĠĠĠĠĠĠĠ Ġproperties [" state "] Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġproperties [" reverse Scrolling "] Ġ= Ġreverse Scrolling ĊĠĠĠĠĠĠĠ Ġproperties [" fl ing Behavior "] Ġ= Ġfl ing Behavior ĊĠĠĠĠĠĠĠ Ġproperties [" is Scroll able "] Ġ= Ġis Scroll able ĊĠĠĠĠĠĠĠ Ġproperties [" is Vertical "] Ġ= Ġis Vertical ĊĠĠĠ Ġ} Ċ ) Ċ Ċ private Ġdata Ġclass ĠScroll ing Layout Modifier ( ĊĠĠĠ Ġval Ġsc roller State : ĠScroll State , ĊĠĠĠ Ġval Ġis Re versed : ĠBoolean , ĊĠĠĠ Ġval Ġis Vertical : ĠBoolean , ĊĠĠĠ Ġval Ġover Scroll Controller : ĠOver Scroll Controller Ċ ) Ġ: ĠLayout Modifier Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠMeasure Scope . measure ( ĊĠĠĠĠĠĠĠ Ġmeas ur able : ĠMe as ur able , ĊĠĠĠĠĠĠĠ Ġconstraints : ĠConstraints ĊĠĠĠ Ġ): ĠMeasure Result Ġ{ ĊĠĠĠĠĠĠĠ Ġconstraints . assertNot N esting Scroll able Containers ( is Vertical ) ĊĠĠĠĠĠĠĠ Ġval Ġchild Constraints Ġ= Ġconstraints . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmaxHeight Ġ= Ġif Ġ( is Vertical ) ĠConstraints . Infinity Ġelse Ġconstraints . max Height , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmaxWidth Ġ= Ġif Ġ( is Vertical ) Ġconstraints . maxWidth Ġelse ĠConstraints . Infinity ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġplace able Ġ= Ġmeas ur able . measure ( child Constraints ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġplace able . width . coerce At Most ( constraints . maxWidth ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġplace able . height . coerce At Most ( constraints . max Height ) ĊĠĠĠĠĠĠĠ Ġval Ġscroll Height Ġ= Ġplace able . height Ġ- Ġheight ĊĠĠĠĠĠĠĠ Ġval Ġscroll Width Ġ= Ġplace able . width Ġ- Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġside Ġ= Ġif Ġ( is Vertical ) Ġscroll Height Ġelse Ġscroll Width ĊĠĠĠĠĠĠĠ Ġover Scroll Controller ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. refresh Container Info ( Size ( width . toFloat (), Ġheight . toFloat ()), Ġside Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlayout ( width , Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsc roller State . max Value Ġ= Ġside ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll Ġ= Ġsc roller State . value . coerce In ( 0 , Ġside ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġabs Scroll Ġ= Ġif Ġ( is Re versed ) Ġscroll Ġ- Ġside Ġelse Ġ- scroll ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Offset Ġ= Ġif Ġ( is Vertical ) Ġ 0 Ġelse Ġabs Scroll ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Offset Ġ= Ġif Ġ( is Vertical ) Ġabs Scroll Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplace able . place Relative With Layer ( x Offset , Ġy Offset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠIntr insic Measure Scope . min Intr insic Width ( ĊĠĠĠĠĠĠĠ Ġmeas ur able : ĠIntr insic Meas ur able , ĊĠĠĠĠĠĠĠ Ġheight : ĠInt ĊĠĠĠ Ġ) Ġ= Ġmeas ur able . min Intr insic Width ( height ) ĊĊĠĠĠ Ġoverride Ġfun ĠIntr insic Measure Scope . min Intr insic Height ( ĊĠĠĠĠĠĠĠ Ġmeas ur able : ĠIntr insic Meas ur able , ĊĠĠĠĠĠĠĠ Ġwidth : ĠInt ĊĠĠĠ Ġ) Ġ= Ġmeas ur able . min Intr insic Height ( width ) ĊĊĠĠĠ Ġoverride Ġfun ĠIntr insic Measure Scope . max Intr insic Width ( ĊĠĠĠĠĠĠĠ Ġmeas ur able : ĠIntr insic Meas ur able , ĊĠĠĠĠĠĠĠ Ġheight : ĠInt ĊĠĠĠ Ġ) Ġ= Ġmeas ur able . max Intr insic Width ( height ) ĊĊĠĠĠ Ġoverride Ġfun ĠIntr insic Measure Scope . max Intr insic Height ( ĊĠĠĠĠĠĠĠ Ġmeas ur able : ĠIntr insic Meas ur able , ĊĠĠĠĠĠĠĠ Ġwidth : ĠInt ĊĠĠĠ Ġ) Ġ= Ġmeas ur able . max Intr insic Height ( width ) Ċ } Ċ Ċ internal Ġfun ĠConstraints . assertNot N esting Scroll able Containers ( is Vertical : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif Ġ( is Vertical ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( max Height Ġ!= ĠConstraints . Infinity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" N esting Ġscroll able Ġin Ġthe Ġsame Ġdirection Ġlayouts Ġlike ĠLazy Column Ġand ĠColumn ( Modifier " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ". vertical Scroll ()) Ġis Ġnot Ġallowed . ĠIf Ġyou Ġwant Ġto Ġadd Ġa Ġheader Ġbefore Ġthe Ġlist Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" of Ġitems Ġplease Ġtake Ġa Ġlook Ġon ĠLazy Column Ġcomponent Ġwhich Ġhas Ġa ĠDSL Ġapi Ġwhich " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġallows Ġto Ġfirst Ġadd Ġa Ġheader Ġvia Ġitem () Ġfunction Ġand Ġthen Ġthe Ġlist Ġof Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" items Ġvia Ġitems (). " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( maxWidth Ġ!= ĠConstraints . Infinity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" N esting Ġscroll able Ġin Ġthe Ġsame Ġdirection Ġlayouts Ġlike ĠLazy Row Ġand ĠRow ( Modifier " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ". horizontal Scroll () Ġis Ġnot Ġallowed . ĠIf Ġyou Ġwant Ġto Ġadd Ġa Ġheader Ġbefore Ġthe Ġlist Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" of Ġitems Ġplease Ġtake Ġa Ġlook Ġon ĠLazy Row Ġcomponent Ġwhich Ġhas Ġa ĠDSL Ġapi Ġwhich Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" allows Ġto Ġfirst Ġadd Ġa Ġfixed Ġelement Ġvia Ġitem () Ġfunction Ġand Ġthen Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" list Ġof Ġitems Ġvia Ġitems (). " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠIn Ġthe Ġscroll able Ġcontainers Ġwe Ġwant Ġto Ġclip Ġthe Ġmain Ġaxis Ġsides Ġin Ġorder Ġto Ġnot Ġdisplay Ġthe Ċ Ġ* Ġcontent Ġwhich Ġis Ġsc rolled Ġout . ĠBut Ġonce Ġwe Ġapply Ġclip To Bounds () Ġmodifier Ġon Ġsuch Ġcontainers Ġit Ċ Ġ* Ġcauses Ġunexpected Ġbehavior Ġas Ġwe Ġalso Ġclip Ġthe Ġcontent Ġon Ġthe Ġcross Ġaxis Ġsides . ĠIt Ġis Ċ Ġ* Ġunexpected Ġas ĠCompose Ġcomponents Ġare Ġnot Ġclipping Ġby Ġdefault . ĠThe Ġmost Ġcommon Ġcase Ġhow Ġit Ċ Ġ* Ġcould Ġbe Ġrepro duced Ġis Ġa Ġh orizontally Ġscrolling Ġlist Ġof ĠC ards . ĠC ards Ġhave Ġthe Ġelevation Ġby Ċ Ġ* Ġdefault Ġand Ġsuch ĠC ards Ġwill Ġbe Ġdrawn Ġwith Ġcli pped Ġshadow s Ġon Ġtop Ġand Ġbottom . ĠThis Ġwas Ġharder Ċ Ġ* Ġto Ġreproduce Ġin Ġthe ĠViews Ġsystem Ġas Ġusually Ġscrolling Ġcontainers Ġlike ĠRecyclerView Ġdidn 't Ġhave Ċ Ġ* Ġan Ġopaque Ġbackground Ġwhich Ġmeans Ġthe Ġri pple Ġwas Ġdrawn Ġon Ġthe Ġsurface Ġon Ġthe Ġfirst Ġparent Ġwith Ċ Ġ* Ġbackground . ĠIn ĠCompose Ġas Ġwe Ġdon 't Ġclip Ġby Ġdefault Ġwe Ġdraw Ġshadow s Ġright Ġin Ġplace . Ċ Ġ* ĠWe Ġf aced Ġsimilar Ġissue Ġin ĠCompose Ġalready Ġwith ĠAndroid s ĠPop ups Ġand ĠDialog s Ġwhere Ġwe Ġdecided Ġto Ċ Ġ* Ġjust Ġpre define Ġsome Ġconstant Ġwith Ġa Ġmaximum Ġelevation Ġsize Ġwe Ġare Ġnot Ġgoing Ġto Ġclip . ĠWe Ġare Ċ Ġ* Ġgoing Ġto Ġreuse Ġthis Ġtechnique Ġhere . ĠThis Ġwill Ġimprove Ġhow Ġit Ġworks Ġin Ġmost Ġcommon Ġcases . ĠIf Ġthe Ċ Ġ* Ġuser Ġwill Ġneed Ġto Ġhave Ġa Ġlarger Ġun cli pped Ġarea Ġfor Ġsome Ġreason Ġthey Ġcan Ġalways Ġadd Ġthe Ġneeded Ċ Ġ* Ġpadding Ġinside Ġthe Ġscroll able Ġarea . Ċ Ġ*/ Ċ internal Ġfun ĠModifier . clip Scroll able Container ( is Vertical : ĠBoolean ) Ġ= ĊĠĠĠ Ġthen ( if Ġ( is Vertical ) ĠVertical Scroll able Clip Modifier Ġelse ĠHorizontal Scroll able Clip Modifier ) Ċ Ċ private Ġval ĠMax Supported Elevation Ġ= Ġ 3 0 . dp Ċ Ċ private Ġval ĠHorizontal Scroll able Clip Modifier Ġ= ĠModifier . clip ( object Ġ: ĠShape Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate Outline ( ĊĠĠĠĠĠĠĠ Ġsize : ĠSize , ĊĠĠĠĠĠĠĠ Ġlayout Direction : ĠLayout Direction , ĊĠĠĠĠĠĠĠ Ġdensity : ĠD ensity ĊĠĠĠ Ġ): ĠOut line Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinf late Size Ġ= Ġwith ( density ) Ġ{ ĠMax Supported Elevation . round To Px (). toFloat () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠOut line . Rectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġ- inflate Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġsize . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġsize . height Ġ+ Ġinf late Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }) Ċ Ċ private Ġval ĠVertical Scroll able Clip Modifier Ġ= ĠModifier . clip ( object Ġ: ĠShape Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate Outline ( ĊĠĠĠĠĠĠĠ Ġsize : ĠSize , ĊĠĠĠĠĠĠĠ Ġlayout Direction : ĠLayout Direction , ĊĠĠĠĠĠĠĠ Ġdensity : ĠD ensity ĊĠĠĠ Ġ): ĠOut line Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinf late Size Ġ= Ġwith ( density ) Ġ{ ĠMax Supported Elevation . round To Px (). toFloat () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠOut line . Rectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġ- inflate Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġsize . width Ġ+ Ġinf late Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġsize . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }) Ċ