/* Ċ Ġ* Ġ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 . animation . demos Ċ Ċ import Ġandroid . graphics . PointF Ċ import Ġandroidx . compose . animation . core . Float Prop Key Ċ import Ġandroidx . compose . animation . core . Inter ruption Handling Ċ import Ġandroidx . compose . animation . core . Transition Definition Ċ import Ġandroidx . compose . animation . core . Transition State Ċ import Ġandroidx . compose . animation . core . keyframes Ċ import Ġandroidx . compose . animation . core . transition Definition Ċ import Ġandroidx . compose . animation . core . t ween Ċ import Ġandroidx . compose . Composable Ċ import Ġandroidx . compose . remember Ċ import Ġandroidx . compose . state Ċ import Ġandroidx . compose . animation . transition Ċ import Ġandroidx . ui . core . Density Ambient Ċ import Ġandroidx . ui . core . Modifier Ċ import Ġandroidx . ui . core . gesture . press Indicator Gesture Filter Ċ import Ġandroidx . compose . foundation . Box Ċ import Ġandroidx . compose . foundation . Canvas Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . ui . unit . dp Ċ Ċ @ Composable Ċ fun ĠState Based R ipple Demo () Ġ{ ĊĠĠĠ ĠBox ( Modifier . fill MaxSize ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠR ipple Rect () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠR ipple Rect () Ġ{ ĊĠĠĠ Ġval Ġradius Ġ= Ġwith ( Density Ambient . current ) Ġ{ ĠTarget Radius . to Px () Ġ} ĊĠĠĠ Ġval Ġto State Ġ= Ġstate Ġ{ ĠButton Status . Initial Ġ} ĊĠĠĠ Ġval Ġri pple Trans Def Ġ= Ġremember Ġ{ Ġcreate Trans Def ( radius ) Ġ} ĊĠĠĠ Ġval ĠonPress : Ġ( Offset ) Ġ-> ĠUnit Ġ= Ġ{ Ġposition Ġ-> ĊĠĠĠĠĠĠĠ Ġdown . x Ġ= Ġposition . x ĊĠĠĠĠĠĠĠ Ġdown . y Ġ= Ġposition . y ĊĠĠĠĠĠĠĠ Ġto State . value Ġ= ĠButton Status . Pressed ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġon Release : Ġ() Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġto State . value Ġ= ĠButton Status . Released ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġstate Ġ= Ġtransition ( definition Ġ= Ġri pple Trans Def , Ġto State Ġ= Ġto State . value ) ĊĠĠĠ ĠR ipple Rect From State ( ĊĠĠĠĠĠĠĠ ĠModifier . press Indicator Gesture Filter ( onStart Ġ= ĠonPress , Ġon Stop Ġ= Ġon Release ), Ġstate Ġ= Ġstate ) Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠR ipple Rect From State ( modifier : ĠModifier Ġ= ĠModifier , Ġstate : ĠTransition State ) Ġ{ ĊĠĠĠ ĠCanvas ( modifier . fill MaxSize ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġfile Ġbug Ġfor Ġwhen Ġ" down " Ġis Ġnot Ġa Ġfile Ġlevel Ġval , Ġit 's Ġnot Ġmemoized Ġcorrectly ĊĠĠĠĠĠĠĠ Ġdraw Circle ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ= Ġ( state [ alpha ] Ġ* Ġ 2 5 5 ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġred Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgreen Ġ= Ġ 2 3 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblue Ġ= Ġ 2 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Ġ= ĠOffset ( down . x , Ġdown . y ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ= Ġstate [ radius ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġenum Ġclass ĠButton Status Ġ{ ĊĠĠĠ ĠInitial , ĊĠĠĠ ĠP ressed , ĊĠĠĠ ĠReleased Ċ } Ċ Ċ private Ġval ĠTarget Radius Ġ= Ġ 2 0 0 . dp Ċ Ċ private Ġval Ġdown Ġ= ĠPoint F ( 0 f , Ġ 0 f ) Ċ Ċ private Ġval Ġalpha Ġ= ĠFloat Prop Key () Ċ private Ġval Ġradius Ġ= ĠFloat Prop Key () Ċ Ċ private Ġfun Ġcreate Trans Def ( target Radius : ĠFloat ): ĠTransition Definition < Button Status > Ġ{ ĊĠĠĠ Ġreturn Ġtransition Definition Ġ{ ĊĠĠĠĠĠĠĠ Ġstate ( Button Status . Initial ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ alpha ] Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ radius ] Ġ= Ġtarget Radius Ġ* Ġ 0 . 3 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstate ( Button Status . Pressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ alpha ] Ġ= Ġ 0 . 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ radius ] Ġ= Ġtarget Radius Ġ+ Ġ 1 5 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstate ( Button Status . Released ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ alpha ] Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ radius ] Ġ= Ġtarget Radius Ġ+ Ġ 1 5 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠGrow Ġthe Ġri pple ĊĠĠĠĠĠĠĠ Ġtransition ( Button Status . Initial Ġto ĠButton Status . Pressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġusing Ġkey frames Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Millis Ġ= Ġ 2 2 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f Ġat Ġ 0 Ġ// Ġoptional ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 f Ġat Ġ 7 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 f Ġat Ġ 2 2 5 Ġ// Ġoptional ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġusing Ġt ween ( duration Millis Ġ= Ġ 2 2 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter ruption Handling Ġ= ĠInter ruption Handling . UN INTERRUP TIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠF ade Ġout Ġthe Ġri pple ĊĠĠĠĠĠĠĠ Ġtransition ( Button Status . Pressed Ġto ĠButton Status . Released ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġusing Ġt ween ( duration Millis Ġ= Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter ruption Handling Ġ= ĠInter ruption Handling . UN INTERRUP TIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġswitch Ġback Ġto ĠInitial Ġto Ġprepare Ġfor Ġthe Ġnext Ġri pple Ġcycle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext State Ġ= ĠButton Status . Initial ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠState Ġswitch Ġwithout Ġanimation ĊĠĠĠĠĠĠĠ Ġsnap Transition ( Button Status . Released Ġto ĠButton Status . Initial ) ĊĠĠĠ Ġ} Ċ } Ċ