微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 react-native 中自动播放元素焦点上的视频

如何解决在 react-native 中自动播放元素焦点上的视频

import {Video} from 'expo-av';
return (

      <FlatList 
        data={videos}
        // keyExtractor={(item,ind}
        keyExtractor={(item) => item.names}
        renderItem={({item})=>(
          <TouchableOpacity
          onPress={() => {console.log('pushed');navigation.push('Details',{url:item.videourl})}}>
            <Video
                usePoster="true"
                source={{ uri: item.videourl }}
                rate={1.0}
                volume={1.0}
                isMuted={false}
                resizeMode="cover"
                shouldplay={isFocused ? true : false}
                // isLooping
                // useNativeControls
                posterSource={{uri:item.imageurl}}
                style={{ height: 300 }}
                
                
                /> 
                


          </TouchableOpacity>
        )}/>

  );

如果一个视频聚焦,则必须播放该视频,如果视频未聚焦,则应暂停。我正在使用 expo-av 播放视频。上面的代码正在屏幕上播放所有视频,但我想播放像 youtube 一样聚焦的视频。

解决方法

为此,您需要跟踪滚动视图的移动方式(偏移量)。 FlatList 有一个 onScroll 属性,回调会在其中提供有关列表布局等的信息,并且您有兴趣跟踪内容已垂直滚动的程度 - 即 contentOffset.y

将此值除以列表项高度(在您的情况下为常数 300)并四舍五入将为您提供应该播放的项目的索引。

使用 state 来存储当前聚焦的索引:

const [focusedIndex,setFocusedIndex] = React.useState(0);

onScroll 事件添加处理程序:

const handleScroll = React.useCallback(({ nativeEvent: { contentOffset: { y } } }: NativeSyntheticEvent<NativeScrollEvent>) => {
  const offset = Math.round(y / ITEM_HEIGHT);

  setFocusedIndex(offset)
},[setFocusedIndex]);

将处理程序传递给您的列表:

<FlatList
  onScroll={handleScroll}
  ...
/>

并修改视频的 shouldPlay 道具:

<Video
  shouldPlay={focusedIndex === index}
  ...
/>

您可以在此处查看工作小吃:https://snack.expo.io/@mlisik/video-autoplay-in-a-list,但请注意,如果您查看网络版本,则似乎不会调用 onScroll。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。