#react-native-reanimated #react-native-gesture-handler
#react-native-реанимирован #react-native-gesture-handler
Вопрос:
Я использую react-native-gesture-handler
библиотеку с reanimated
и react-native-redash
. Я хочу сделать ScrollView прокручиваемым, который вложен внутри panGestureHandler, но все взаимодействия обрабатываются panGestureHandler
, поэтому ScrollView не работает. Вот мой код.
VideoModal.js
файл
import Animated , {useCode , cond , eq , set , add, block, interpolate, Extrapolate} from "react-native-reanimated"
import {PanGestureHandler , State } from "react-native-gesture-handler"
import {usePanGestureHandler , useValue , timing , snapPoint} from "react-native-redash/lib/module/v1"
export default function VideoModal(props) {
const { video } = props;
const {gestureHandler , velocity , translation , state} = usePanGestureHandler()
const translateY = useValue(0)
const offsetY = useValue(0);
const snapPoints = snapPoint(translateY , velocity.y , [0 ,upperBound])
useCode(()=>block([
cond(
eq(state , State.ACTIVE),
[
set(translateY , add(offsetY , translation.y))
]
),
cond(
eq(state , State.END),
[
set(translateY , timing({from:translateY , to:snapPoints, duration:350})),
set(offsetY , translateY)
]
)
]))
return (
<>
<View
style={{
height: statusBarHeight,
backgroundColor: 'black',
}}
/>
<PanGestureHandler {...gestureHandler} >
<Animated.View
style={{
...shadow,
transform:[{translateY:translateY}],
zIndex:10
}}
>
<TouchableWithoutFeedback onPress={()=>alert('Working'}>
<View style={{ backgroundColor: 'white', width }}>
<View style={{ ...StyleSheet.absoluteFillObject }}>
<PlayerControls title={video.title} onPress={() => alert('abc')} />
</View>
<AnimatedVideo
source={video.video}
style={{ width, height:videoContent }}
resizeMode={Video.RESIZE_MODE_COVER}
shouldPlay
/>
</View>
</TouchableWithoutFeedback>
<Animated.View style={{ backgroundColor: 'white', width:contentWidth, height:contentHeight }}>
<Animated.View style={{opacity:contentOpacity}}>
**<VideoContent {...{ video }} />**
</Animated.View>
</Animated.View>
</Animated.View>
</PanGestureHandler>
</>
);
}
scrollView
находится внутри видеоконтента
import {
View, StyleSheet, Text, Image, ScrollView,
} from 'react-native';
экспорт видеоконтента функции по умолчанию (реквизит) {
const { video } = props;
return (
<ScrollView>
<View style={styles.upNext}>
<Text style={styles.upNextTitle}>Up next</Text>
{
videos.map(v => (
<View key={v.id} style={styles.thumbnail}>
<Image source={v.thumbnail} style={styles.thumbnailImage} />
<View style={styles.thumbnailContent}>
<Text numberOfLines={2} style={styles.thumbnailTitle}>{v.title}</Text>
<Text style={styles.thumbnailUsername}>{v.username}</Text>
</View>
</View>
))
}
</View>
</ScrollView>
);
}
Могу ли я в любом случае указать, чтобы pangesture работал, только если палец помещен в верхнюю часть экрана, иначе он не должен работать, и я могу прокручивать содержимое, присутствующее внутри scrollview??
Ответ №1:
Эй, я знаю, что немного поздно отвечать на ваш ответ, но я также столкнулся с аналогичной проблемой, небольшое исследование не смогло мне найти этот трюк
activeOffsetX={[-10, 10]}
в вашем pangestureHandler вот так
<PanGestureHandler
onGestureEvent={onGestureEvent}
activeOffsetX={[-10, 10]}
onHandlerStateChange={evt =>handleStateChange(evt)}
>
источник : https://www.gitmemory.com/issue/software-mansion/react-native-gesture-handler/1380/786721032
Надеюсь, это поможет
Комментарии:
1. это работает также для pangesturehandler внутри scrollview, если вы хотите отключить обработчик при прокрутке по вертикали, чтобы вместо этого использовать scrollview, спасибо! решил мою проблему, некоторое время искал это исправление!