React Native Drawer レイアウト
react-native-gesture-handler
とreact-native-reanimated
を使用して実装された、React Native向けのクロスプラットフォームドロワーコンポーネントです。
このパッケージはReact Navigationと統合されていません。ドロワーレイアウトをReact Navigationのナビゲーションシステムと統合したい場合(例:ドロワーに画面を表示し、navigation.navigate
などを使用して画面間を移動したい場合)、代わりにDrawer Navigatorを使用してください。
インストール
このパッケージを使用するには、プロジェクトルートでターミナルを開き、以下のコマンドを実行します。
- npm
- Yarn
- pnpm
npm install react-native-drawer-layout
yarn add react-native-drawer-layout
pnpm add react-native-drawer-layout
次に、ドロワーに必要なライブラリをインストールして設定する必要があります。
-
まず、
react-native-gesture-handler
とreact-native-reanimated
をインストールします。Expoマネージドプロジェクトを使用している場合は、プロジェクトディレクトリで以下のコマンドを実行します。
npx expo install react-native-gesture-handler react-native-reanimated
ベアReact Nativeプロジェクトを使用している場合は、プロジェクトディレクトリで以下のコマンドを実行します。
- npm
- Yarn
- pnpm
npm install react-native-gesture-handler react-native-reanimated
yarn add react-native-gesture-handler react-native-reanimated
pnpm add react-native-gesture-handler react-native-reanimated
ドロワーはReanimated 1と最新のReanimatedの両方をサポートしています。最新のReanimatedを使用する場合は、インストールガイドに従って設定してください。
-
react-native-gesture-handler
のインストールを完了するには、index.js
やApp.js
などのエントリファイルの先頭(必ず先頭で、他のコードがない状態)に以下のコードを追加します。import 'react-native-gesture-handler';
警告AndroidまたはiOS向けにビルドする場合は、この手順をスキップしないでください。スキップすると、開発中は正常に動作しても、本番環境でアプリがクラッシュする可能性があります。これは他のプラットフォームには適用されません。
-
MacでiOS向けに開発している場合は、Cocoapodsを使用してpodをインストールしてリンクを完了する必要があります。
npx pod-install ios
完了しました!これで、デバイス/シミュレーターでアプリをビルドして実行できます。
クイックスタート
import * as React from 'react';
import { Button, Text } from 'react-native';
import { Drawer } from 'react-native-drawer-layout';
export default function DrawerExample() {
const [open, setOpen] = React.useState(false);
return (
<Drawer
open={open}
onOpen={() => setOpen(true)}
onClose={() => setOpen(false)}
renderDrawerContent={() => {
return <Text>Drawer content</Text>;
}}
>
<Button
onPress={() => setOpen((prevOpen) => !prevOpen)}
title={`${open ? 'Close' : 'Open'} drawer`}
/>
</Drawer>
);
}
APIリファレンス
このパッケージは、ドロワーのレンダリングに使用できるDrawer
コンポーネントをエクスポートします。
Drawer
アニメーションとジェスチャーを伴うドロワーをレンダリングするコンポーネントです。
Drawer プロパティ
open
ドロワーが開いているかどうか。
onOpen
ドロワーが開かれたときに呼び出されるコールバック。
onClose
ドロワーが閉じられたときに呼び出されるコールバック。
renderDrawerContent
ドロワーの内容としてレンダリングするReact要素を返すコールバック。
layout
コンテナのレイアウトを含むオブジェクト。アプリケーションウィンドウのサイズにデフォルト設定されます。
drawerPosition
画面上のドロワーの位置。RTLモードではright
、それ以外の場合はleft
にデフォルト設定されます。
drawerType
ドロワーの種類。ドロワーの外観とアニメーションを決定します。
front
: 画面を覆い、背後にオーバーレイを表示する従来のドロワー。back
: スワイプすると、画面の背後にドロワーが表示されます。slide
: スワイプすると、画面とドロワーの両方がスライドしてドロワーが表示されます。permanent
: サイドバーとして常に表示されるドロワー。
iOSではslide
、その他のプラットフォームではfront
にデフォルト設定されます。
drawerStyle
ドロワーのスタイルオブジェクト。ドロワーのカスタム背景色やカスタム幅を渡すことができます。
overlayStyle
オーバーレイのスタイルオブジェクト。
hideStatusBarOnOpen
ドロワーが開いているときにステータスバーを非表示にするかどうか。デフォルトはfalse
。
keyboardDismissMode
ドロワーが開いているときにキーボードを閉じるかどうか。サポートされている値は
none
: ドロワーが開いてもキーボードは閉じません。on-drag
: スワイプジェスチャーでドロワーが開かれたときにキーボードが閉じます。
デフォルトはon-drag
。
statusBarAnimation
ステータスバーを非表示にする際に使用するアニメーション。サポートされている値は
slide
: ステータスバーがスライドして非表示になります。fade
: ステータスバーがフェードアウトして非表示になります。none
: ステータスバーはアニメーションしません。
hideStatusBarOnOpen
と組み合わせて使用します。
swipeEnabled
ドロワーを開くためのスワイプジェスチャーを有効にするかどうか。デフォルトはtrue
。
スワイプジェスチャーはiOSとAndroidでのみサポートされています。
swipeEdgeWidth
スワイプジェスチャーを有効にする画面端からの距離。デフォルトは32
。
これはiOSとAndroidでのみサポートされています。
swipeMinDistance
ドロワーを開くために必要な最小スワイプ距離。デフォルトは60
。
これはiOSとAndroidでのみサポートされています。
swipeMinVelocity
ドロワーを開くために必要な最小スワイプ速度。デフォルトは500
。
これはiOSとAndroidでのみサポートされています。
gestureHandlerProps
基盤となるパンジェスチャーハンドラーに渡すプロパティ。
これはiOSとAndroidでのみサポートされています。
children
ドロワーがラップするコンテンツ。
useDrawerProgress
useDrawerProgress
フックは、ドロワーの進捗状況を表すReanimated SharedValue(最新の使用方法)またはReanimated Node(従来の使用方法)を返します。これを使用して、画面のコンテンツをアニメーション化できます。
最新の使用方法の例
import { Animated } from 'react-native-reanimated';
import { useDrawerProgress } from 'react-native-drawer-layout';
// ...
function MyComponent() {
const progress = useDrawerProgress();
const animatedStyle = useAnimatedStyle(() => {
return {
transform: [
{
translateX: interpolate(progress, [0, 1], [-100, 0]),
},
],
};
});
return <Animated.View style={animatedStyle}>{/* ... */}</Animated.View>;
}
従来の使用方法の例
import { Animated } from 'react-native-reanimated';
import { useDrawerProgress } from 'react-native-drawer-layout';
// ...
function MyComponent() {
const progress = useDrawerProgress();
// If you are on react-native-reanimated 1.x, use `Animated.interpolate` instead of `Animated.interpolateNode`
const translateX = Animated.interpolateNode(progress, {
inputRange: [0, 1],
outputRange: [-100, 0],
});
return (
<Animated.View style={{ transform: [{ translateX }] }}>
{/* ... */}
</Animated.View>
);
}
クラスコンポーネントを使用している場合は、DrawerProgressContext
を使用して進捗値を取得できます。
import { DrawerProgressContext } from 'react-native-drawer-layout';
// ...
class MyComponent extends React.Component {
static contextType = DrawerProgressContext;
render() {
const progress = this.context;
// ...
}
}