1
1
package com.example.intimesimple.ui.composables
2
2
3
3
import android.net.Uri
4
+ import androidx.compose.animation.transition
5
+ import androidx.compose.foundation.Canvas
4
6
import androidx.navigation.compose.*
5
7
import androidx.compose.foundation.Text
8
+ import androidx.compose.foundation.clickable
6
9
import androidx.compose.foundation.layout.PaddingValues
7
10
import androidx.compose.foundation.layout.padding
11
+ import androidx.compose.foundation.layout.size
8
12
import androidx.compose.foundation.lazy.LazyColumnFor
9
13
import androidx.compose.material.*
10
14
import androidx.compose.material.icons.Icons
11
15
import androidx.compose.material.icons.filled.Add
16
+ import androidx.compose.material.ripple.RippleIndication
12
17
import androidx.compose.runtime.*
13
18
import androidx.compose.runtime.livedata.observeAsState
14
19
import androidx.compose.runtime.getValue
15
20
import androidx.compose.ui.Modifier
21
+ import androidx.compose.ui.geometry.Offset
22
+ import androidx.compose.ui.graphics.imageFromResource
16
23
import androidx.compose.ui.res.stringResource
17
24
import androidx.compose.ui.unit.dp
18
25
import androidx.core.os.bundleOf
19
26
import androidx.navigation.NavController
20
27
import com.example.intimesimple.R
21
28
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
22
32
import com.example.intimesimple.ui.composables.navigation.Screen
23
33
import com.example.intimesimple.ui.theme.Green500
24
34
import com.example.intimesimple.ui.viewmodels.WorkoutListViewModel
@@ -41,44 +51,61 @@ fun WorkoutListScreen(
41
51
42
52
// build screen layout with scaffold
43
53
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(
72
97
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
82
109
)
83
110
}
84
111
0 commit comments