修复首次启动切换年视图无动画的问题

始终组合年视图 HorizontalPager 层(通过 graphicsLayer.alpha=0 隐藏),
避免首次进入时 Pager 组合延迟导致动画首帧丢失。
This commit is contained in:
meyou 2026-05-16 16:59:27 +08:00
parent 142d0c235a
commit 216ebbf990

View File

@ -270,47 +270,45 @@ fun CalendarMonthView(
} }
} }
// 年视图层HorizontalPager 支持左右滑动切年 // 年视图层:始终组合以避免首次进入时的组合延迟导致动画丢失
if (viewModel.isYearView || yearProgress > 0.01f) { HorizontalPager(
HorizontalPager( state = yearPagerState,
state = yearPagerState, beyondViewportPageCount = 1,
beyondViewportPageCount = 1, flingBehavior = PagerDefaults.flingBehavior(state = yearPagerState),
flingBehavior = PagerDefaults.flingBehavior(state = yearPagerState), modifier = Modifier
modifier = Modifier .fillMaxSize()
.fillMaxSize() .graphicsLayer {
.graphicsLayer { scaleX = yearScale
scaleX = yearScale scaleY = yearScale
scaleY = yearScale alpha = yearAlpha
alpha = yearAlpha transformOrigin = TransformOrigin(anchorPivotX, anchorPivotY)
transformOrigin = TransformOrigin(anchorPivotX, anchorPivotY) }
.padding(horizontal = HORIZONTAL_PADDING_DP.dp)
) { page ->
val pageYear = viewModel.selectedDate.year + (page - START_PAGE)
YearGridView(
year = pageYear,
selectedMonth = if (pageYear == currentYear) currentMonth else 0,
today = today,
onMonthClick = { month ->
viewModel.selectMonthFromYearView(month)
@Suppress("DEPRECATION") // monthNumber 无替代 API
val targetPage = yearMonthToPage(
viewModel.yearViewYear, month,
today.year, today.month.number
)
if (targetPage != pagerState.currentPage) {
coroutineScope.launch { pagerState.scrollToPage(targetPage) }
} }
.padding(horizontal = HORIZONTAL_PADDING_DP.dp) },
) { page -> onYearChange = { newYear ->
val pageYear = viewModel.selectedDate.year + (page - START_PAGE) val offset = newYear - pageYear
YearGridView( val targetPage = yearPagerState.currentPage + offset
year = pageYear, if (targetPage != yearPagerState.currentPage) {
selectedMonth = if (pageYear == currentYear) currentMonth else 0, coroutineScope.launch { yearPagerState.animateScrollToPage(targetPage) }
today = today,
onMonthClick = { month ->
viewModel.selectMonthFromYearView(month)
@Suppress("DEPRECATION") // monthNumber 无替代 API
val targetPage = yearMonthToPage(
viewModel.yearViewYear, month,
today.year, today.month.number
)
if (targetPage != pagerState.currentPage) {
coroutineScope.launch { pagerState.scrollToPage(targetPage) }
}
},
onYearChange = { newYear ->
val offset = newYear - pageYear
val targetPage = yearPagerState.currentPage + offset
if (targetPage != yearPagerState.currentPage) {
coroutineScope.launch { yearPagerState.animateScrollToPage(targetPage) }
}
} }
) }
} )
} }
// BottomCard年视图时隐藏 // BottomCard年视图时隐藏