/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 Ġ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 . we ar . compose . material Ċ Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . layout . Arrange ment Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . Row Ċ import Ġandroidx . compose . foundation . layout . Spacer Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . layout . size Ċ import Ġandroidx . compose . foundation . layout . width Ċ import Ġandroidx . compose . foundation . shape . Circle Shape Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . alpha Ċ import Ġandroidx . compose . ui . draw . clip Ċ import Ġandroidx . compose . ui . draw . scale Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . Shape Ċ import Ġandroidx . compose . ui . graphics . lerp Ċ import Ġandroidx . compose . ui . unit . Dp Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . we ar . compose . foundation . Cur ved Direction Ċ import Ġandroidx . we ar . compose . foundation . Cur ved Layout Ċ import Ġandroidx . we ar . compose . foundation . cur ved Composable Ċ import Ġandroidx . we ar . compose . material . Page Indicator Defaults . Max NumberOf Indicators Ċ import Ġjava . lang . Integer . min Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠA Ġhorizontal Ġindicator Ġfor Ġa ĠP ager , Ġrepresenting Ċ Ġ* Ġthe Ġcurrently Ġactive Ġpage Ġand Ġtotal Ġpages Ġdrawn Ġusing Ġa Ġ[ Shape ]. ĠIt Ġshows Ġup Ġto Ġ 6 Ġpages Ċ Ġ* Ġon Ġthe Ġscreen Ġand Ġdoesn 't Ġrepresent Ġthe Ġexact Ġpage Ġindex Ġif Ġthere Ġare Ġmore Ġthan Ġ 6 Ġpages . Ċ Ġ* ĠInstead Ġof Ġshowing Ġthe Ġexact Ġposition , Ġ[ Horizontal Page Indicator ] Ġshows Ġa Ġhalf - size Ġindicator Ċ Ġ* Ġon Ġthe Ġleft Ġor Ġon Ġthe Ġright Ġif Ġthere Ġare Ġmore Ġpages . Ċ Ġ* Ċ Ġ* ĠHere 's Ġhow Ġdifferent Ġpositions Ġ 0 .. 1 0 Ġmight Ġbe Ġvis ually Ġrepresented : Ċ Ġ* Ġ" X " Ġis Ġselected Ġitem , Ġ" O " Ġand Ġ" o " Ġfull Ġand Ġhalf Ġsize Ġitems Ġrespectively . Ċ Ġ* Ċ Ġ* ĠO ĠX ĠO ĠO ĠO Ġo Ġ- Ġ 2 nd Ġposition Ġout Ġof Ġ 1 0 . ĠThere Ġare Ġno Ġmore Ġitems Ġon Ġthe Ġleft Ġbut Ġmore Ġon Ġthe Ġright Ċ Ġ* Ġo ĠO ĠO ĠO ĠX Ġo Ġ- Ġmight Ġbe Ġ 6 , Ġ 7 Ġor Ġ 8 Ġout Ġof Ġ 1 0 , Ġas Ġthere Ġare Ġmore Ġpossible Ġitems Ċ Ġ* Ġon Ġthe Ġleft Ġand Ġon Ġthe Ġright Ċ Ġ* Ġo ĠO ĠO ĠO ĠX ĠO Ġ- Ġis Ġ 9 Ġout Ġof Ġ 1 0 , Ġas Ġthere 're Ġno Ġmore Ġitems Ġon Ġthe Ġright Ċ Ġ* Ċ Ġ* Ġ[ Horizontal Page Indicator ] Ġmay Ġbe Ġlinear Ġor Ġcur ved , Ġdepending Ġon Ġ[ indicator Style ]. ĠBy Ġdefault Ċ Ġ* Ġit Ġdepends Ġon Ġthe Ġscreen Ġshape Ġof Ġthe Ġdevice Ġ- Ġfor Ġcircular Ġscreens Ġit Ġwill Ġbe Ġcur ved , Ċ Ġ* Ġwh il st Ġfor Ġsquare Ġscreens Ġit Ġwill Ġbe Ġlinear . Ċ Ġ* Ċ Ġ* ĠThis Ġcomponent Ġalso Ġallows Ġcustom ising Ġthe Ġ[ indicator Shape ], Ġwhich Ġdefines Ġhow Ġthe Ċ Ġ* Ġindicator Ġis Ġvis ually Ġrepresented . Ċ Ġ* Ċ Ġ* Ġ@ sample Ġandroidx . we ar . compose . material . samples . Horizontal Page Indicator Sample Ċ Ġ* Ċ Ġ* Ġ@ param Ġpage Indicator State ĠThe Ġstate Ġobject Ġof Ġa Ġ[ Horizontal Page Indicator ] Ġto Ġbe Ġused Ġto Ċ Ġ* Ġobserve Ġthe ĠP ager 's Ġstate . Ċ Ġ* Ġ@ param Ġmodifier ĠModifier Ġto Ġbe Ġapplied Ġto Ġthe Ġ[ Horizontal Page Indicator ] Ċ Ġ* Ġ@ param Ġindicator Style ĠThe Ġstyle Ġof Ġ[ Horizontal Page Indicator ] Ġ- Ġmay Ġbe Ġlinear Ġor Ġcur ved . Ċ Ġ* ĠBy Ġdefault Ġdetermined Ġby Ġthe Ġscreen Ġshape . Ċ Ġ* Ġ@ param Ġselected Color ĠThe Ġcolor Ġof Ġthe Ġselected Ġ[ Horizontal Page Indicator ] Ġitem Ċ Ġ* Ġ@ param Ġun selected Color ĠThe Ġcolor Ġof Ġun selected Ġ[ Horizontal Page Indicator ] Ġitems . Ċ Ġ* ĠDefaults Ġto Ġ[ selected Color ] Ġwith Ġ 3 0 % Ġalpha Ċ Ġ* Ġ@ param Ġindicator Size ĠThe Ġsize Ġof Ġeach Ġ[ Horizontal Page Indicator ] Ġitem Ġin Ġ[ Dp ] Ċ Ġ* Ġ@ param Ġspacing ĠThe Ġspacing Ġbetween Ġindicator Ġitems Ġin Ġ[ Dp ] Ċ Ġ* Ġ@ param Ġindicator Shape ĠThe Ġshape Ġof Ġeach Ġ[ Horizontal Page Indicator ] Ġitem . Ċ Ġ* ĠDefaults Ġto Ġ[ Circle Shape ] Ċ Ġ**/ Ċ @ Composable Ċ public Ġfun ĠHorizontal Page Indicator ( ĊĠĠĠ Ġpage Indicator State : ĠPage Indicator State , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġindicator Style : ĠPage Indicator Style Ġ= ĠPage Indicator Defaults . style (), ĊĠĠĠ Ġselected Color : ĠColor Ġ= ĠMaterial Theme . colors . on Background , ĊĠĠĠ Ġun selected Color : ĠColor Ġ= Ġselected Color . copy ( alpha Ġ= Ġ 0 . 3 f ), ĊĠĠĠ Ġindicator Size : ĠD p Ġ= Ġ 6 . dp , ĊĠĠĠ Ġspacing : ĠD p Ġ= Ġ 4 . dp , ĊĠĠĠ Ġindicator Shape : ĠShape Ġ= ĠCircle Shape Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠWe Ġwant Ġto Ġbring Ġoffset Ġto Ġ 0 .. 1 Ġrange . ĊĠĠĠ Ġ// ĠHowever , Ġit Ġcan Ġcome Ġin Ġany Ġrange . ĠIt Ġmight Ġbe Ġfor Ġexample Ġselected Page Ġ= Ġ 1 , Ġwith Ġoffset Ġ 2 . 5 ĊĠĠĠ Ġ// ĠWe Ġcan 't Ġwork Ġwith Ġthese Ġoffsets , Ġthus Ġshould Ġnormalize Ġthem Ġso Ġthat Ġoffset Ġwill Ġbe ĊĠĠĠ Ġ// Ġin Ġ 0 .. 1 Ġrange . ĠFor Ġexample Ġselected Page Ġ= Ġ 3 , Ġoffset Ġ= Ġ- 1 . 5 Ġ-> Ġcould Ġtransform Ġit ĊĠĠĠ Ġ// Ġto Ġselected Page Ġ= Ġ 1 , Ġoffset Ġ= Ġ 0 . 5 ĊĠĠĠ Ġ// ĠOther Ġexample : Ġselected Page Ġ= Ġ 1 , Ġoffset Ġ= Ġ 2 . 5 Ġ-> Ġselected Page Ġ= Ġ 3 , Ġoffset Ġ= Ġ 0 . 5 ĊĠĠĠ Ġval Ġnormalized Selected Page : ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġ( page Indicator State . selected Page Ġ+ Ġpage Indicator State . page Offset ). toInt () ĊĠĠĠ Ġval Ġnormalized Offset Ġ= ĊĠĠĠĠĠĠĠ Ġpage Indicator State . selected Page Ġ+ Ġpage Indicator State . page Offset Ġ- Ġnormalized Selected Page ĊĊĠĠĠ Ġval Ġhorizontal Padding Ġ= Ġspacing Ġ/ Ġ 2 ĊĠĠĠ Ġval Ġsp acer Default Size Ġ= Ġ( indicator Size Ġ+ Ġspacing ). value ĊĊĠĠĠ Ġval Ġpages On Screen Ġ= Ġmin ( Max NumberOf Indicators , Ġpage Indicator State . page Count ) ĊĠĠĠ Ġval Ġpages State Ġ= Ġremember ( page Indicator State . page Count ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPages State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pages Ġ= Ġpage Indicator State . page Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpages On Screen Ġ= Ġpages On Screen ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġpages State . re calculate State ( normalized Selected Page , Ġnormalized Offset ) ĊĊĠĠĠ Ġval Ġindicator Factory : Ġ@ Composable Ġ( Int ) Ġ-> ĠUnit Ġ= Ġ{ Ġpage Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠAn Ġexternal Ġbox Ġwith Ġa Ġfixed Ġindicator Size Ġ- Ġlet Ġus Ġremain Ġthe Ġsame Ġsize Ġfor ĊĠĠĠĠĠĠĠ Ġ// Ġan Ġindicator Ġeven Ġif Ġit 's Ġshrink ed Ġfor Ġsmooth Ġanimations ĊĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( horizontal Ġ= Ġhorizontal Padding ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. size ( indicator Size ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. align ( Alignment . Center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. scale ( pages State . size Ratio ( page )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. clip ( indicator Shape ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. alpha ( pages State . alpha ( page )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInterpol ation Ġbetween Ġun selected Ġand Ġselected Ġcolors Ġdepending ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġselected Page Ratio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl erp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun selected Color , Ġselected Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpages State . calculate Selected Ratio ( page , Ġnormalized Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsp acer Left Ġ= Ġ@ Composable Ġ{ ĊĠĠĠĠĠĠĠ ĠSp acer ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . width (( pages State . left Spacer Size Ratio Ġ* Ġsp acer Default Size ). dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( indicator Size ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġsp acer Right Ġ= Ġ@ Composable Ġ{ ĊĠĠĠĠĠĠĠ ĠSp acer ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . width (( pages State . right Spacer Size Ratio Ġ* Ġsp acer Default Size ). dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( indicator Size ) ĊĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhen Ġ( indicator Style ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPage Indicator Style . Linear Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinear Page Indicator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpages On Screen Ġ= Ġpages On Screen , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Factory Ġ= Ġindicator Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp acer Left Ġ= Ġsp acer Left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp acer Right Ġ= Ġsp acer Right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠPage Indicator Style . Cur ved Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCur ved Page Indicator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpages On Screen Ġ= Ġpages On Screen , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Factory Ġ= Ġindicator Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp acer Left Ġ= Ġsp acer Left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsp acer Right Ġ= Ġsp acer Right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġstyle Ġof Ġ[ Horizontal Page Indicator ]. ĠMay Ġbe ĠCur ved Ġor ĠLinear Ċ Ġ*/ Ċ @ kotlin . jvm . Jvm Inline Ċ public Ġvalue Ġclass ĠPage Indicator Style Ġinternal Ġconstructor ( internal Ġval Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCur ved Ġstyle Ġof Ġ[ Horizontal Page Indicator ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġval ĠCur ved Ġ= ĠPage Indicator Style ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLinear Ġstyle Ġof Ġ[ Horizontal Page Indicator ] ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġval ĠLinear Ġ= ĠPage Indicator Style ( 1 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠContains Ġthe Ġdefault Ġvalues Ġused Ġby Ġ[ Horizontal Page Indicator ] Ċ Ġ*/ Ċ public Ġobject ĠPage Indicator Defaults Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault Ġstyle Ġof Ġ[ Horizontal Page Indicator ]. ĠDep ending Ġon Ġshape Ġof Ġdevice , Ġit Ġreturns Ġeither ĠCur ved ĊĠĠĠĠ Ġ* Ġor ĠLinear Ġstyle . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Composable ĊĠĠĠ Ġpublic Ġfun Ġstyle (): ĠPage Indicator Style Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( is Round Device ()) ĠPage Indicator Style . Cur ved ĊĠĠĠĠĠĠĠ Ġelse ĠPage Indicator Style . Linear ĊĊĠĠĠ Ġinternal Ġval ĠMax NumberOf Indicators Ġ= Ġ 6 Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġinterface Ġfor Ġconnection Ġbetween ĠP ager Ġand Ġ[ Horizontal Page Indicator ]. Ċ Ġ*/ Ċ public Ġinterface ĠPage Indicator State Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrent Ġoffset Ġfrom Ġthe Ġstart Ġof Ġ[ selected Page ], Ġas Ġa Ġratio Ġof Ġthe Ġpage Ġwidth . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠChanges Ġwhen Ġa Ġscroll Ġ( drag , Ġswipe Ġor Ġfl ing ) Ġbetween Ġpages Ġhappens Ġin ĠP ager . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġpage Offset : ĠFloat ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcurrently Ġselected Ġpage Ġindex ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġselected Page : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTotal Ġnumber Ġof Ġpages ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġpage Count : ĠInt Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠLinear Page Indicator ( ĊĠĠĠ Ġmodifier : ĠModifier , ĊĠĠĠ Ġpages On Screen : ĠInt , ĊĠĠĠ Ġindicator Factory : Ġ@ Composable Ġ( Int ) Ġ-> ĠUnit , ĊĠĠĠ Ġsp acer Left : Ġ@ Composable Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġsp acer Right : Ġ@ Composable Ġ() Ġ-> ĠUnit Ċ Ċ ) Ġ{ ĊĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier . fill MaxSize (), ĊĠĠĠĠĠĠĠ Ġhorizontal Arrange ment Ġ= ĠArrange ment . Center , ĊĠĠĠĠĠĠĠ Ġvertical Alignment Ġ= ĠAlignment . Bottom ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdrawing Ġ 1 Ġextra Ġsp acer Ġfor Ġtransition ĊĠĠĠĠĠĠĠ Ġsp acer Left () ĊĠĠĠĠĠĠĠ Ġfor Ġ( page Ġin Ġ 0 .. pages On Screen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Factory ( page ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsp acer Right () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠCur ved Page Indicator ( ĊĠĠĠ Ġmodifier : ĠModifier , ĊĠĠĠ Ġpages On Screen : ĠInt , ĊĠĠĠ Ġindicator Factory : Ġ@ Composable Ġ( Int ) Ġ-> ĠUnit , ĊĠĠĠ Ġsp acer Left : Ġ@ Composable Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġsp acer Right : Ġ@ Composable Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠCur ved Layout ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠ Ġ// Ġ 9 0 Ġdegrees Ġequals Ġto Ġ 6 Ġo ' clock Ġposition , Ġat Ġthe Ġbottom Ġof Ġthe Ġscreen ĊĠĠĠĠĠĠĠ Ġanchor Ġ= Ġ 9 0 f , ĊĠĠĠĠĠĠĠ Ġ// ĠSince ĠSw ipe Ġto Ġdismiss Ġis Ġalways ĠL t R , Ġwe Ġwant Ġto Ġfollow Ġthe Ġsame Ġdirection Ġwhen ĊĠĠĠĠĠĠĠ Ġ// Ġnavig ating Ġamong st Ġpages , Ġso Ġthe Ġfirst Ġpage Ġis Ġalways Ġon Ġthe Ġleft . ĊĠĠĠĠĠĠĠ Ġangular Direction Ġ= ĠCur ved Direction . Angular . Counter Clock wise ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdrawing Ġ 1 Ġextra Ġsp acer Ġfor Ġtransition ĊĠĠĠĠĠĠĠ Ġcur ved Composable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsp acer Left () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( page Ġin Ġ 0 .. pages On Screen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur ved Composable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator Factory ( page ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcur ved Composable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsp acer Right () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġan Ġinternal Ġstate Ġof Ġpage Indicator Ċ Ġ*/ Ċ internal Ġclass ĠPages State ( ĊĠĠĠ Ġval Ġtotal Pages : ĠInt , ĊĠĠĠ Ġval Ġpages On Screen : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠS izes Ġand Ġal ph as Ġof Ġfirst Ġand Ġlast Ġindicators Ġon Ġthe Ġscreen . ĠUsed Ġto Ġshow Ġthat Ġthere 're Ġmore ĊĠĠĠ Ġ// Ġpages Ġon Ġthe Ġleft Ġor Ġon Ġthe Ġright , Ġand Ġalso Ġfor Ġsmooth Ġtransitions ĊĠĠĠ Ġprivate Ġvar Ġfirst Alpha Ġ= Ġ 1 f ĊĠĠĠ Ġprivate Ġvar Ġlast Alpha Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġfirst Size Ġ= Ġ 1 f ĊĠĠĠ Ġprivate Ġvar Ġsecond Size Ġ= Ġ 1 f ĊĠĠĠ Ġprivate Ġvar Ġlast Size Ġ= Ġ 1 f ĊĠĠĠ Ġprivate Ġvar Ġlast But One Size Ġ= Ġ 1 f ĊĊĠĠĠ Ġprivate Ġvar Ġsmooth Progress Ġ= Ġ 0 f ĊĊĠĠĠ Ġ// ĠAn Ġoffset Ġin Ġpages , Ġbasically Ġmeaning Ġhow Ġmany Ġpages Ġare Ġhidden Ġto Ġthe Ġleft . ĊĠĠĠ Ġprivate Ġvar Ġhidden Pages To The Left Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠA Ġdefault Ġsize Ġof Ġsp ac ers Ġ- Ġinvisible Ġitems Ġto Ġthe Ġleft Ġand Ġto Ġthe Ġright Ġof ĊĠĠĠ Ġ// Ġvisible Ġindicators , Ġused Ġfor Ġsmooth Ġtransitions ĊĊĠĠĠ Ġ// ĠCurrent Ġvisible Ġposition Ġon Ġthe Ġscreen . ĊĠĠĠ Ġprivate Ġvar Ġvisible Dot Index Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠA Ġsize Ġof Ġa Ġleft Ġsp acer Ġused Ġfor Ġsmooth Ġtransitions ĊĠĠĠ Ġval Ġleft Spacer Size Ratio ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 1 Ġ- Ġsmooth Progress ĊĊĠĠĠ Ġ// ĠA Ġsize Ġof Ġa Ġright Ġsp acer Ġused Ġfor Ġsmooth Ġtransitions ĊĠĠĠ Ġval Ġright Spacer Size Ratio ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsmooth Progress ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDep ending Ġon Ġthe Ġpage Ġindex , Ġreturn Ġan Ġalpha Ġfor Ġthis Ġindicator ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpage ĠPage Ġindex ĊĠĠĠĠ Ġ* Ġ@ return ĠAn Ġalpha Ġof Ġpage Ġindex - Ġin Ġrange Ġ 0 .. 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġalpha ( page : ĠInt ): ĠFloat Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġfirst Alpha ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpages On Screen Ġ-> Ġlast Alpha ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDep ending Ġon Ġthe Ġpage Ġindex , Ġreturn Ġa Ġsize Ġratio Ġfor Ġthis Ġindicator ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpage ĠPage Ġindex ĊĠĠĠĠ Ġ* Ġ@ return ĠAn Ġsize Ġratio Ġfor Ġpage Ġindex Ġ- Ġin Ġrange Ġ 0 .. 1 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsize Ratio ( page : ĠInt ): ĠFloat Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġfirst Size ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġsecond Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpages On Screen Ġ- Ġ 1 Ġ-> Ġlast But One Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpages On Screen Ġ-> Ġlast Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġvalue Ġin Ġthe Ġrange Ġ 0 .. 1 Ġwhere Ġ 0 Ġis Ġun selected Ġstate , Ġand Ġ 1 Ġis Ġselected . ĊĠĠĠĠ Ġ* ĠUsed Ġto Ġshow Ġa Ġsmooth Ġtransition Ġbetween Ġpage Ġindicator Ġitems . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcalculate Selected Ratio ( target Page : ĠInt , Ġoffset : ĠFloat ): ĠFloat Ġ= ĊĠĠĠĠĠĠĠ Ġ( 1 Ġ- Ġabs ( visible Dot Index Ġ+ Ġoffset Ġ- Ġtarget Page )). coerce At Least ( 0 f ) ĊĊĠĠĠ Ġ// ĠMain Ġfunction Ġresponsible Ġfor Ġre calculation Ġof Ġall Ġparameters Ġregarding ĊĠĠĠ Ġ// Ġto Ġthe Ġ[ selected Page ] Ġand Ġ[ offset ] ĊĠĠĠ Ġfun Ġre calculate State ( selected Page : ĠInt , Ġoffset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage With Offset Ġ= Ġselected Page Ġ+ Ġoffset ĊĊĠĠĠĠĠĠĠ Ġ// ĠCalcul ating Ġoffset In Pages Ġrel ating Ġto Ġthe Ġ[ selected Page ]. ĊĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġexample , Ġfor Ġ[ selected Page ] Ġ= Ġ 4 Ġwe Ġwill Ġsee Ġthis Ġpicture Ġ: ĊĠĠĠĠĠĠĠ Ġ// ĠO ĠO ĠO ĠO ĠX Ġo . Ġ[ offset In Pages ] Ġwill Ġbe Ġ 0 . ĊĠĠĠĠĠĠĠ Ġ// ĠBut Ġwhen Ġ[ selected Page ] Ġwill Ġbe Ġincrement ed Ġto Ġ 5 , Ġit Ġwill Ġbe Ġseen Ġas ĊĠĠĠĠĠĠĠ Ġ// Ġo ĠO ĠO ĠO ĠX Ġo , Ġwith Ġ[ offset In Pages ] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Page Ġ> Ġhidden Pages To The Left Ġ+ Ġpages On Screen Ġ- Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġan Ġoffset Ġas Ġa Ġdifference Ġbetween Ġcurrent Ġpage Ġand Ġpages Ġon Ġthe Ġscreen , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexcept Ġif Ġthis Ġis Ġnot Ġthe Ġlast Ġpage Ġ- Ġthen Ġoffset In Pages Ġis Ġnot Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhidden Pages To The Left Ġ= Ġ( selected Page Ġ- Ġ( pages On Screen Ġ- Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. coerce At Most ( total Pages Ġ- Ġpages On Screen ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( page With Offset Ġ<= Ġhidden Pages To The Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhidden Pages To The Left Ġ= Ġ( selected Page Ġ- Ġ 1 ). coerce At Least ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCondition Ġfor Ġscrolling Ġto Ġthe Ġright . ĠA Ġsmooth Ġscroll Ġto Ġthe Ġright Ġis Ġonly Ġtriggered ĊĠĠĠĠĠĠĠ Ġ// Ġwhen Ġwe Ġhave Ġmore Ġthan Ġ 2 Ġpages Ġto Ġthe Ġright , Ġand Ġcurrently Ġwe 're Ġon Ġthe Ġright Ġedge . ĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġexample Ġ-> Ġo ĠO ĠO ĠO ĠX Ġo Ġ-> Ġa Ġsmall Ġ" o " Ġshows Ġthat Ġthere 're Ġmore Ġpages Ġto Ġthe Ġright ĊĠĠĠĠĠĠĠ Ġval Ġsc rolled To The Right Ġ= Ġpage With Offset Ġ> Ġhidden Pages To The Left Ġ+ Ġpages On Screen Ġ- Ġ 2 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage With Offset Ġ< Ġtotal Pages Ġ- Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġ// ĠCondition Ġfor Ġscrolling Ġto Ġthe Ġleft . ĠA Ġsmooth Ġscroll Ġto Ġthe Ġleft Ġis Ġonly Ġtriggered ĊĠĠĠĠĠĠĠ Ġ// Ġwhen Ġwe Ġhave Ġmore Ġthan Ġ 2 Ġpages Ġto Ġthe Ġleft , Ġand Ġcurrently Ġwe 're Ġon Ġthe Ġleft Ġedge . ĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġexample Ġ-> Ġo ĠX ĠO ĠO ĠO Ġo Ġ-> Ġa Ġsmall Ġ" o " Ġshows Ġthat Ġthere 're Ġmore Ġpages Ġto Ġthe Ġleft ĊĠĠĠĠĠĠĠ Ġval Ġsc rolled To The Left Ġ= Ġpage With Offset Ġ> Ġ 1 Ġ&& Ġpage With Offset Ġ< Ġhidden Pages To The Left Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġsmooth Progress Ġ= Ġif Ġ( sc rolled To The Left Ġ|| Ġsc rolled To The Right ) Ġoffset Ġelse Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠCalcul ating Ġexact Ġparameters Ġfor Ġborder Ġindicators Ġlike Ġ[ first Alpha ], Ġ[ last Size ], Ġetc . ĊĠĠĠĠĠĠĠ Ġfirst Alpha Ġ= Ġ 1 Ġ- Ġsmooth Progress ĊĠĠĠĠĠĠĠ Ġlast Alpha Ġ= Ġsmooth Progress ĊĠĠĠĠĠĠĠ Ġsecond Size Ġ= Ġ 1 Ġ- Ġ 0 . 5 f Ġ* Ġsmooth Progress ĊĊĠĠĠĠĠĠĠ Ġ// ĠDep ending Ġon Ġoffset In Pages Ġwe 'll Ġeither Ġshow Ġa Ġshrink ed Ġfirst Ġindicator , Ġor Ġfull - size ĊĠĠĠĠĠĠĠ Ġfirst Size Ġ= Ġif Ġ( hidden Pages To The Left Ġ== Ġ 0 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhidden Pages To The Left Ġ== Ġ 1 Ġ&& Ġsc rolled To The Left ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ- Ġsmooth Progress ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 f Ġ* Ġ( 1 Ġ- Ġsmooth Progress ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDep ending Ġon Ġoffset In Pages Ġand Ġother Ġparameters , Ġwe 'll Ġeither Ġshow Ġa Ġshrink ed ĊĠĠĠĠĠĠĠ Ġ// Ġlast Ġindicator , Ġor Ġfull - size ĊĠĠĠĠĠĠĠ Ġlast Size Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hidden Pages To The Left Ġ== Ġtotal Pages Ġ- Ġpages On Screen Ġ- Ġ 1 Ġ&& Ġsc rolled To The Right Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhidden Pages To The Left Ġ== Ġtotal Pages Ġ- Ġpages On Screen Ġ&& Ġsc rolled To The Left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmooth Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 f Ġ* Ġsmooth Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlast But One Size Ġ= Ġif Ġ( sc rolled To The Right Ġ|| Ġsc rolled To The Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 f Ġ* Ġ( 1 Ġ+ Ġsmooth Progress ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( hidden Pages To The Left Ġ< Ġtotal Pages Ġ- Ġpages On Screen ) Ġ 0 . 5 f Ġelse Ġ 1 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠA Ġvisible Dot Ġrepresents Ġa Ġcurrently Ġselected Ġpage Ġon Ġthe Ġscreen ĊĠĠĠĠĠĠĠ Ġ// ĠAs Ġwe Ġscroll Ġto Ġthe Ġleft , Ġwe Ġadd Ġan Ġinvisible Ġindicator Ġto Ġthe Ġleft , Ġsh ifting Ġall Ġother ĊĠĠĠĠĠĠĠ Ġ// Ġindicators Ġto Ġthe Ġright . ĠThe Ġshift Ġis Ġonly Ġpossible Ġwhen Ġa Ġvisible Dot Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġ// Ġthus Ġwe Ġhave Ġto Ġleave Ġit Ġat Ġ 1 Ġas Ġwe Ġalways Ġadd Ġa Ġpositive Ġoffset ĊĠĠĠĠĠĠĠ Ġvisible Dot Index Ġ= Ġif Ġ( sc rolled To The Left ) Ġ 1 ĊĠĠĠĠĠĠĠ Ġelse Ġselected Page Ġ- Ġhidden Pages To The Left ĊĠĠĠ Ġ} Ċ }