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
|
||||
}
|
||||
|
||||
fun setYearViewYear(year: Int) {
|
||||
_yearViewYear.value = year
|
||||
}
|
||||
|
||||
/**
|
||||
* 展开状态下拖拽折叠,delta 正值推动 progress 向 1(折叠方向)。
|
||||
*
|
||||
|
||||
@ -123,6 +123,7 @@ fun CalendarMonthView(
|
||||
var rowHeightPx by remember { mutableIntStateOf(0) }
|
||||
var screenWidthPx by remember { mutableIntStateOf(0) }
|
||||
var isMenuExpanded by remember { mutableStateOf(false) }
|
||||
|
||||
// 视图切换时自动关闭菜单
|
||||
LaunchedEffect(isYearView) {
|
||||
isMenuExpanded = false
|
||||
@ -136,26 +137,15 @@ fun CalendarMonthView(
|
||||
pageCount = { Int.MAX_VALUE }
|
||||
)
|
||||
|
||||
// 进入年视图时同步 yearPagerState 到当前年
|
||||
LaunchedEffect(isYearView) {
|
||||
if (isYearView) {
|
||||
if (yearPagerState.currentPage != START_PAGE) {
|
||||
yearPagerState.scrollToPage(START_PAGE)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 年视图翻页时同步 yearViewYear
|
||||
// 年视图翻页时同步 yearViewYear(跟踪 settled page 差值)
|
||||
LaunchedEffect(yearPagerState) {
|
||||
var lastSettledPage = yearPagerState.currentPage
|
||||
snapshotFlow { yearPagerState.settledPage }.collect { page ->
|
||||
val offset = page - START_PAGE
|
||||
val targetYear = selectedDate.year + offset
|
||||
if (targetYear != yearViewYear) {
|
||||
if (targetYear > yearViewYear) {
|
||||
viewModel.incrementYear()
|
||||
} else {
|
||||
viewModel.decrementYear()
|
||||
}
|
||||
if (page != lastSettledPage) {
|
||||
val diff = page - lastSettledPage
|
||||
val newYear = viewModel.yearViewYear.value + diff
|
||||
viewModel.setYearViewYear(newYear)
|
||||
lastSettledPage = page
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -299,7 +289,7 @@ fun CalendarMonthView(
|
||||
} else {
|
||||
pageOffset
|
||||
}
|
||||
val pageYear = selectedDate.year + (page - START_PAGE)
|
||||
val pageYear = yearViewYear + (page - yearPagerState.currentPage)
|
||||
YearGridView(
|
||||
year = pageYear,
|
||||
selectedMonth = if (pageYear == currentYear) currentMonth else 0,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user