/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġ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 . animation . demos . fancy Ċ Ċ import Ġandroidx . compose . animation . core . Repeat Mode Ċ import Ġandroidx . compose . animation . core . animate Float Ċ import Ġandroidx . compose . animation . core . infinite Repeat able Ċ import Ġandroidx . compose . animation . core . remember Infinite Transition Ċ import Ġandroidx . compose . animation . core . t ween Ċ import Ġandroidx . compose . foundation . Canvas Ċ import Ġandroidx . compose . foundation . layout . required Size Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . Path Ċ import Ġandroidx . compose . ui . graphics . lerp Ċ import Ġandroidx . compose . ui . tool ing . preview . Preview Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . min Ċ Ċ @ Preview Ċ @ Composable Ċ fun ĠAnimated Dot s Demo () Ġ{ ĊĠĠĠ Ġval Ġinfinite Transition Ġ= Ġremember Infinite Transition () ĊĠĠĠ Ġval Ġposition Ġby Ġinfinite Transition . animate Float ( ĊĠĠĠĠĠĠĠ Ġinitial Value Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġtarget Value Ġ= Ġtotal Dot Count . toFloat (), ĊĠĠĠĠĠĠĠ Ġanimation Spec Ġ= Ġinfinite Repeat able ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Ġ= Ġt ween ( 2 0 0 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat Mode Ġ= ĠRepeat Mode . Reverse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ ĠD ots ( position ) Ċ } Ċ Ċ private Ġconst Ġval Ġtotal Dot Count Ġ= Ġ 4 Ċ private Ġconst Ġval Ġdot Spacing Ġ= Ġ 6 0 f Ċ private Ġconst Ġval Ġdot Composable Height Ġ= Ġ 2 0 0 f Ċ Ċ @ Composable Ċ private Ġfun ĠD ots ( position : ĠFloat ) Ġ{ ĊĠĠĠ ĠCanvas ( modifier Ġ= ĠModifier . required Size ( 4 0 0 . dp , Ġdot Composable Height . dp )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcenter Y Ġ= Ġdot Composable Height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġfor Ġ( current Dot Position Ġin Ġ 1 .. total Dot Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdot Size Ġ= Ġget Dot Size For Position ( position , Ġcurrent Dot Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Dot Position Ġ< Ġtotal Dot Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDraw Ġa Ġbridge Ġbetween Ġthe Ġcurrent Ġdot Ġand Ġthe Ġnext Ġdot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Dot Position Ġ= Ġcurrent Dot Position Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Dot Size Ġ= Ġget Dot Size For Position ( position , Ġnext Dot Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPick Ġa Ġdirection Ġto Ġdraw Ġbridge Ġfrom Ġthe Ġsmaller Ġdot Ġto Ġthe Ġlarger Ġdot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Flip Ġ= Ġnext Dot Size Ġ> Ġdot Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Position Delta Ġ= Ġ- min ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( position Ġ- Ġif Ġ( should Flip ) Ġnext Dot Position Ġelse Ġcurrent Dot Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġtop - most Ġand Ġthe Ġbottom - most Ġcoordinates Ġof Ġcurrent Ġdot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft X Ġ= Ġ( current Dot Position Ġ* Ġdot Spacing ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Y Top Ġ= Ġ( center Y Ġ- Ġdot Size ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Y Bottom Ġ= Ġ( center Y Ġ+ Ġdot Size ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġtop - most Ġand Ġthe Ġbottom - most Ġcoordinates Ġof Ġnext Ġdot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright X Ġ= Ġ( next Dot Position Ġ* Ġdot Spacing ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Y Top Ġ= Ġ( center Y Ġ- Ġnext Dot Size ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Y Bottom Ġ= Ġ( center Y Ġ+ Ġnext Dot Size ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġmiddle ĠY Ġcoordinate Ġbetween Ġtwo Ġdots ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmid X Ġ= Ġ(( current Dot Position Ġ+ Ġ 0 . 5 ) Ġ* Ġdot Spacing ). dp . to Px () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġif Ġ( should Flip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġcontrol Ġpoint ĠY Ġcoordinates Ġa Ġbit Ġinside Ġthe Ġcurrent Ġdot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe zier Y Top Ġ= Ġ( center Y Ġ- Ġdot Size Ġ- Ġ 5 f Ġ* Ġnext Position Delta ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe zier Y Bottom Ġ= Ġ( center Y Ġ+ Ġdot Size Ġ+ Ġ 5 f Ġ* Ġnext Position Delta ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Bridge Path ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright X , Ġright Y Top , Ġright Y Bottom , Ġleft X , Ġleft Y Top , Ġleft Y Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid X , Ġbe zier Y Top , Ġbe zier Y Bottom , Ġcenter Y . dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġcontrol Ġpoint ĠY Ġcoordinates Ġa Ġbit Ġinside Ġthe Ġnext Ġdot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe zier Y Top Ġ= Ġ( center Y Ġ- Ġnext Dot Size Ġ- Ġ 5 f Ġ* Ġnext Position Delta ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe zier Y Bottom Ġ= Ġ( center Y Ġ+ Ġnext Dot Size Ġ+ Ġ 5 f Ġ* Ġnext Position Delta ). dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Bridge Path ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft X , Ġleft Y Top , Ġleft Y Bottom , Ġright X , Ġright Y Top , Ġright Y Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid X , Ġbe zier Y Top , Ġbe zier Y Bottom , Ġcenter Y . dp . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Path ( path , ĠColor ( 0 xff 8 eb 4 e 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDraw Ġthe Ġcurrent Ġdot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Circle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Dot Color ( position , Ġcurrent Dot Position ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ= Ġdot Size . dp . to Px (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Ġ= ĠOffset (( current Dot Position Ġ* Ġdot Spacing ). dp . to Px (), Ġ 1 0 0 . dp . to Px ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġpath Ġfor Ġa Ġbridge Ġbetween Ġtwo Ġdots Ġdrawn Ġusing Ġtwo Ġquadr atic Ġbe zi ers . Ċ Ġ* Ċ Ġ* ĠFirst Ġbe zier Ġis Ġdrawn Ġbetween Ġ( start X , Ġstart Y Top ) Ġand Ġ( end X , Ġend Y Top ) Ġcoordinates Ġusing Ċ Ġ* Ġ( bezier X , Ġbe zier Y Top ) Ġas Ġcontrol Ġpoint . Ċ Ġ* ĠSecond Ġbe zier Ġis Ġdrawn Ġbetween Ġ( start X , Ġstart Y Bottom ) Ġand Ġ( end X , Ġend Y Bottom ) Ġcoordinates Ġusing Ċ Ġ* Ġ( bezier X , Ġbe zier Y Bottom ) Ġas Ġcontrol Ġpoint . Ċ Ġ* Ċ Ġ* ĠThen Ġadditional Ġlines Ġare Ġdrawn Ġto Ġmake Ġthis Ġa Ġfilled Ġpath . Ċ Ġ*/ Ċ private Ġfun Ġget Bridge Path ( ĊĠĠĠ Ġstart X : ĠFloat , ĊĠĠĠ Ġstart Y Top : ĠFloat , ĊĠĠĠ Ġstart Y Bottom : ĠFloat , ĊĠĠĠ Ġend X : ĠFloat , ĊĠĠĠ Ġend Y Top : ĠFloat , ĊĠĠĠ Ġend Y Bottom : ĠFloat , ĊĠĠĠ Ġbe zier X : ĠFloat , ĊĠĠĠ Ġbe zier Y Top : ĠFloat , ĊĠĠĠ Ġbe zier Y Bottom : ĠFloat , ĊĠĠĠ Ġmid Y : ĠFloat Ċ ): ĠPath Ġ{ ĊĠĠĠ Ġreturn ĠPath (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġmove To ( start X , Ġstart Y Top ) ĊĠĠĠĠĠĠĠ Ġquadr atic Bezier To ( bezier X , Ġbe zier Y Top , Ġend X , Ġend Y Top ) ĊĠĠĠĠĠĠĠ Ġline To ( end X , Ġmid Y ) ĊĠĠĠĠĠĠĠ Ġline To ( start X , Ġmid Y ) ĊĠĠĠĠĠĠĠ Ġmove To ( start X , Ġstart Y Top ) ĊĠĠĠĠĠĠĠ Ġline To ( start X , Ġstart Y Bottom ) ĊĠĠĠĠĠĠĠ Ġquadr atic Bezier To ( bezier X , Ġbe zier Y Bottom , Ġend X , Ġend Y Bottom ) ĊĠĠĠĠĠĠĠ Ġline To ( end X , Ġmid Y ) ĊĠĠĠĠĠĠĠ Ġline To ( start X , Ġmid Y ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġget Dot Color ( position : ĠFloat , Ġdot Index : ĠInt ): ĠColor Ġ{ ĊĠĠĠ Ġval Ġfraction Ġ= Ġmin ( abs ( position Ġ- Ġdot Index ), Ġ 1 f ) ĊĠĠĠ Ġreturn Ġl erp ( Color ( 0 xff 1 a 7 3 e 8 ), ĠColor ( 0 xff 4 6 8 ce 8 ), Ġfraction ) Ċ } Ċ Ċ private Ġfun Ġget Dot Size For Position ( position : ĠFloat , Ġdot Index : ĠInt ): ĠFloat Ġ{ ĊĠĠĠ Ġval Ġposition Delta Ġ= Ġabs ( position Ġ- Ġdot Index ) ĊĠĠĠ Ġreturn Ġif Ġ( position Delta Ġ< Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( 1 0 f Ġ+ Ġ 2 0 Ġ* Ġ( 1 Ġ- Ġposition Delta )) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ 1 0 f ĊĠĠĠ Ġ} Ċ } Ċ