/* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġcom . example . android dev challenge . overview Ċ Ċ import Ġandroid . view . Motion Event Ċ import Ġandroidx . compose . animation . core . animate Float As State Ċ import Ġandroidx . compose . animation . core . t ween Ċ import Ġandroidx . compose . foundation . click able Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . material . Icon Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Surface Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . State Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . geometry . Size Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . Outline Ċ import Ġandroidx . compose . ui . graphics . Path Ċ import Ġandroidx . compose . ui . graphics . Path Operation Ċ import Ġandroidx . compose . ui . graphics . Shape Ċ import Ġandroidx . compose . ui . graphics . graphics Layer Ċ import Ġandroidx . compose . ui . input . pointer . pointer Interop Filter Ċ import Ġandroidx . compose . ui . layout . on Size Changed Ċ import Ġandroidx . compose . ui . platform . Local Density Ċ import Ġandroidx . compose . ui . res . p ainter Resource Ċ import Ġandroidx . compose . ui . res . string Resource Ċ import Ġandroidx . compose . ui . unit . Density Ċ import Ġandroidx . compose . ui . unit . Layout Direction Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġcom . example . android dev challenge . R Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠDesign Ġis Ġinspired Ġwith Ġhttps :// d ribb ble . com / shots / 5 9 6 7 2 5 2 - Tab - Bar - Animation Ċ Ġ* ĠTODO : ĠDo Ġmore Ġgeneric Ġand Ġcustom izable Ċ Ġ*/ Ċ private Ġconst Ġval ĠUN SELECTED _ ALPHA Ġ= Ġ 0 . 5 f Ċ Ċ private Ġval ĠI CONS Ġ= ĠarrayOf ( ĊĠĠĠ ĠR . drawable . ic _ tab _ dog s , ĊĠĠĠ ĠR . drawable . ic _ tab _ cats , Ċ ) Ċ Ċ @ Composable Ċ fun ĠWave Composable ( ĊĠĠĠ Ġitems Count : ĠInt , ĊĠĠĠ Ġcurrent : ĠState < Int >, ĊĠĠĠ ĠonClick : Ġ( Int ) Ġ-> ĠUnit , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier Ċ ) Ġ{ ĊĠĠĠ Ġval Ġwave Width Ġ= Ġwith ( Local Density . current ) Ġ{ Ġ 1 1 2 . dp . to Px () Ġ} ĊĠĠĠ Ġval Ġfab Size Ġ= Ġwith ( Local Density . current ) Ġ{ Ġ 5 6 . dp . to Px () Ġ} ĊĠĠĠ Ġval Ġfab Gap Ġ= Ġwith ( Local Density . current ) Ġ{ Ġ 8 . dp . to Px () Ġ} ĊĠĠĠ Ġval Ġfab Icon Size Ġ= Ġwith ( Local Density . current ) Ġ{ Ġ 2 4 . dp . to Px () Ġ} ĊĠĠĠ Ġval Ġfab Icon Half Size Ġ= Ġfab Icon Size Ġ* Ġ 0 . 5 f ĊĊĠĠĠ Ġval Ġfabs H Progress Ġ= Ġremember ( items Count ) Ġ{ ĠArray ( items Count ) Ġ{ Ġ 0 f Ġ} Ġ} ĊĠĠĠ Ġval Ġfabs V Progress Ġ= Ġremember ( items Count ) Ġ{ ĠArray ( items Count ) Ġ{ Ġ 0 f Ġ} Ġ} ĊĠĠĠ Ġval Ġwidth Ġ= Ġremember ( items Count ) Ġ{ Ġmutable State Of ( 0 ) Ġ} ĊĠĠĠ Ġval Ġheight Ġ= Ġremember ( items Count ) Ġ{ Ġmutable State Of ( 0 ) Ġ} ĊĊĠĠĠ Ġval Ġduration Ġ= Ġ 3 0 0 ĊĊĠĠĠ Ġval Ġspec Ġ= Ġt ween < Float >( ĊĠĠĠĠĠĠĠ Ġduration , ĊĠĠĠĠĠĠĠ Ġeasing Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ< Ġ 0 . 2 5 f Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ> Ġ 0 . 7 5 f Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġ- Ġ 0 . 2 5 f ) Ġ* Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġspec 2 Ġ= Ġt ween < Float >( ĊĠĠĠĠĠĠĠ Ġduration , ĊĠĠĠĠĠĠĠ Ġeasing Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġ 0 . 2 5 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ* Ġ 4 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġspec 3 Ġ= Ġt ween < Float >( ĊĠĠĠĠĠĠĠ Ġduration , ĊĠĠĠĠĠĠĠ Ġeasing Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ< Ġ 0 . 7 5 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġ- Ġ 0 . 7 5 f ) Ġ* Ġ 4 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġsection Ġ= Ġ 1 f Ġ/ Ġitems Count ĊĠĠĠ Ġval Ġhalf Section Ġ= Ġsection Ġ* Ġ 0 . 5 f ĊĠĠĠ Ġval Ġtarget Ġ= Ġhalf Section Ġ+ Ġsection Ġ* Ġcurrent . value ĊĠĠĠ Ġval Ġwave H Progress Ġ= Ġanimate Float As State ( target , Ġspec ) ĊĠĠĠ Ġval Ġwave V Progress Ġ= Ġanimate Float As State ( ĊĠĠĠĠĠĠĠ Ġif Ġ( wave H Progress . value Ġ== Ġ 0 . 2 5 f Ġ|| Ġwave H Progress . value Ġ== Ġ 0 . 7 5 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġrepeat ( items Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfabs H Progress [ it ] Ġ= Ġhalf Section Ġ+ Ġsection Ġ* Ġit ĊĠĠĠĠĠĠĠ Ġfabs V Progress [ it ] Ġ= Ġanimate Float As State ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġcurrent . value ) Ġ 1 f Ġelse Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġcurrent . value ) Ġspec 3 Ġelse Ġspec 2 ĊĠĠĠĠĠĠĠ Ġ). value ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠBox Ġ{ ĊĠĠĠĠĠĠĠ ĠSurface ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape Ġ= Ġcreate Wave Shape ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave H Progress . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave V Progress . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab Gap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfabs H Progress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfabs V Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelevation Ġ= Ġ 8 . dp , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠMaterial Theme . colors . primary , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 1 1 2 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Size Changed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth . value Ġ= Ġit . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight . value Ġ= Ġit . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. click able Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick . invoke ( current . value Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Interop Filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . action Ġ== ĠMotion Event . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsection Width Ġ= Ġwidth . value Ġ/ Ġitems Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsection Index Ġ= Ġ( it . x Ġ/ Ġsection Width ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick . invoke ( section Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( items Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Ġ= Ġpainter Resource ( ICON S [ it ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġstring Resource ( id Ġ= ĠR . string . a 1 1 y _ tab _ icon ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt int Ġ= ĠColor . White , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . graphics Layer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ= ĠUN SELECTED _ ALPHA Ġ+ Ġ( 1 Ġ- ĠUN SELECTED _ ALPHA ) Ġ* Ġfabs V Progress [ it ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslation X Ġ= Ġwidth . value Ġ* Ġfabs H Progress [ it ] Ġ- Ġfab Icon Half Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslation Y Ġ= Ġheight . value Ġ* Ġ 0 . 5 f Ġ+ Ġfab Icon Half Size Ġ- Ġfab Icon Size Ġ* Ġfabs V Progress [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcreate Wave Shape ( ĊĠĠĠ Ġwave Width : ĠFloat , ĊĠĠĠ Ġwave H Progress : ĠFloat , ĊĠĠĠ Ġwave V Progress : ĠFloat , ĊĠĠĠ Ġfab Size : ĠFloat , ĊĠĠĠ Ġfab Gap : ĠFloat , ĊĠĠĠ Ġfabs H Progress : ĠArray < Float >, ĊĠĠĠ Ġfabs V Progress : ĠArray < Float > Ċ ) Ġ= Ġobject Ġ: ĠShape Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Outline ( ĊĠĠĠĠĠĠĠ Ġsize : ĠSize , ĊĠĠĠĠĠĠĠ Ġlayout Direction : ĠLayout Direction , ĊĠĠĠĠĠĠĠ Ġdensity : ĠD ensity ĊĠĠĠ Ġ): ĠOut line Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhalf Height Ġ= Ġsize . height Ġ* Ġ 0 . 5 f ĊĠĠĠĠĠĠĠ Ġval Ġhalf Fab Size Ġ= Ġfab Size Ġ* Ġ 0 . 5 f ĊĊĠĠĠĠĠĠĠ Ġval Ġwave Path Ġ= ĠPath (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Wave Width Ġ= Ġwave Width Ġ* Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwave X Ġ= Ġsize . width Ġ* Ġwave H Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwave Y Top Ġ= Ġhalf Height Ġ- Ġhalf Fab Size Ġ* Ġ 0 . 6 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwave Y Bottom Ġ= Ġhalf Height Ġ+ Ġhalf Fab Size Ġ+ Ġfab Gap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwave Y Ġ= Ġwave Y Top Ġ+ Ġ( wave Y Bottom Ġ- Ġwave Y Top ) Ġ* Ġwave V Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwave X Delta Ġ= Ġabs ( wave Y Ġ- Ġhalf Height ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove To ( 0 f , Ġhalf Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline To ( wave X Ġ- Ġhalf Wave Width , Ġhalf Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcubic To ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave X Ġ- Ġhalf Fab Size , Ġhalf Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave X Ġ- Ġwave X Delta , Ġwave Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave X , Ġwave Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcubic To ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave X Ġ+ Ġwave X Delta , Ġwave Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave X Ġ+ Ġhalf Fab Size , Ġhalf Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwave X Ġ+ Ġhalf Wave Width , Ġhalf Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline To ( size . width , Ġhalf Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline To ( size . width , Ġsize . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline To ( 0 f , Ġsize . height ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfabs Path Ġ= ĠPath (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfabs H Progress . forEach Indexed Ġ{ Ġindex , Ġh Progress Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Progress Ġ= Ġfabs V Progress [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfab X Ġ= Ġsize . width Ġ* Ġh Progress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfab Y Ġ= Ġhalf Height Ġ+ Ġhalf Fab Size Ġ- Ġhalf Fab Size Ġ* Ġv Progress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd O val ( Rect ( Offset ( fab X , Ġfab Y ), Ġhalf Fab Size )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠOut line . Generic ( Path . combine ( Path Operation . union , Ġwave Path , Ġfabs Path )) ĊĠĠĠ Ġ} Ċ } Ċ