gpt4 book ai didi

react-native - 不在视野范围内时暂停平面列表中的视频

转载 作者:行者123 更新时间:2023-12-04 03:58:06 24 4
gpt4 key购买 nike

我有一个显示视频的平面列表。我希望当视频离开 View 时它应该被暂停。我在每个 Posts 中都保持暂停状态零件。

class Posts extends React.PureComponent {

constructor() {
super()
this.state = {
pause: true,
}

return(){
<Video
pause={this.state.pause}
//other props
/>
}

}

我正在使用 react-native-video .

我试过使用 onViewableItemsChanged Flatlist 的 Prop 但它不会改变状态。

我试过 this .
但这似乎对我不起作用。

我应该如何进行?

最佳答案

这是使用 react-native-inviewport 的可能解决方案.这个依赖只是一个单一的索引文件,它包含一个当 View 在视口(viewport)中时有回调的组件。它可以很容易地修改以满足您的需要。

我构建了一个非常简单的应用程序,它有一个 FlatList。 FlatList 中的第 11 项是视频。这应该意味着当应用程序渲染时视频不在屏幕上,因此视频不会播放,一旦视频完全进入视口(viewport),它就应该开始播放。
App.js

import * as React from 'react';
import { Text, View, StyleSheet, FlatList } from 'react-native';
import Constants from 'expo-constants';
import VideoPlayer from './VideoPlayer';

export default class App extends React.Component {

state = {
data: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
}

renderItem = ({item, index}) => {
if (index === 10) {
return <VideoPlayer />
} else {
return (
<View style={{height: 100, backgroundColor: '#336699', justifyContent: 'center', alignItems: 'center'}}>
<Text>{index}</Text>
</View>
)
}
}
keyExtractor = (item, index) => `${index}`;

render() {
return (
<View style={styles.container}>
<FlatList
data={this.state.data}
renderItem={this.renderItem}
keyExtractor={this.keyExtractor}
/>
</View>
);
}
}

const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ecf0f1',
padding: 8,
}
});
VideoPlayer.js
这是一个包含 Video 组件的组件。视频包含在 InViewPort具有回调函数的组件。当它包围的组件是 时,回调返回 true完全在视口(viewport)中,当它未完全在视口(viewport)中时为 false。回调调用 this.handlePlaying进而调用 this.playVideothis.pauseVideo取决于 bool 值。
import React, {Component} from 'react';
import { View, StyleSheet } from 'react-native';
import { Video } from 'expo-av';
import InViewPort from './InViewPort';
//import InViewPort from 'react-native-inviewport; // this wouldn't work in the snack so I just copied the file and added it manually.

export default class VideoPlayer extends React.Component {

pauseVideo = () => {
if(this.video) {
this.video.pauseAsync();
}
}

playVideo = () => {
if(this.video) {
this.video.playAsync();
}
}

handlePlaying = (isVisible) => {
isVisible ? this.playVideo() : this.pauseVideo();
}

render() {
return (
<View style={styles.container}>
<InViewPort onChange={this.handlePlaying}>
<Video
ref={ref => {this.video = ref}}
source={{ uri: 'http://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4' }}
rate={1.0}
volume={1.0}
isMuted={false}
resizeMode="cover"
shouldPlay
style={{ width: 300, height: 300 }}
/>
</InViewPort>
</View>
)
}
}

const styles = StyleSheet.create({
container: {
justifyContent: 'center',
alignItems: 'center'
}
});

这是一个显示它工作的小吃 https://snack.expo.io/@andypandy/video-only-playing-when-in-viewport

我应该指出,如果视频不是 完全 在视口(viewport)中则不会播放。我确信可以对 react-native-inviewport 进行一些调整如果视频部分在视口(viewport)中,如果这是您想要的,它会播放视频,也许通过将视频的高度传递给 InViewPort零件。

关于react-native - 不在视野范围内时暂停平面列表中的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54839940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com