Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.ai.assistance.operit.ui.main.layout
import androidx.compose.animation.Crossfade
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.gestures.detectHorizontalDragGestures
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -18,6 +19,9 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalViewConfiguration
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import com.ai.assistance.operit.ui.common.NavItem
Expand Down Expand Up @@ -96,6 +100,11 @@ fun TabletLayout(
label = "sidebarWidth"
)

val density = LocalDensity.current
val edgeSwipeWidthPx = with(density) { 24.dp.toPx() }
val sidebarSwipeThresholdPx = with(density) { 40.dp.toPx() }
val edgeGestureStartLimitPx = edgeSwipeWidthPx + LocalViewConfiguration.current.touchSlop

// 使用Box作为顶层容器,这样可以允许子元素重叠
Box(modifier = Modifier.fillMaxSize()) {
// 计算主内容区域的宽度(屏幕宽度减去侧边栏宽度),轻微调整动画时间
Expand All @@ -119,8 +128,56 @@ fun TabletLayout(
// 侧边栏区域,使用动画宽度,无圆角以完全遮住背景
Surface(
modifier =
Modifier.width(animatedSidebarWidth)
Modifier.width(animatedSidebarWidth)
.fillMaxHeight()
// 手势绑定在侧栏本身,避免主内容的横向手势被拦截。
.pointerInput(
isTabletSidebarExpanded,
edgeGestureStartLimitPx,
sidebarSwipeThresholdPx
) {
var totalDragPx = 0f
var gestureEligible = false
var gestureHandled = false

detectHorizontalDragGestures(
onDragStart = { startOffset ->
totalDragPx = 0f
gestureHandled = false
gestureEligible =
isTabletSidebarExpanded ||
startOffset.x <=

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] 用按下位置判断边缘手势

这里的 startOffset 不是 DOWN 坐标,而是首次跨过 touchSlop 那一帧的位置。只给 24dp 阈值加 touchSlop 无法补偿该帧额外移动量:例如从 23dp 按下、slop 为 8dp,下一帧到 33dp,就会将 gestureEligible 固定为 false,之后再向右拖也不展开。快速边缘滑动更容易触发。Compose 官方实现 在越过 slop 后调用 onDragStart(drag.position)。请保存初始按下位置,并按该位置判断是否从边缘开始。

edgeGestureStartLimitPx
},
onHorizontalDrag = { _, dragAmount ->
if (gestureEligible && !gestureHandled) {
totalDragPx += dragAmount
val shouldToggle =
if (isTabletSidebarExpanded) {
totalDragPx <=
-sidebarSwipeThresholdPx
} else {
totalDragPx >=
sidebarSwipeThresholdPx
}
if (shouldToggle) {
gestureHandled = true
onToggleSidebar()
}
}
},
onDragEnd = {
totalDragPx = 0f
gestureEligible = false
gestureHandled = false
},
onDragCancel = {
totalDragPx = 0f
gestureEligible = false
gestureHandled = false
}
)
}
.waterGlass(
enabled = drawerAppearance.waterGlassEnabled,
shape = MaterialTheme.shapes.medium,
Expand Down