From 7b5ad64fea673cb1ebaa6fbb884770a67b047b3e Mon Sep 17 00:00:00 2001 From: dongliang Date: Thu, 7 May 2026 17:42:00 +0930 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=BB=E5=8A=A1=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=8A=A0=E6=BB=91=E5=8A=A8=E5=8A=A8=E7=94=BB=20+=20=E4=B8=A5?= =?UTF-8?q?=E6=A0=BC=E6=89=8B=E5=8A=BF=E9=98=B2=E8=AF=AF=E8=A7=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 手势判断从 dx>dy 改为 dx>dy*2 且 dx>80px,斜滑不再误触 2. 切换任务时内容滑出+滑入动画(120ms出+150ms入),有明确感知 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../xiaoqu/watch/ui/task/TaskListFragment.kt | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/xiaoqu/watch/ui/task/TaskListFragment.kt b/app/src/main/java/com/xiaoqu/watch/ui/task/TaskListFragment.kt index 54276a5..d8b79ab 100644 --- a/app/src/main/java/com/xiaoqu/watch/ui/task/TaskListFragment.kt +++ b/app/src/main/java/com/xiaoqu/watch/ui/task/TaskListFragment.kt @@ -92,19 +92,17 @@ class TaskListFragment : BaseFragment() { findNavController().popBackStack() } - // 左右滑手势(切换任务),上下滑留给内容滚动 + // 左右滑手势(切换任务),严格区分水平/垂直防误触 gestureDetector = GestureDetector(requireContext(), object : GestureDetector.SimpleOnGestureListener() { override fun onFling(e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { if (e1 == null) return false val dy = e2.y - e1.y val dx = e2.x - e1.x - // 水平滑动且幅度 > 垂直 - if (abs(dx) > abs(dy) && abs(dx) > 50) { + // 水平幅度必须 > 垂直的 2 倍,且 > 80px,防止斜滑误触 + if (abs(dx) > abs(dy) * 2 && abs(dx) > 80) { if (dx < 0) { - // 左滑 → 下一个任务 nextTask() } else { - // 右滑 → 上一个任务 prevTask() } return true @@ -212,22 +210,46 @@ class TaskListFragment : BaseFragment() { // ===== 左右滑切换 ===== - /** 下一个任务(左滑) */ + /** 下一个任务(左滑,内容从右滑入) */ private fun nextTask() { if (taskIndex < taskList.size - 1) { taskIndex++ - fetchCurrentDetail() + animateSwitch(fromRight = true) } } - /** 上一个任务(右滑) */ + /** 上一个任务(右滑,内容从左滑入) */ private fun prevTask() { if (taskIndex > 0) { taskIndex-- - fetchCurrentDetail() + animateSwitch(fromRight = false) } } + /** 切换任务时的滑入动画 */ + private fun animateSwitch(fromRight: Boolean) { + val content = binding.scrollView + val screenWidth = content.width.toFloat() + // 旧内容滑出 + val slideOut = if (fromRight) -screenWidth else screenWidth + content.animate() + .translationX(slideOut) + .alpha(0f) + .setDuration(120) + .withEndAction { + // 加载新数据 + fetchCurrentDetail() + // 新内容从另一边滑入 + content.translationX = if (fromRight) screenWidth else -screenWidth + content.animate() + .translationX(0f) + .alpha(1f) + .setDuration(150) + .start() + } + .start() + } + // ===== UI 显示 ===== /**