2

FlatListを使用しているときにスワイプすると、表示可能なアイテムをコンソールログに記録できますが、ビデオの一時停止をどのように管理できるか疑問に思っていました。または、そうするより良い方法がある場合は?

これは RenderItem 関数コンポーネントです

const RenderItem = (props) => {
  const [paused, setPaused] = useState(true);

  const togglePlay = () => setPaused(prev => !prev);

  return (
    <View>
      {props.is_video ? (
        <>
          <Video
            paused={paused}
            repeat
            source={{uri: props.mediaUrl}}
          />
          <TouchableWithoutFeedback onPress={togglePlay}>
            <View>
                {paused ? <Icon
                size={180}
                name="play"
                type="FontAwesome"
                style={{opacity: 0.7, color: '#cccccc'}}
              /> : null}
            </View>
          </TouchableWithoutFeedback>
        </>
      ) : (
        <Image source={{uri: props.mediaUrl}} />
      )}
    </View>
  );
};

次に、別の関数で、これがあります:

const Post = (props) => {

  const onViewRef = useRef((viewableItems)=> {console.log(viewableItems)});
  const viewConfigRef = useRef({ viewAreaCoveragePercentThreshold: 50 });

  return (
    <View style={{flex: 1}}>
      <View>
        <FlatList
          onViewableItemsChanged={onViewRef.current}
          viewabilityConfig={viewConfigRef.current}
          data={props.navigation.state.params.media}
          snapToAlignment={'center'}
          horizontal
          decelerationRate={'fast'}
          pagingEnabled
          renderItem={({item}) => <RenderItem {...item} />}
          keyExtractor={item => item.mediaUrl}
        />
      </View>
    </View>
  );
};

ビデオを押すと、再生または一時停止できます。今スワイプしているとき、ビデオは引き続き再生されます。スワイプすると、再生中のビデオが一時停止されるようにしたいと考えています。

4

1 に答える 1

2

一時停止/再生状態を親コンポーネントに持ち上げることができます ( Post)。いつでも最大 1 つのビデオを再生する必要があるため、状態mediaUrlは現在再生中のアイテム ID (またはそれをキー/ID として使用している場合) を単純に格納できます。

RenderItem

<Video paused={props.paused} ... />
<TouchableWithoutFeedback onPress={props.onTogglePlay}>

で(匿名関数にPost使用できます):useCallback

const [activeVideo, setActiveVideo] = useState(null);
...
<FlatList onViewableItemsChanged={() => setActiveVideo(null)} .../>
...
<RenderItem 
  paused={activeVideo !== item.mediaUrl} 
  onTogglePlay={() =>
    setActiveVideo(item.mediaUrl === activeVideo ? null : item.mediaUrl)
  }
  {...item}
/>

参照をアクティブなビデオに保存し、その参照を介してビデオを一時停止することもできます。

于 2020-01-19T01:35:38.963 に答える