Skip to content

Commit 20327f8

Browse files
committed
优化主页 tab 移动流畅度
1 parent 314cae6 commit 20327f8

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/component/TopNav.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.height
1010
import androidx.compose.foundation.layout.padding
1111
import androidx.compose.foundation.layout.width
1212
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.LaunchedEffect
1314
import androidx.compose.runtime.getValue
1415
import androidx.compose.runtime.mutableIntStateOf
1516
import androidx.compose.runtime.mutableStateOf
@@ -19,6 +20,9 @@ import androidx.compose.ui.Modifier
1920
import androidx.compose.ui.focus.FocusRequester
2021
import androidx.compose.ui.focus.focusRequester
2122
import androidx.compose.ui.focus.focusRestorer
23+
import androidx.compose.ui.input.key.Key
24+
import androidx.compose.ui.input.key.key
25+
import androidx.compose.ui.input.key.onPreviewKeyEvent
2226
import androidx.compose.ui.platform.LocalContext
2327
import androidx.compose.ui.unit.dp
2428
import androidx.tv.material3.LocalContentColor
@@ -32,6 +36,8 @@ import dev.aaa1115910.biliapi.entity.ugc.UgcTypeV2
3236
import dev.aaa1115910.bv.BVApp
3337
import dev.aaa1115910.bv.util.getDisplayName
3438
import dev.aaa1115910.bv.util.ifElse
39+
import dev.aaa1115910.bv.util.isKeyDown
40+
import kotlinx.coroutines.delay
3541

3642
@Composable
3743
fun TopNav(
@@ -49,6 +55,15 @@ fun TopNav(
4955
targetValue = if (isLargePadding) 24.dp else 12.dp,
5056
label = "top nav vertical padding"
5157
)
58+
var tabMoved by remember { mutableStateOf(true) }
59+
60+
LaunchedEffect(selectedNav) {
61+
delay(200)
62+
onSelectedChanged(selectedNav)
63+
// 别急着向下移动焦点,动画还没结束
64+
delay(400)
65+
tabMoved = true
66+
}
5267

5368
Row(
5469
modifier = modifier
@@ -57,7 +72,12 @@ fun TopNav(
5772
horizontalArrangement = Arrangement.Center
5873
) {
5974
TabRow(
60-
modifier = Modifier.focusRestorer(focusRequester),
75+
modifier = Modifier
76+
.focusRestorer(focusRequester)
77+
.onPreviewKeyEvent {
78+
if (it.isKeyDown() && it.key == Key.DirectionDown) return@onPreviewKeyEvent !tabMoved
79+
false
80+
},
6181
selectedTabIndex = selectedTabIndex,
6282
separator = { Spacer(modifier = Modifier.width(12.dp)) },
6383
) {
@@ -68,9 +88,9 @@ fun TopNav(
6888
topNavItem = tab,
6989
selected = index == selectedTabIndex,
7090
onFocus = {
91+
tabMoved = tab == selectedNav
7192
selectedNav = tab
7293
selectedTabIndex = index
73-
onSelectedChanged(tab)
7494
},
7595
onClick = { onClick(tab) }
7696
)

app/tv/src/main/kotlin/dev/aaa1115910/bv/tv/screens/main/DrawerContent.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import dev.aaa1115910.bv.ui.theme.BVTheme
4747
import dev.aaa1115910.bv.util.ifElse
4848
import dev.aaa1115910.bv.util.isDpadRight
4949
import dev.aaa1115910.bv.util.isKeyDown
50+
import kotlinx.coroutines.delay
5051

5152
@Composable
5253
fun NavigationDrawerScope.DrawerContent(
@@ -62,9 +63,15 @@ fun NavigationDrawerScope.DrawerContent(
6263
) {
6364
var selectedItem by remember { mutableStateOf(DrawerItem.Home) }
6465
val centerFocusRequester = remember { FocusRequester() }
66+
var tabMoved by remember { mutableStateOf(true) }
6567

6668
LaunchedEffect(selectedItem) {
69+
tabMoved = false
70+
delay(200)
6771
onDrawerItemChanged(selectedItem)
72+
// 别急着向右移动焦点,动画还没结束
73+
delay(200)
74+
tabMoved = true
6875
}
6976

7077
Column(
@@ -74,7 +81,7 @@ fun NavigationDrawerScope.DrawerContent(
7481
.onPreviewKeyEvent { keyEvent ->
7582
if (keyEvent.isDpadRight()) {
7683
if (keyEvent.isKeyDown()) {
77-
onFocusToContent()
84+
if (tabMoved) onFocusToContent()
7885
return@onPreviewKeyEvent true
7986
}
8087
}

0 commit comments

Comments
 (0)