fix: 修复年视图翻页后共享元素转场动画失效
- 移除 baseYearForPager 和 scrollToPage(START_PAGE) - HorizontalPager 的 pageYear 改用 yearViewYear + 相对偏移计算 - snapshotFlow 改为跟踪 settled page 差值更新 yearViewYear - 避免再次进入年视图时强制滚动导致动画期间重组 Fixes #8 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
ca02784d39
commit
2fc89d08c7
@ -208,6 +208,10 @@ class CalendarViewModel(
|
|||||||
_yearViewYear.value = _yearViewYear.value - 1
|
_yearViewYear.value = _yearViewYear.value - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun setYearViewYear(year: Int) {
|
||||||
|
_yearViewYear.value = year
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 展开状态下拖拽折叠,delta 正值推动 progress 向 1(折叠方向)。
|
* 展开状态下拖拽折叠,delta 正值推动 progress 向 1(折叠方向)。
|
||||||
*
|
*
|
||||||
|
|||||||
@ -123,6 +123,7 @@ fun CalendarMonthView(
|
|||||||
var rowHeightPx by remember { mutableIntStateOf(0) }
|
var rowHeightPx by remember { mutableIntStateOf(0) }
|
||||||
var screenWidthPx by remember { mutableIntStateOf(0) }
|
var screenWidthPx by remember { mutableIntStateOf(0) }
|
||||||
var isMenuExpanded by remember { mutableStateOf(false) }
|
var isMenuExpanded by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
// 视图切换时自动关闭菜单
|
// 视图切换时自动关闭菜单
|
||||||
LaunchedEffect(isYearView) {
|
LaunchedEffect(isYearView) {
|
||||||
isMenuExpanded = false
|
isMenuExpanded = false
|
||||||
@ -136,26 +137,15 @@ fun CalendarMonthView(
|
|||||||
pageCount = { Int.MAX_VALUE }
|
pageCount = { Int.MAX_VALUE }
|
||||||
)
|
)
|
||||||
|
|
||||||
// 进入年视图时同步 yearPagerState 到当前年
|
// 年视图翻页时同步 yearViewYear(跟踪 settled page 差值)
|
||||||
LaunchedEffect(isYearView) {
|
|
||||||
if (isYearView) {
|
|
||||||
if (yearPagerState.currentPage != START_PAGE) {
|
|
||||||
yearPagerState.scrollToPage(START_PAGE)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 年视图翻页时同步 yearViewYear
|
|
||||||
LaunchedEffect(yearPagerState) {
|
LaunchedEffect(yearPagerState) {
|
||||||
|
var lastSettledPage = yearPagerState.currentPage
|
||||||
snapshotFlow { yearPagerState.settledPage }.collect { page ->
|
snapshotFlow { yearPagerState.settledPage }.collect { page ->
|
||||||
val offset = page - START_PAGE
|
if (page != lastSettledPage) {
|
||||||
val targetYear = selectedDate.year + offset
|
val diff = page - lastSettledPage
|
||||||
if (targetYear != yearViewYear) {
|
val newYear = viewModel.yearViewYear.value + diff
|
||||||
if (targetYear > yearViewYear) {
|
viewModel.setYearViewYear(newYear)
|
||||||
viewModel.incrementYear()
|
lastSettledPage = page
|
||||||
} else {
|
|
||||||
viewModel.decrementYear()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -299,7 +289,7 @@ fun CalendarMonthView(
|
|||||||
} else {
|
} else {
|
||||||
pageOffset
|
pageOffset
|
||||||
}
|
}
|
||||||
val pageYear = selectedDate.year + (page - START_PAGE)
|
val pageYear = yearViewYear + (page - yearPagerState.currentPage)
|
||||||
YearGridView(
|
YearGridView(
|
||||||
year = pageYear,
|
year = pageYear,
|
||||||
selectedMonth = if (pageYear == currentYear) currentMonth else 0,
|
selectedMonth = if (pageYear == currentYear) currentMonth else 0,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user