指南 · 04
输入与手势
把指针、拖拽、滚动等输入写入值,并让其他值追随它们。
input(target, adapter)
输入适配器把浏览器事件转换为对值的写入。input(ref, adapter) 把它作为控制器挂载;在 useAnimated 中声明时,会在卸载或依赖变化时被移除。
适配器:dragInput、pinchInput、moveInput、scrollInput、wheelInput、viewportInput、mediaInput、longPressInput 和 swipeInput。
正在准备示例…
带边界的拖拽与松手后的动效
dragInput 支持指针和方向键拖拽、带 elastic 阻力的 bounds、松手后的 momentum,以及根据预测位置选择停靠点的 settle 函数。
在触摸屏上,它会在挂载期间设置目标的 touch-action,防止浏览器把手势当作滚动。你自己设置的值优先。
正在准备示例…
捏合、视口与媒体查询
input 的第三个参数(可选)会收到每个响应事件,所以适配器也可以在边沿上启动动效。
const card = useRef(null);
const pinch = useAnimated(
{ scale: 1, rotation: 0 },
(value) => {
input(card, pinchInput({ scale: value.scale, rotation: value.rotation, minScale: 0.5 }));
},
[],
);
const reveal = useAnimated(
0,
(value) => {
input(card, viewportInput({ once: true }), (event) => {
if (event.phase === 'in') spring(value, { toValue: 1 }).start();
});
},
[],
);Animated.event
React Native 的事件映射可以用在 DOM 事件上。在滚动事件中,nativeEvent.contentOffset、contentSize 和 layoutMeasurement 从被滚动的元素读取,所以 ScrollView 的映射可以原样移植。
const scrollY = useAnimatedValue(0);
<div onScroll={Animated.event([{ nativeEvent: { contentOffset: { y: scrollY } } }])} />;