Reactjs 使用React导航设置离开屏幕的动画
我正在开发一个React本机应用程序,它使用 管理屏幕之间的路由 我知道在Egghead.io(强烈建议)上阅读和观看可以为通过Reactjs 使用React导航设置离开屏幕的动画,reactjs,react-native,react-navigation,Reactjs,React Native,React Navigation,我正在开发一个React本机应用程序,它使用 管理屏幕之间的路由 我知道在Egghead.io(强烈建议)上阅读和观看可以为通过transitionConfig属性到StackNavigator的屏幕之间的转换定义自定义动画 例如,以下代码定义了一个从左开始的幻灯片动画,它基本上是iOS默认推送动画的镜像: const TransitionConfig = () => ({ screenInterpolator: ({ layout, position, scene }) =>
transitionConfig
属性到StackNavigator
的屏幕之间的转换定义自定义动画
例如,以下代码定义了一个从左开始的幻灯片动画,它基本上是iOS默认推送动画的镜像:
const TransitionConfig = () => ({
screenInterpolator: ({ layout, position, scene }) => {
const { index } = scene
const { initWidth } = layout
const translateX = position.interpolate({
inputRange: [index - 1, index, index + 1],
outputRange: [-initWidth, 0, 0],
})
return {
transform: [{ translateX }],
}
}
})
const MyNavigator = createStackNavigator(
{
A: {screen: ScreenA},
B: {screen: ScreenB},
},
{ transitionConfig: TransitionConfig }
)
考虑到上面的代码,以及我们正在从屏幕A
导航到屏幕B
的事实,screenInterpolator
函数体基本上描述了屏幕B
在出现时应该跟随的动画(当它消失时会恢复)。在本例中,代码表示沿X轴平移屏幕B
,以实现滑动效果
是否也可以为正在消失的屏幕定义动画(在本例中,屏幕A
)?我想定义如下:
应出现从左向右滑动B
应该消失从上到下滑动A
- 我自己找到了答案,希望将来能帮助别人
我错误地认为
screenprointerpolator
只描述了屏幕B
的行为,因为它实际上描述了A
和B
的动画。或者更好的是,它是带有inputRange
和outputRange
的interpolate
函数,允许您描述进入(B
)和离开(A
)屏幕的动画
让我们更仔细地看一下这个片段,请记住,interpolate
函数只是在inputRange
和outputRange
的值之间创建1-1关联(更深入的解释)
假设:
和B
是屏幕A
- 我们正在从
导航到A
B
width(B)=width(A)=320
宽度(设备屏幕)=320
initWidth=320
表示将要显示的屏幕(屏幕index-1
),它被映射到B
。这样我们就可以说,它将要出现的屏幕(screen-initWidth
)应该是X平移的(相对于视口),其值等于它的宽度。因此,它将从B
(即屏幕外)启动动画X=320
表示将要出现但一旦出现的屏幕(仍然是屏幕索引
)。将其映射到B
我们的意思是,屏幕0
一旦出现,就应该位于B
X=0
表示屏幕一旦消失。这就是它导致我出错的原因。起初,我以为这是一个静止的屏幕index+1
,但就在这时,它会因为像B
这样的导航而消失。然而,从我们B->C
的角度来看,屏幕A->B
将要消失!所以这两种思路都是正确的,都是从不同的角度看问题。因此,将A
映射到index+1
我们是说,当屏幕0
将消失时(即A
将出现时),它应该保持在B
X=0
索引+1 0
(没有翻译,因此屏幕A
没有动画),因此屏幕A
仍保持原样
如果我们将index+1
的关联更改为index+1-initWidth
,那么屏幕A
也将被翻译,并因此设置动画:)
非常感谢。终于找到了我需要的东西。嘿@toioski,你知道如何在
“react navigation stack”:“2.0.14”,
中做同样的事情吗?自从更新后,界面已经改变了,我不知道如何做与您相同的事情did@VladyslavZavalykhatko嗨,你把它移植到导航v5了吗?@Oleksii是的,但是很久以前,sorry@VladyslavZavalykhatko找到它,需要更努力地搜索:\
const { index } = scene
const translateX = position.interpolate({
inputRange: [index - 1, index, index + 1],
outputRange: [-initWidth, 0, 0],
})
const translateX = position.interpolate({
inputRange: [index - 1, index, index + 1],
outputRange: [initWidth, 0, -initWidth],
})