Провел некоторое исследование и смог заставить его работать со следующим кодом:
const AppNavigator = createStackNavigator({
Home: {
screen: Home
},
Page2: {
screen: Page2
}
},
{
initialRouteName: "Home",
headerMode: "none",
defaultNavigationOptions: {
gesturesEnabled: false
},
transitionConfig: () => ({
transitionSpec: {
duration: 1400,
easing: Easing.out(Easing.poly(4)),
timing: Animated.timing,
},
screenInterpolator: sceneProps => {
const { layout, position, scene } = sceneProps;
const { index } = scene;
const height = layout.initHeight;
const translateY = position.interpolate({
inputRange: [index - 1, index, index + 1],
outputRange: [height, 0, -height],
});
const opacity = position.interpolate({
inputRange: [index - 1, index - 0.99, index],
outputRange: [0, 1, 1],
});
return { opacity, transform: [{ translateY }] };
},
}),
});
Самым сложным было понимание интерполяции, поскольку кажется, что существует много, казалось бы, произвольных значений. Я не нашел документацию самой лучшей, однако смог придумать следующее понимание:
Взять, например, приведенный ниже код. Здесь в первую очередь задается тип перевода, который в данном случае равен translateY
const translateY = position.interpolate({
inputRange: [index - 1, index, index + 1],
outputRange: [height, 0, -height],
});
Следующая запутанная часть - это диапазоны ввода и вывода, что означают эти числа? Ну, входной диапазон фактически соответствует выходному диапазону. Выглядит примерно так:
inputRange: [newScreen, currentScreen, previousScreen]
В inputRange мы указываем, какие экраны мы хотим анимировать, затем в выходном диапазоне мы указываем, что мы хотим делать с этими экранами. Изменение outputRange[0]
приведет к изменению нового экрана и т. Д.
Поскольку мы уже установили тип перевода на translateY
, мы знаем, что экран перемещается вверх или вниз.
outputRange: [height, 0, -height]
Этотеперь говорим новому экрану переместиться вверх в верхнюю часть экрана и старому экрану также переместиться вверх, за верхнюю часть экрана (отсюда -height, которая будет равна -100vh в CSS).