react-navigation自定義StackNavigator頁面跳轉(zhuǎn)動(dòng)畫

2018.02.09更新:
react-navigation內(nèi)置跳轉(zhuǎn)動(dòng)畫的路徑發(fā)生了改變,由
react-navigation/src/views/CardStackStyleInterpolator 改為
react-navigation/src/views/CardStack/CardStackStyleInterpolator

---------------------------------------------- 分割線 ----------------------------------------------

使用StackNavigator跳轉(zhuǎn)頁面時(shí),react-navigation根據(jù)平臺(tái)的不同內(nèi)置了相應(yīng)的跳轉(zhuǎn)動(dòng)畫。
內(nèi)置的跳轉(zhuǎn)動(dòng)畫在react-navigation/src/views/CardStack/CardStackStyleInterpolator中,共三種。forHorizontal:從右向左進(jìn)入、forVertical:從下向上進(jìn)入、forFadeFromBottomAndroid:從底部淡出。
關(guān)于修改默認(rèn)的跳轉(zhuǎn)動(dòng)畫或者自定義動(dòng)畫效果,以下給出兩個(gè)場(chǎng)景。

修改整個(gè)棧內(nèi)的頁面跳轉(zhuǎn)動(dòng)畫

這種場(chǎng)景是,一個(gè)棧內(nèi)所有頁面的跳轉(zhuǎn)使用相同的動(dòng)畫效果,示例代碼如下:

import CardStackStyleInterpolator from 'react-navigation/src/views/CardStack/CardStackStyleInterpolator';
const CustomerNavigator = StackNavigator({
  ScreenKey: { screen: MyScreen },
  // other screens
}, {
  transitionConfig: () => {
    screenInterpolator: CardStackStyleInterpolator.forVertical,
    transitionSpec: {
      duration: 250,
      easing: Easing.bounce,
      timing: Animated.timing,
    },
  },
});

在安卓上運(yùn)行時(shí),默認(rèn)的跳轉(zhuǎn)動(dòng)畫效果是forFadeFromBottomAndroid,經(jīng)過上述配置,CustomerNavigator 內(nèi)的頁面切換時(shí),會(huì)使用forVertical效果。
transitionSpec內(nèi)可以配置與動(dòng)畫相關(guān)的屬性。

通過傳遞參數(shù)決定某頁面的跳轉(zhuǎn)動(dòng)畫

在一個(gè)StackNavigator內(nèi),可能某些頁面需要用forHorizontal的跳轉(zhuǎn)方式,另一些需要用forVertical的跳轉(zhuǎn)方式,以下是解決方案。

import CardStackStyleInterpolator from 'react-navigation/src/views/CardStack/CardStackStyleInterpolator';
const TransitionConfiguration = () => ({
  screenInterpolator: (sceneProps) => {
    const { scene } = sceneProps;
    const { route } = scene;
    const params = route.params || {};
    const transition = params.transition || 'forHorizontal';
    return CardStackStyleInterpolator[transition](sceneProps);
  },
});

const CustomerNavigator = StackNavigator({
  ScreenKey: { screen: MyScreen },
  // other screens
}, {
  transitionConfig: TransitionConfiguration,
});

假如希望CustomerNavigator內(nèi)的某個(gè)頁面使用forVertical的跳轉(zhuǎn)動(dòng)畫效果,調(diào)用this.props.navigate('SomeScreenKey', { transition: 'forVertical' });切換頁面即可。

總結(jié)

本文均使用react-navigation自帶的跳轉(zhuǎn)動(dòng)畫,因?yàn)檫@三種跳轉(zhuǎn)方式可以滿足很多需求,希望將來能內(nèi)置更豐富的效果。
react-navigation支持自定義的跳轉(zhuǎn)動(dòng)畫效果,獲取sceneProps中的layout,position,scene屬性,以及scene中的index屬性,就能完成自定義動(dòng)畫的開發(fā)。具體可以參考這篇文章的內(nèi)容。如果想對(duì)其動(dòng)畫原理有更深的了解,可以學(xué)習(xí)這篇文章。

參考資料

  1. React Native Navigation, custom Scene (Screen) Transitions and interpolations
  2. issue#1187--Add support for custom transitionConfig

博文發(fā)布在個(gè)人博客,歡迎訪問??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,781評(píng)論 25 709
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 24,705評(píng)論 8 183
  • 文/阿飛 你從哪找來? 這杯毒酒 邀我共飲,在花前月后 我明知有毒 毫不遲猶 與你共飲,在花前月后 你為何傷悲? ...
    阿飛先生閱讀 200評(píng)論 0 1
  • 死亡,這個(gè)詞對(duì)于二十幾歲正值青春年華的人來說,似乎太過遙遠(yuǎn)、陌生!不知為什么最近突然經(jīng)常會(huì)想到這個(gè)詞,每天每時(shí)每...
    我的英雄夢(mèng)想閱讀 245評(píng)論 0 1
  • 俗話說宰相肚里能撐船,大肚能容天下難容之事。說的就是做人要有有度量,心胸要寬廣。 山不言自高,水不言自深。凡事不必...
    幻曲風(fēng)閱讀 491評(píng)論 0 0

友情鏈接更多精彩內(nèi)容