ガイド · 02
Web と React Native
両方のプラットフォームで import はひとつ。Metro はネイティブの実装を、Web のバンドラーは DOM の実装を選びます。
同じ import
パッケージをひとつインストールし、どちらのプラットフォームでもそのルートから import します。必須の peer は React だけで、React Native はネイティブアプリ向けの任意の peer です。どちらのプラットフォームでも、Provider、ラッパー、初期化の呼び出しは要りません。
// Web and React Native: the same import.
import { MotionNumber, MotionList } from '@kkwaenggwari/animated-chorus';
export function Score({ points, players }) {
return (
<>
<MotionNumber value={points} />
<MotionList items={players} renderItem={(player) => player.name} />
</>
);
}モーションの再生方法
Web では、解析的にサンプリングしたスプリングを Web Animations API で再生するので、読み込むアニメーションライブラリーも、フレームごとの React レンダリングもありません。React Native では、transform と opacity にネイティブドライバーを使う Animated で動き、レイアウト(幅や高さ)が変わるところだけ JS ドライバーを使います。
| 要素 | Web | React Native |
|---|---|---|
| transform と opacity | Web Animations API | Animated、ネイティブドライバー |
| 幅と高さ | Web Animations API | Animated、JS ドライバー |
| ストリーミングテキスト | 文字がフェードイン、React のレンダリングは 1 秒に数回 | 本物の Text、フェードなし |
| シートとズーム | トップレイヤーのネイティブ dialog | 透明な Modal |
| バックグラウンド | 非表示のタブでは、ストリーミングテキストを一度に表示 | モーションは終了状態に落ち着く |
React Native ならではの点
API は同じです。ここに挙げるのは、デバイス上で気づく違いです。
- 数字とストリーミングテキストは本物の
Textのままなので、選択、折り返し、numberOfLines、アクセシビリティはいつもどおりに動きます。 MotionSheetとMotionZoomは透明なModalの中に描画され、戻るボタンで閉じます。- シートの内側の
ScrollViewは自分のジェスチャーを保ちます。シートはハンドルとスクロールしない部分からドラッグします。 MotionHoldは、アクセシビリティの activate アクションで直接確定します。- インラインの
MotionSwapは新しい中身を 1 行として計測します。折り返す中身にはinline=—を使ってください。
import { Text, View } from 'react-native';
import { MotionNumber, MotionSheet } from '@kkwaenggwari/animated-chorus';
export function Wallet({ balance, open, setOpen }) {
return (
<View>
<MotionNumber
value={balance}
intl
locale="en-US"
format={{ style: 'currency', currency: 'USD' }}
/>
<MotionSheet open={open} onOpenChange={setOpen} detents={[0.5, 0.9]}>
<Text>Recent activity</Text>
</MotionSheet>
</View>
);
}レイアウトはあなたのもの
コンポーネントはプラットフォーム本来のレイアウトを保ちます。文字のメトリクス、折り返し、フォントの拡大、親の制約、そしてあなたのスタイル。モーションのために、文字幅の固定、テキストの高さの固定、クリッピングマスクをテキストに押し付けることはありません。
どこで何を検証しているか
Web での動作は実際のブラウザーで検証しています。React Native での動作は、共有モデルのテストとモックのレンダラーでカバーしているので、リリース前に対象のデバイスでジェスチャーとレイアウトを確認してください。