Průvodci · 03

Komponenty Animated

Renderujte běžné prvky, které se pohybují k cíli, reagují na gesta a elegantně odcházejí.

Animated.<tag>

Animated.div, Animated.button, Animated.svg a každý další tag HTML nebo SVG renderují běžný prvek bez obalu. Jejich style přijímá hodnoty a transformace mohou být pole jako v React Native.

Konečný pohyb transform a opacity na těchto prvcích, včetně pružin, může přehrávat prohlížeč.

Příprava příkladu…

seed, pose, poses a tempo

seed je první snímek, pose aktuální cíl (objekt nebo název položky v poses) a tempo timing nebo pružina. Samotná změna tempo znovu nepřehraje nezměněný cíl.

onRest se spustí, když prvek dorazí.

Card.jsx
<Animated.article
  seed={{ opacity: 0, transform: [{ translateY: 16 }] }}
  pose={selected ? 'raised' : 'rest'}
  poses={{
    rest: { opacity: 1, transform: [{ translateY: 0 }, { scale: 1 }] },
    raised: { opacity: 1, transform: [{ translateY: -8 }, { scale: 1.04 }] },
  }}
  tempo={{ spring: { stiffness: 300, damping: 26 } }}
  onRest={() => console.log('arrived')}
/>;

Reakce na gesta

respond mapuje gesta na dočasné cíle: hover, focus, focusWithin, press, longPress, drag, inView a další. Když reakce skončí, prvek se vrátí do své pózy z místa, kde právě je.

onResponse hlásí začátek a konec každé reakce a respond={{ press: {} }} sleduje gesto, aniž by cokoli vizuálně měnil.

Příprava příkladu…

Sdílení výchozích hodnot přes Animated.Scope

Animated.Scope předá název pózy, tempo a výchozí nastavení animace prvkům Animated uvnitř.

Menu.jsx
<Animated.Scope tempo={{ spring: { stiffness: 380, damping: 30 } }}>
  <Animated.li pose={{ opacity: 1 }} />
  <Animated.li pose={{ opacity: 1 }} />
</Animated.Scope>;

Vaše vlastní komponenty

Animated.wrap(Component) — v React Native createAnimatedComponent — umožní komponentě, která předává ref a odpovídá jednomu prvku DOM, přijímat stejné props.

Link.jsx
import { forwardRef } from 'react';
import { Animated } from '@kkwaenggwari/animated';

const Link = forwardRef((props, ref) => <a ref={ref} {...props} />);
const AnimatedLink = Animated.wrap(Link);

<AnimatedLink href="/pricing" respond={{ hover: { transform: [{ translateX: 4 }] } }} />;

Hledat

Pište a hledejte v dokumentaci.