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, ), );
关键改动说明
- 移除
State.BEGAN时的强制位置重置:原来的代码在手势开始时直接返回finalDragY,现在改为返回当前的dragY,这样向上拖动时不会突然跳回底部,而是从当前位置开始响应手势。 - 明确动画目标的判断逻辑:在
State.END分支里,通过dragY的正负判断拖动方向,分别设置顶部(0)和底部(400)的目标位置,确保动画方向和拖动意图匹配。 - 及时停止旧动画:在手势开始时调用
stopClock(clockY),避免之前未完成的动画和新手势的运动逻辑冲突,保证手势响应的流畅性。
你可以试试这个调整后的逻辑,应该能解决向上拖动时的跳变问题,让动画效果和iOS/Android通知栏的交互一致。
内容的提问来源于stack exchange,提问作者shet_tayyy
相关产品推荐
相关产品推荐

