指南 · 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 的第三个参数(可选)会收到每个响应事件,所以适配器也可以在边沿上启动动效。

inputs.jsx
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 的映射可以原样移植。

Header.jsx
const scrollY = useAnimatedValue(0);

<div onScroll={Animated.event([{ nativeEvent: { contentOffset: { y: scrollY } } }])} />;

搜索

输入关键词搜索文档。