@@ -2,37 +2,50 @@ package com.github.jing332.alistandroid.ui.nav.alist
22
33import android.content.Intent
44import android.content.IntentFilter
5- import androidx.compose.foundation.layout.Arrangement
5+ import androidx.compose.animation.Crossfade
6+ import androidx.compose.animation.animateColorAsState
7+ import androidx.compose.animation.core.LinearEasing
8+ import androidx.compose.animation.core.animateFloatAsState
9+ import androidx.compose.animation.core.tween
10+ import androidx.compose.foundation.layout.Box
611import androidx.compose.foundation.layout.Column
712import androidx.compose.foundation.layout.Row
813import androidx.compose.foundation.layout.fillMaxSize
914import androidx.compose.foundation.layout.fillMaxWidth
1015import androidx.compose.foundation.layout.imePadding
1116import androidx.compose.foundation.layout.padding
17+ import androidx.compose.foundation.layout.size
18+ import androidx.compose.foundation.shape.CircleShape
1219import androidx.compose.material.icons.Icons
1320import androidx.compose.material.icons.filled.AddBusiness
1421import androidx.compose.material.icons.filled.MoreVert
1522import androidx.compose.material.icons.filled.Password
23+ import androidx.compose.material.icons.filled.Send
24+ import androidx.compose.material.icons.filled.Stop
1625import androidx.compose.material3.AlertDialog
1726import androidx.compose.material3.DropdownMenu
1827import androidx.compose.material3.DropdownMenuItem
1928import androidx.compose.material3.ExperimentalMaterial3Api
29+ import androidx.compose.material3.FloatingActionButton
30+ import androidx.compose.material3.FloatingActionButtonDefaults
2031import androidx.compose.material3.Icon
2132import androidx.compose.material3.IconButton
2233import androidx.compose.material3.MaterialTheme
2334import androidx.compose.material3.OutlinedTextField
2435import androidx.compose.material3.Scaffold
25- import androidx.compose.material3.Switch
2636import androidx.compose.material3.Text
2737import androidx.compose.material3.TextButton
2838import androidx.compose.material3.TopAppBar
2939import androidx.compose.runtime.Composable
3040import androidx.compose.runtime.getValue
3141import androidx.compose.runtime.mutableStateOf
3242import androidx.compose.runtime.remember
43+ import androidx.compose.runtime.rememberCoroutineScope
3344import androidx.compose.runtime.setValue
3445import androidx.compose.ui.Alignment
3546import androidx.compose.ui.Modifier
47+ import androidx.compose.ui.draw.rotate
48+ import androidx.compose.ui.graphics.graphicsLayer
3649import androidx.compose.ui.platform.LocalContext
3750import androidx.compose.ui.platform.LocalView
3851import androidx.compose.ui.res.stringResource
@@ -115,7 +128,7 @@ fun AListScreen() {
115128 }
116129 }
117130
118- Scaffold (modifier = Modifier .imePadding(),
131+ Scaffold (
119132 topBar = {
120133 TopAppBar (
121134 title = {
@@ -186,31 +199,61 @@ fun AListScreen() {
186199 )
187200 }
188201 ) { paddingValues ->
189- Column (
202+ Box (
190203 Modifier
191204 .padding(paddingValues)
192205 .fillMaxSize()
193206 .padding(horizontal = 8 .dp)
194- .padding(bottom = 16 .dp)
195207 ) {
196208 ServerLogScreen (
197209 modifier = Modifier
198- .fillMaxWidth()
199- .weight(1f )
210+ .fillMaxSize()
200211 )
201212
202- Column (
203- Modifier
204- .fillMaxWidth(),
205- verticalArrangement = Arrangement .Bottom ,
213+ SwitchFloatingButton (
214+ modifier = Modifier
215+ .align(Alignment .BottomEnd )
216+ .padding(16 .dp),
217+ switch = alistRunning
206218 ) {
207- Switch (
208- modifier = Modifier
209- .align(Alignment .CenterHorizontally ),
210- checked = alistRunning,
211- onCheckedChange = { switch() },
212- )
219+ switch()
213220 }
214221 }
215222 }
223+ }
224+
225+ @Composable
226+ fun SwitchFloatingButton (modifier : Modifier , switch : Boolean , onSwitchChange : (Boolean ) -> Unit ) {
227+ val targetIcon =
228+ if (switch) Icons .Filled .Stop else Icons .Filled .Send
229+ val rotationAngle by animateFloatAsState(targetValue = if (switch) 360f else 0f , label = " " )
230+
231+ val color =
232+ animateColorAsState(
233+ targetValue = if (switch) MaterialTheme .colorScheme.inversePrimary else MaterialTheme .colorScheme.primaryContainer,
234+ label = " " ,
235+ animationSpec = tween(500 , 0 , LinearEasing )
236+ )
237+
238+ FloatingActionButton (
239+ modifier = modifier,
240+ elevation = FloatingActionButtonDefaults .elevation(8 .dp),
241+ shape = CircleShape ,
242+ containerColor = color.value,
243+ onClick = { onSwitchChange(! switch) }) {
244+
245+ Crossfade (targetState = targetIcon, label = " " ) {
246+ Icon (
247+ imageVector = it,
248+ contentDescription = stringResource(id = if (switch) R .string.shutdown else R .string.start),
249+ modifier = Modifier
250+ .rotate(rotationAngle)
251+ .graphicsLayer {
252+ rotationZ = rotationAngle
253+ }
254+ .size(if (switch) 42 .dp else 32 .dp)
255+ )
256+ }
257+
258+ }
216259}
0 commit comments