Add pull-down gesture to expand from collapsed week view back to month view
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
1c232762b1
commit
c1e0484cba
@ -74,6 +74,32 @@ class CalendarViewModel(private val coroutineScope: CoroutineScope) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 折叠状态下下拉恢复:delta 为负值(向下拖)推动 progress 向 0
|
||||||
|
fun onExpandDrag(delta: Float) {
|
||||||
|
coroutineScope.launch {
|
||||||
|
val new = (_collapseAnimatable.value + delta).coerceIn(0f, 1f)
|
||||||
|
_collapseAnimatable.snapTo(new)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 下拉超过 50% 时自动展开到月视图,否则回弹到周视图
|
||||||
|
fun onExpandDragEnd() {
|
||||||
|
coroutineScope.launch {
|
||||||
|
if (_collapseAnimatable.value < 0.5f) {
|
||||||
|
_collapseAnimatable.animateTo(
|
||||||
|
targetValue = 0f,
|
||||||
|
animationSpec = spring(dampingRatio = 0.8f, stiffness = 400f)
|
||||||
|
)
|
||||||
|
isCollapsed = false
|
||||||
|
} else {
|
||||||
|
_collapseAnimatable.animateTo(
|
||||||
|
targetValue = 1f,
|
||||||
|
animationSpec = spring(dampingRatio = 0.8f, stiffness = 400f)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算给定日期的 ISO 8601 周号。
|
* 计算给定日期的 ISO 8601 周号。
|
||||||
*
|
*
|
||||||
|
|||||||
@ -38,7 +38,17 @@ fun BottomCard(
|
|||||||
modifier = modifier
|
modifier = modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.pointerInput(viewModel.isCollapsed) {
|
.pointerInput(viewModel.isCollapsed) {
|
||||||
if (viewModel.isCollapsed) return@pointerInput
|
if (viewModel.isCollapsed) {
|
||||||
|
// 折叠状态:下拉恢复到月视图
|
||||||
|
detectVerticalDragGestures(
|
||||||
|
onDragEnd = { viewModel.onExpandDragEnd() },
|
||||||
|
onDragCancel = { viewModel.onExpandDragEnd() }
|
||||||
|
) { _, dragAmount ->
|
||||||
|
val delta = -dragAmount / dragRange
|
||||||
|
viewModel.onExpandDrag(delta)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 展开状态:上拉折叠到周视图
|
||||||
detectVerticalDragGestures(
|
detectVerticalDragGestures(
|
||||||
onDragEnd = { viewModel.onDragEnd() },
|
onDragEnd = { viewModel.onDragEnd() },
|
||||||
onDragCancel = { viewModel.onDragEnd() }
|
onDragCancel = { viewModel.onDragEnd() }
|
||||||
@ -46,6 +56,7 @@ fun BottomCard(
|
|||||||
val delta = -dragAmount / dragRange
|
val delta = -dragAmount / dragRange
|
||||||
viewModel.onDrag(delta)
|
viewModel.onDrag(delta)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
|
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
|
||||||
color = MaterialTheme.colorScheme.surfaceVariant,
|
color = MaterialTheme.colorScheme.surfaceVariant,
|
||||||
|
|||||||
@ -106,7 +106,8 @@ fun CalendarMonthView(
|
|||||||
weekdayHeaderHeightPx = size.height
|
weekdayHeaderHeightPx = size.height
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
if (viewModel.isCollapsed) {
|
// 完全折叠且无动画时显示 WeekPager,否则显示 CalendarPager(含下拉恢复过程)
|
||||||
|
if (viewModel.isCollapsed && viewModel.collapseProgress >= 1f) {
|
||||||
WeekPager(
|
WeekPager(
|
||||||
selectedDate = viewModel.selectedDate,
|
selectedDate = viewModel.selectedDate,
|
||||||
today = today,
|
today = today,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user