Skip to content
This repository was archived by the owner on Dec 18, 2023. It is now read-only.

Commit a6612d6

Browse files
committed
add colorPropKey to explodeTransitionDefinition
1 parent b9daa3d commit a6612d6

File tree

2 files changed

+73
-40
lines changed

2 files changed

+73
-40
lines changed

app/src/main/java/com/example/intimesimple/ui/animations/AnimationDefinitions.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import androidx.compose.animation.ColorPropKey
55
import androidx.compose.animation.core.FloatPropKey
66
import androidx.compose.animation.core.keyframes
77
import androidx.compose.animation.core.transitionDefinition
8+
import androidx.compose.animation.core.tween
89
import androidx.compose.ui.graphics.Color
10+
import com.example.intimesimple.ui.theme.DarkBlue900
11+
import com.example.intimesimple.ui.theme.Green500
912

1013

1114
object AnimationDefinitions{
@@ -20,22 +23,25 @@ object AnimationDefinitions{
2023

2124

2225
@SuppressLint("Range")
23-
fun explodeTransitionDefinition() = transitionDefinition<FabState>{
26+
val explodeTransitionDefinition = transitionDefinition<FabState>{
2427
state(FabState.Idle){
25-
this[sizeState] = 80f
28+
this[sizeState] = 60f
29+
this[colorState] = Green500
2630
}
2731

2832
state(FabState.Exploded){
2933
this[sizeState] = 4000f
34+
this[colorState] = DarkBlue900
3035
}
3136

3237
transition(fromState = FabState.Idle, toState = FabState.Exploded){
3338
sizeState using keyframes {
3439
durationMillis = 700
35-
50f at 0
40+
60f at 0
3641
30f at 120
3742
4000f at 700
3843
}
44+
colorState using tween(durationMillis = 300)
3945
}
4046
}
4147
}

app/src/main/java/com/example/intimesimple/ui/composables/WorkoutListScreen.kt

Lines changed: 64 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
11
package com.example.intimesimple.ui.composables
22

33
import android.net.Uri
4+
import androidx.compose.animation.transition
5+
import androidx.compose.foundation.Canvas
46
import androidx.navigation.compose.*
57
import androidx.compose.foundation.Text
8+
import androidx.compose.foundation.clickable
69
import androidx.compose.foundation.layout.PaddingValues
710
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.foundation.layout.size
812
import androidx.compose.foundation.lazy.LazyColumnFor
913
import androidx.compose.material.*
1014
import androidx.compose.material.icons.Icons
1115
import androidx.compose.material.icons.filled.Add
16+
import androidx.compose.material.ripple.RippleIndication
1217
import androidx.compose.runtime.*
1318
import androidx.compose.runtime.livedata.observeAsState
1419
import androidx.compose.runtime.getValue
1520
import androidx.compose.ui.Modifier
21+
import androidx.compose.ui.geometry.Offset
22+
import androidx.compose.ui.graphics.imageFromResource
1623
import androidx.compose.ui.res.stringResource
1724
import androidx.compose.ui.unit.dp
1825
import androidx.core.os.bundleOf
1926
import androidx.navigation.NavController
2027
import com.example.intimesimple.R
2128
import com.example.intimesimple.data.local.Workout
29+
import com.example.intimesimple.ui.animations.AnimationDefinitions
30+
import com.example.intimesimple.ui.animations.AnimationDefinitions.colorState
31+
import com.example.intimesimple.ui.animations.AnimationDefinitions.sizeState
2232
import com.example.intimesimple.ui.composables.navigation.Screen
2333
import com.example.intimesimple.ui.theme.Green500
2434
import com.example.intimesimple.ui.viewmodels.WorkoutListViewModel
@@ -41,44 +51,61 @@ fun WorkoutListScreen(
4151

4252
// build screen layout with scaffold
4353
Scaffold(
44-
modifier = modifier,
45-
topBar = {
46-
TopAppBar(
47-
title = {
48-
Text(
49-
text = stringResource(id = R.string.app_name).toUpperCase()
50-
)
51-
}
52-
)
53-
},
54-
bodyContent = { paddingValues ->
55-
WorkoutListContent(
56-
modifier = modifier.padding(paddingValues),
57-
innerPadding = PaddingValues(4.dp),
58-
items = workouts,
59-
onSwipe = {
60-
workoutListViewModel.deleteWorkout(it)
61-
},
62-
onClick = {
63-
navController.navigate(
64-
Uri.parse(WORKOUT_DETAIL_URI + "${it.id}")
65-
)
66-
sendServiceCommand(ACTION_INITIALIZE_DATA)
67-
}
68-
)
69-
},
70-
floatingActionButton = {
71-
FloatingActionButton(
54+
modifier = modifier,
55+
topBar = {
56+
TopAppBar(
57+
title = {
58+
Text(
59+
text = stringResource(id = R.string.app_name).toUpperCase()
60+
)
61+
}
62+
)
63+
},
64+
bodyContent = { paddingValues ->
65+
WorkoutListContent(
66+
modifier = modifier.padding(paddingValues),
67+
innerPadding = PaddingValues(4.dp),
68+
items = workouts,
69+
onSwipe = {
70+
workoutListViewModel.deleteWorkout(it)
71+
},
72+
onClick = {
73+
navController.navigate(
74+
Uri.parse(WORKOUT_DETAIL_URI + "${it.id}")
75+
)
76+
sendServiceCommand(ACTION_INITIALIZE_DATA)
77+
}
78+
)
79+
},
80+
floatingActionButton = {
81+
var animateFab by remember { mutableStateOf(false) }
82+
83+
val state = transition(
84+
definition = AnimationDefinitions.explodeTransitionDefinition,
85+
initState = AnimationDefinitions.FabState.Idle,
86+
toState = if (!animateFab) AnimationDefinitions.FabState.Idle
87+
else AnimationDefinitions.FabState.Exploded,
88+
onStateChangeFinished = {
89+
navController.navigate(Screen.WorkoutAddScreen.route)
90+
animateFab = false
91+
}
92+
)
93+
94+
Canvas(
95+
modifier = Modifier.padding(16.dp)
96+
.clickable(
7297
onClick = {
73-
navController.navigate(Screen.WorkoutAddScreen.route)
74-
},
75-
icon = {
76-
Icon(Icons.Filled.Add)
77-
},
78-
backgroundColor = Green500
79-
)
80-
},
81-
floatingActionButtonPosition = FabPosition.End
98+
animateFab = true
99+
}, indication = RippleIndication(
100+
radius = 26.dp,
101+
bounded = false
102+
)
103+
),
104+
) {
105+
drawCircle(state[colorState], state[sizeState])
106+
}
107+
},
108+
floatingActionButtonPosition = FabPosition.End
82109
)
83110
}
84111

0 commit comments

Comments
 (0)