組件 DrawerLayout - react-native-gesture-handler

文檔來源:

這是一個替代RN中 DrawerLayoutAndroid 的跨平臺組件

使用 (usage)

import DrawerLayout from 'react-native-gesture-handler/DrawerLayout';

屬性 (Properties)

  • drawerType: 'front' | 'back' | 'slide', 默認值 front. 3種不同的效果
  • edgeWidth: {number} 允許定義手勢應該激活的內容視圖邊緣的距離
  • hideStatusBar: {boolean} 打開drawer時是否隱藏狀態(tài)欄
  • statusBarAnimation'slide' | 'none' | 'fade',默認值 slide. 當 hideStatusBar設置為true時使用
  • overlayColor:遮罩背景色暑脆,默認是 black,顏色值需要是一個不包含alpha透明度的值,因為Drawer自身默認透明度從0%動畫到70%
  • renderNavigationView: {function} 必需參數。這個函數接受一個 Animated Value 作為參數妖泄,用于顯示打開或關閉drawer動畫過程(當關閉時碗淌,progress為0癞志;當打開時锣笨,progress為1). 這個可用于 drawer組件在打開或關閉時給其children添加動畫效果
  • children: {Component | function} 默認是組件,直接被drawer包裹菲驴。也可以是一個函數荐吵,這個函數接受一個 Animated Value 作為參數,用于顯示打開或關閉drawer動畫過程(當關閉時,progress為0先煎;當打開時贼涩,progress為1),這個和上面的 renderNavigationView一樣

另外薯蝎,其余的屬性請參考 DrawerLayoutAndroid

示例

DrawerLayout 在RN應用中還是很常見的一種模式遥倦,這個例子基本上就是Drawer常見的使用方式

import React, { PureComponent } from 'react';
import { Platform, StyleSheet, Text, Animated, View, TextInput, Dimensions, SafeAreaView } from 'react-native';

import { RectButton } from 'react-native-gesture-handler';
import DrawerLayout from 'react-native-gesture-handler/DrawerLayout';

const TYPES = ['front', 'back', 'back', 'slide'];
const PARALLAX = [false, false, true, false];

const {width: DEVICE_WIDTH} = Dimensions.get('window');

const styles = StyleSheet.create({
  container: {
    flex: 1,
  },
  page: {
    ...StyleSheet.absoluteFillObject,
    alignItems: 'center',
    paddingTop: 40,
    backgroundColor: 'gray',
  },
  pageText: {
    fontSize: 21,
    color: 'white',
  },
  rectButton: {
    height: 60,
    padding: 10,
    alignSelf: 'stretch',
    alignItems: 'center',
    justifyContent: 'center',
    marginTop: 20,
    backgroundColor: 'white',
  },
  rectButtonText: {
    backgroundColor: 'transparent',
  },
  drawerContainer: {
    flex: 1,
    paddingTop: 30,
  },
  pageInput: {
    height: 60,
    padding: 10,
    alignSelf: 'stretch',
    alignItems: 'center',
    justifyContent: 'center',
    marginTop: 20,
    backgroundColor: '#eee',
  },
  drawerText: {
    margin: 10,
    fontSize: 15,
    textAlign: 'left',
  },
});

// 被DrawerLayout包裹的頁面
const Page = ({
  fromLeft, // 是否在左邊打開Drawer
  type,
  parallaxOn, // 是否使用動畫效果
  flipSide, // 切換Drawer所在位置 在左邊還是右邊
  nextType, // 切換 type 的值
  openDrawer,
}) => (
  <View style={styles.page}>
    <Text style={styles.pageText}>Hi DrawerLayout Demo</Text>
    <RectButton style={styles.rectButton} onPress={flipSide}>
      <Text>Drawer {fromLeft ? '在左邊' : '在右邊'}! -> 點擊按鈕切換</Text>
    </RectButton>
    <RectButton style={styles.rectButton} onPress={nextType}>
      <Text style={styles.rectButtonText}>
        抽屜類型 '{type}
        {parallaxOn && ' with parallax'}'! -> Next
      </Text>
    </RectButton>
    <RectButton style={styles.rectButton} onPress={openDrawer}>
      <Text style={styles.rectButtonText}>打開側邊欄</Text>
    </RectButton>
    <TextInput
      style={styles.pageInput}
      placeholder='使用拖動打開drawer時 鍵盤會自動收起'
    />
  </View>
);

export default class DrawerExample extends PureComponent {
  state = {
    fromLeft: true, // 是否在左邊
    type: 0,
  };

  // 渲染動畫效果
  // 使用 progressValue 動畫值 進行插值操作
  renderParallaxDrawer = progressValue => {
    const parallax = progressValue.interpolate({
      inputRange: [0, 1],
      outputRange: [this.state.fromLeft ? -50 : 50, 0]
    });
    const animatedStyles = {
      transform: [
        { translateX: parallax },
      ],
    };

    return (
      <Animated.View
        style={[styles.drawerContainer, animatedStyles]}
      >
        <Text style={styles.drawerText}>側邊欄抽屜</Text>
        <Text style={styles.drawerText}>
          當拖動側邊欄抽屜時,觀察parallax動畫
        </Text>
      </Animated.View>
    )
  }


  // 普通的抽屜
  renderDrawer = () => {
    return (
      <View style={styles.drawerContainer}>
        <Text style={styles.drawerText}>這就是抽屜</Text>
      </View>
    );
  }

  render() {
    const drawerType = TYPES[this.state.type]; // ['front', 'back', 'back', 'slide'];
    const parallax = PARALLAX[this.state.type]; // 是否使用renderParallaxDrawer函數 [false, false, true, false] 和上面的drawerType相互對應
    // console.log('parallax, this.state.type', parallax, this.state.type)
    const position = this.state.fromLeft ? DrawerLayout.positions.Left : DrawerLayout.positions.Right; // 抽屜所在位置
    // const position = this.state.fromLeft ? 'left' : 'right'; // 或者寫為這個樣子也可以

    return (
      <View style={styles.container}>
        <DrawerLayout
          ref={drawer => {this.drawer = drawer}}
          drawerWidth={DEVICE_WIDTH - 50}
          drawerType={drawerType}
          keyboardDismissMode='on-drag'
          drawerPosition={position}
          drawerBackgroundColor='#4ae'
          overlayColor={drawerType === 'front' ? '#000' : '#6a1'}
          renderNavigationView={
            parallax ? this.renderParallaxDrawer : this.renderDrawer
          }
          contentContainerStyle={
            // 注意 drawerType 為 'front' 時占锯,不要添加陰影效果袒哥,如果添加可能導致Drawer打不開
            drawerType === 'front'
              ? {}
              : Platform.select({
                ios: {
                  shadowColor: '#000',
                  shadowOpacity: 0.5,
                  shadowOffset: { width: 0, height: 2 },
                  shadowRadius: 60,
                },
                android: {
                  elevation: 100,
                  backgroundColor: '#000',
                },
              })
          }
        >
          <Page
            type={drawerType}
            fromLeft={this.state.fromLeft}
            parallaxOn={parallax}
            flipSide={() => this.setState({ fromLeft: !this.state.fromLeft })}
            nextType={() =>
              this.setState({ type: (this.state.type + 1) % TYPES.length })}
            openDrawer={() => this.drawer.openDrawer()}
          />
        </DrawerLayout>
      </View>
    )
  }
}

2019年04月03日22:08:16

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市消略,隨后出現的幾起案子堡称,更是在濱河造成了極大的恐慌,老刑警劉巖艺演,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件却紧,死亡現場離奇詭異,居然都是意外死亡钞艇,警方通過查閱死者的電腦和手機啄寡,發(fā)現死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哩照,“玉大人挺物,你說我怎么就攤上這事∑。” “怎么了识藤?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長次伶。 經常有香客問我痴昧,道長,這世上最難降的妖魔是什么冠王? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任赶撰,我火速辦了婚禮,結果婚禮上柱彻,老公的妹妹穿的比我還像新娘豪娜。我一直安慰自己,他們只是感情好哟楷,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布瘤载。 她就那樣靜靜地躺著,像睡著了一般卖擅。 火紅的嫁衣襯著肌膚如雪鸣奔。 梳的紋絲不亂的頭發(fā)上墨技,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音挎狸,去河邊找鬼扣汪。 笑死,一個胖子當著我的面吹牛伟叛,可吹牛的內容都是我干的私痹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼统刮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了账千?” 一聲冷哼從身側響起侥蒙,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匀奏,沒想到半個月后鞭衩,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡娃善,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年论衍,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聚磺。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坯台,死狀恐怖,靈堂內的尸體忽然破棺而出瘫寝,到底是詐尸還是另有隱情蜒蕾,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布焕阿,位于F島的核電站咪啡,受9級特大地震影響,放射性物質發(fā)生泄漏暮屡。R本人自食惡果不足惜撤摸,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褒纲。 院中可真熱鬧准夷,春花似錦、人聲如沸外厂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汁蝶。三九已至渐扮,卻和暖如春论悴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背墓律。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工膀估, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耻讽。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓察纯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親针肥。 傳聞我的和親對象是個殘疾皇子饼记,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容

  • 發(fā)現 關注 消息 iOS 第三方庫、插件慰枕、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,093評論 4 62
  • ANavigator稍微復雜點的移動應用都會有頁面跳轉的場景具则,即用戶在頁面A上點擊某個功能,比如查看內容詳情或者幫...
    conf1234閱讀 1,461評論 0 3
  • 時間像是可以停滯一般具帮,在這近三個月博肋,幾乎沒有讓我操心的事情,懶散的放縱自己去無所事事蜂厅,終于厭倦了這種狀態(tài)匪凡,...
    背上背包就旅行21閱讀 191評論 0 0
  • 《我的兒子》 1.上午去鳥市給啁啁買飼料,順便問了鳥老板一個問題掘猿,即我對我家啁啁最近不愛唱歌表示了擔憂病游。老板說天太...
    卿大小姐閱讀 295評論 0 2
  • 1 助推和稟賦 1.1 內在的目標積極明確,外在的表現極其模糊术奖。以一種看似散漫礁遵,實際是積極的超常主動性去影響他人行...
    呆呆LI閱讀 664評論 0 50