You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PanGestureHandler异常:从下往上滑动先重置底部再执行动画

修复通知栏手柄向上拖动的跳变问题

我之前做类似的手势动画时也碰到过这个问题,你的核心问题出在手势开始时的位置重置逻辑上——当前代码在手势启动(State.BEGAN)时直接把位置拉到finalDragY(也就是底部位置),导致向上拖动的瞬间会先跳回底部,再执行动画。我们需要调整状态切换时的位置处理逻辑,让手势启动时保留当前位置作为动画起始点,再根据拖动方向计算目标位置。

修正后的代码

const translateY = cond(
  eq(gestureState, State.END),
  [
    // 根据拖动方向和速度,计算动画目标位置
    cond(
      greaterThan(dragY, 0),
      // 向下拖动结束,动画到底部(400)
      set(dragY, runTiming(clockY, dragY, velocityY, 400, gestureState, () => { console.log('动画到底部完成'); })),
      // 向上拖动结束,动画到顶部(0)
      set(dragY, runTiming(clockY, dragY, velocityY, 0, gestureState, () => { console.log('动画到顶部完成'); })),
    ),
    set(offsetY, dragY),
    dragY,
  ],
  cond(
    eq(gestureState, State.BEGAN),
    [
      stopClock(clockY), // 停止之前的动画,避免冲突
      dragY, // 保留当前位置作为新手势的起始点,不再强制重置
    ],
    // 手势进行中,使用实时拖动的位置
    finalDragY,
  ),
);

关键改动说明

  1. 移除State.BEGAN时的强制位置重置:原来的代码在手势开始时直接返回finalDragY,现在改为返回当前的dragY,这样向上拖动时不会突然跳回底部,而是从当前位置开始响应手势。
  2. 明确动画目标的判断逻辑:在State.END分支里,通过dragY的正负判断拖动方向,分别设置顶部(0)和底部(400)的目标位置,确保动画方向和拖动意图匹配。
  3. 及时停止旧动画:在手势开始时调用stopClock(clockY),避免之前未完成的动画和新手势的运动逻辑冲突,保证手势响应的流畅性。

你可以试试这个调整后的逻辑,应该能解决向上拖动时的跳变问题,让动画效果和iOS/Android通知栏的交互一致。

内容的提问来源于stack exchange,提问作者shet_tayyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:57:38