首页/新闻资讯/正文详情

react-native-video v7 画中画、全屏与播放控制:基于 VideoView 的完整实战指南

发布时间:2026/9/28 3:00:36 来源:云帆数科 栏目:资讯中心
react-native-video v7 画中画、全屏与播放控制:基于 VideoView 的完整实战指南
音视频移动开发【免费下载链接】react-native-videoA component for react-native项目地址https://gitcode.com/gh_mirrors/re/react-native-video点击查看免费下载导读在 react-native-video v7 中画中画Picture-in-Picture、全屏Fullscreen和原生播放控件不再挂在播放器上而是全部由VideoView组件props 命令式 ref承载——播放器VideoPlayer只负责播放状态与控制视图层则负责显示与系统级 UI 交互。本文以skills/react-native-video/references/v7/pip-fullscreen-controls.md为骨架结合仓库源码VideoView.tsx、VideoViewProps.ts 等与原生实现讲解如何在 v7 中开启原生控件、配置 PiP 与自动 PiP、通过 ref 命令式进入/退出全屏与 PiP以及如何监听六个视图生命周期事件读完即可在真实 iOS/Android 设备上落地完整的播放器 系统画中画 全屏体验。1. 先厘清 v7 的心智模型功能在 View状态在 Playerv7 与 v6 最大的区别是**播放器对象模型而非带 props 的组件模型**见 v7/README.mduseVideoPlayer(source, setup?)或new VideoPlayer(source)创建并拥有一个VideoPlayer所有播放状态与控制都落在这个实例上VideoView player{player} /是绑定到该播放器的可选显示表面纯音频播放甚至可以完全不渲染视图播放器事件是订阅式的useEvent/player.addEventListener而视图拥有自己的事件——也就是本文的主角全屏与 PiP 的生命周期事件。因此涉及控件显示、画中画、全屏的一切能力都应当去VideoView上寻找而不是去player上翻。下面先从最基础的原生控件说起。2. 原生播放控件一行controls属性在 v7 中原生播放控件播放/暂停、进度条、音量等系统级 UI由VideoView的controls属性控制VideoView player{player} controls / // controls 默认为 falsecontrols类型为boolean默认值为false传true时iOS 上渲染为系统AVPlayerViewController自带的控制条Android 上渲染为 ExoPlayer 的控制层不传时视频纯展示所有交互需要你自己实现可配合播放器订阅事件onPlaybackStateChange、onProgress等自行绘制 UI。从源码看VideoView在挂载时会把 props 同步给原生视图管理器updateProps 中的默认值处理如下manager.controls props.controls ?? false; manager.pictureInPicture props.pictureInPicture ?? false; manager.autoEnterPictureInPicture props.autoEnterPictureInPicture ?? false; manager.resizeMode props.resizeMode ?? none; manager.keepScreenAwake props.keepScreenAwake ?? true; manager.surfaceType props.surfaceType ?? surface;即controls、pictureInPicture、autoEnterPictureInPicture缺省均为falseresizeMode缺省为none约等于 containkeepScreenAwake缺省为true视图挂载期间屏幕常亮surfaceType仅 Android 生效、缺省为surfaceSurfaceView性能更佳但不可动画如需动画请改用texture见 VideoViewProps.ts。3. 画中画PiPprops 声明式 ref 命令式双通道3.1 声明式pictureInPicture与autoEnterPictureInPicture最简用法是在VideoView上声明 PiP 能力VideoView player{player} pictureInPicture autoEnterPictureInPicture /两个属性的语义见 VideoViewProps.ts 与 VideoView.tsxProp类型默认值作用pictureInPicturebooleanfalse是否启用并显示 PiP 按钮原生控件里的小窗按钮autoEnterPictureInPicturebooleanfalse播放中切后台时是否自动进入PiPpictureInPicture本身只是允许 PiP 显示按钮不代表会自动进入小窗自动进入需要autoEnterPictureInPicture。Android 端在PictureInPictureUtils.kt中对此有非常细致的处理自动进入只在用户意图播放时生效autoEnterPictureInPicture player.playWhenReady true并用playWhenReady而非isPlaying判断这样正在缓冲但即将播放的视频也能正确进入 PiP见 PictureInPictureUtils.kt。PiP 小窗的宽高比会优先取视频实际格式考虑 90°/270° 旋转并自动钳制在 Android 允许的 2.39:1 与 1:2.39 之间否则回退到视图尺寸同文件calculateAspectRatio。3.2 命令式通过 ref 精确控制需要由业务逻辑触发如点击小窗按钮、返回键处理等时使用命令式 refimport { useRef } from react; import type { VideoViewRef } from react-native-video; const ref useRefVideoViewRef(null); // ref.current?.canEnterPictureInPicture() // ref.current?.enterPictureInPicture() // ref.current?.exitPictureInPicture() VideoView ref{ref} player{player} pictureInPicture /VideoViewRef接口定义了 6 个方法见 VideoViewProps.ts方法返回说明enterFullscreen()void进入全屏exitFullscreen()void退出全屏enterPictureInPicture()void进入 PiPexitPictureInPicture()void退出 PiPcanEnterPictureInPicture()boolean查询当前设备/系统是否支持 PiPaddEventListener(event, cb)ListenerSubscription订阅视图事件返回带remove()的订阅对象VideoView通过useImperativeHandle将这些方法桥接到 Nitro 原生视图管理器VideoViewViewManager上VideoView.tsx所以调用ref.current?.enterPictureInPicture()最终走的是原生manager.enterPictureInPicture()。务必先调用canEnterPictureInPicture()再进入 PiPiOS 端通过AVPictureInPictureController.isPictureInPictureSupported()判断支持性不支持时会抛出pictureInPictureNotSupported错误见 AVPlayerViewControllerPictureInPicture.swiftAndroid 端则检查系统是否具备FEATURE_PICTURE_IN_PICTURE特性见 PictureInPictureUtils.kt。在真机上出现 PiP 按钮不显示或进入失败时用该方法定位是设备不支持还是原生配置缺失。3.3 原生前置条件iOS 与 Android 缺一不可PiP 是系统级能力光有 JS 配置不够还必须完成原生配置详见 platform-setup.mdiOS需要在Info.plist的UIBackgroundModes中加入audio后台音频模式。PiP 在 iOS 上受支持但建议与后台音频模式配合使用Android在AndroidManifest.xml中给activity添加android:supportsPictureInPicturetrue并且项目minSdkVersion必须 ≥ 26API 26 才有 PiP APIExpo使用 config plugin在app.json/app.config.js中配置enableAndroidPictureInPicture然后执行expo prebuild注意Expo Go 不支持{ plugins: [[react-native-video, { enableBackgroundAudio: true, enableAndroidPictureInPicture: true }]] }对应的 Expo 插件实现位于仓库 withAndroidPictureInPicture.ts它会自动为 activity 注入supportsPictureInPicture属性。3.4 PiP 测试环境模拟器 ≠ 真机PiP 测试提示iOS 模拟器不支持 PiP必须使用真实 iOS 设备测试Android 模拟器API 26、Google Play 镜像则支持PiP可以直接在模拟器上验证。这条经验与两端实现完全吻合iOS 依赖AVPictureInPictureController的系统级支持模拟器不提供该能力而 Android 的 PiP 依赖 API 26 的窗口机制API 26 的模拟器镜像具备该特性。4. 全屏Fullscreenref 命令式切换全屏同样通过VideoViewref 控制没有对应的 props 开关ref.current?.enterFullscreen(); ref.current?.exitFullscreen();iOS 端基于AVPlayerViewController的展开/收起能力实现AVPlayerViewControllerFullscreen.swiftAndroid 端通过独立的FullscreenVideoFragment承载全屏视图FullscreenVideoFragment.kt从源码结构看Android 的全屏是把同一个播放器内容挂载进一个全屏 Fragment来实现的与 PiP 不同全屏不要求额外的系统权限或后台模式配置只要视图已挂载即可调用。典型场景自定义控制条上的全屏按钮 →ref.current?.enterFullscreen()配合onFullscreenChange回调同步你的 UI 状态见下节。5. 生命周期事件6 个视图事件完整对照PiP 与全屏的状态变化通过视图事件暴露有两种订阅方式作为 props 传入或通过ref.addEventListener命令式订阅两者等效最终都注册到原生监听器上见 VideoView.tsx。事件清单类型定义见 Events.ts事件载荷触发时机onFullscreenChangefullscreen: boolean全屏状态发生变化进入/退出onPictureInPictureChangeisInPictureInPicture: booleanPiP 状态发生变化willEnterFullscreen—即将进入全屏willExitFullscreen—即将退出全屏willEnterPictureInPicture—即将进入 PiPwillExitPictureInPicture—即将退出 PiPprops 写法VideoView ref{ref} player{player} controls pictureInPicture onFullscreenChange{(full) {}} onPictureInPictureChange{(pip) {}} /命令式写法返回ListenerSubscription记得remove()const sub ref.current?.addEventListener(willEnterPictureInPicture, () { // 例如暂停视频流、收起自定义 UI }); // 不需要时 sub?.remove();v7 提醒全屏与 PiP在 v7 中依然可用——它们位于视图层请使用VideoView的 ref 与视图 props/事件本文所示 API而不是 v6 时代Video组件上的旧属性。如果你是从 v6 教程迁移过来的注意 v6 的Video source、ref.seek()与drmprop 在 v7 中均不存在请改用播放器 APImigration-v6-to-v7.md。6. Web 平台的边界native-only 能力在 Web 上是 no-opv7 的 Web 端是基于 video.js v10 的并行实现见 VideoView.web.tsx因此controls在 Web 上有效映射为 video.js 播放器自带控件PiP 与全屏属于 native-only 能力pictureInPicture、autoEnterPictureInPicture、enterFullscreen等在 Web 实现中为 no-opWeb 全屏走浏览器自身的requestFullscreen或 video.js 全屏插件与本文所述原生 API 不互通判断canEnterPictureInPicture()在 Web 上会返回不支持。如果你的应用需要跨端一致的 PiP/全屏行为建议按平台分流native 走VideoViewRefWeb 走浏览器的全屏/PiP API并在 UI 上做能力探测。7. 综合示例一个带控件、PiP 与全屏的播放器将上述能力组合一个完整的实战组件如下import { useRef } from react; import { useVideoPlayer, VideoView, useEvent } from react-native-video; import type { VideoViewRef } from react-native-video; export default function PlayerScreen({ uri }: { uri: string }) { const player useVideoPlayer({ uri }, (p) { p.loop false; p.volume 1; }); const viewRef useRefVideoViewRef(null); // 播放器事件走订阅与视图事件不同 useEvent(player, onPlaybackStateChange, ({ isPlaying }) { // 同步播放按钮状态 }); return ( VideoView ref{viewRef} player{player} controls pictureInPicture autoEnterPictureInPicture style{{ flex: 1 }} onFullscreenChange{(full) console.log(fullscreen:, full)} onPictureInPictureChange{(pip) console.log(pip:, pip)} / {/* 自定义控制逻辑示例先探测再进入 PiP */} Button title进入 PiP onPress{() { if (viewRef.current?.canEnterPictureInPicture()) { viewRef.current?.enterPictureInPicture(); } }} / Button title全屏 onPress{() viewRef.current?.enterFullscreen()} / / ); }关键实践要点初始配置放setup回调useVideoPlayer第二参它只在播放器开始加载时执行一次在组件体内直接改player.x会在每次渲染时执行视图事件用 props 或ref.addEventListener均可但订阅返回对象需调用remove()清理而 props 方式由VideoView内部在卸载时自动清理VideoView.tsx进入 PiP 前先canEnterPictureInPicture()避免在模拟器或不支持的设备上抛错真机验证iOS 模拟器不支持 PiP务必在真机上测试 PiP 全流程。8. 相关资源索引本文骨架来源pip-fullscreen-controls.md视图 props/ref 类型定义VideoViewProps.ts视图事件类型定义Events.tsVideoView桥接实现VideoView.tsxiOS PiP 原生实现AVPlayerViewControllerPictureInPicture.swiftAndroid PiP 工具类PictureInPictureUtils.kt原生平台配置iOS/Android/Expoplatform-setup.mdv7 播放器模型总览v7/README.md、player-model.mdv7 事件全览events.md赞分享音视频移动开发【免费下载链接】react-native-videoA component for react-native项目地址https://gitcode.com/gh_mirrors/re/react-native-video点击查看免费下载相关推荐react-native-video 的 VideoView 组件完全指南原生渲染、播放控制、全屏与画中画react native video 的 VideoView 组件完全指南原生渲染、播放控制、全屏与画中画 VideoView 是 react native音视频移动开发react-native-video 的 VideoView 命令式 API 指南Ref 方法控制全屏与画中画react native video 的 VideoView 命令式 API 指南Ref 方法控制全屏与画中画 VideoView 是 react nativ音视频移动开发react-native-video 的 VideoView 组件 Props 全解析播放器绑定、原生控件、画中画与画面适配react native video 的 VideoView 组件 Props 全解析播放器绑定、原生控件、画中画与画面适配 导读 VideoView 是 r音视频移动开发上一篇RevokeMsgPatcher免费强力防撤回工具完整使用指南下一篇图像去重终极指南使用imagededup快速清理重复图片的10个技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

算法通关手册题解:LeetCode 10 正则表达式匹配——基于二维动态规划的 `.` 与 `*` 通配模式匹配
算法通关手册题解:LeetCode 10 正则表达式匹配——基于二维动态规划的 `.` 与 `*` 通配模式匹配

教程文档知识库 【免费下载链接】AlgoNote ⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000 道「LeetCode 题目解析」,持续更新中! 项目地址: https://gitcod… · 2026/9/28 3:00:36

5个实战案例揭秘:怎么做网页小精灵的对比评测与防黑指南
5个实战案例揭秘:怎么做网页小精灵的对比评测与防黑指南

5个实战案例揭秘:怎么做网页小精灵的对比评测与防黑指南 网站被黑挂马却不知如何排查?很多站长在深夜盯着满屏的恶意跳转代码,焦虑得头发掉了一把。别慌,今天咱们不整虚的,直接拆解 怎么做网页小精灵 背后的技术逻辑,并结合 对比评测… · 2026/9/28 3:00:30

C#电影院售票系统实战:三层架构、数据库事务与并发控制
C#电影院售票系统实战:三层架构、数据库事务与并发控制

简介:基于C#实现的电影院售票系统项目,面向计算机专业学生的毕业设计及课程设计场景,功能完备、可直接运行与二次开发。项目涵盖用户注册登录、电影场次管理、选座购票、订单支付、后台管理等完整业务流程,涉及C#面向对象编程、Wi… · 2026/9/28 3:00:30

Spingboot启动预热的实现
Spingboot启动预热的实现

启动预热的适用场景启动预热适合以下情况:数据主要来自第三方接口,无法直接从本地数据库读取。第三方接口响应较慢,首次访问容易超时。一个页面需要调用多个第三方接口或逐项查询。数据读取频繁,但变化不频繁。希望服务启动后&… · 2026/9/28 3:40:12

Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment
Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment

文章主要内容总结 本文研究了多模态大语言模型(具体为ChatGPT-4o)利用静态行车记录仪图像进行类人交通场景解读的潜力,重点聚焦与老年司机评估相关的三项任务:交通密度评估、交叉口可见性评估和停车标志识别。这些任务需上下文推理而非简单目标检测。研究采用零样本、少样… · 2026/9/28 3:32:43

Leveraging Large Language Models for Classifying App Users‘ Feedback
Leveraging Large Language Models for Classifying App Users‘ Feedback

文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)解决应用用户反馈分类的挑战,传统方法依赖有监督机器学习,但受限于标注数据集的规模和质量。研究通过三个核心实验评估了4种先进LLMs(GPT-3.5-Turbo、GPT-4o、Flan-T5、Llama3-70b)的性能: LLMs在用户反馈分类中的基… · 2026/9/28 3:32:43

Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...
Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...

文章主要内容总结 本文通过实验评估了大型语言模型(LLMs)在奥地利及欧盟增值税(VAT)法框架下辅助法律决策的能力。研究聚焦于两种提升LLM性能的方法——微调(fine-tuning)和检索增强生成(RAG),并在两类案例中进行验证:一是权威教科书案例,二是税务咨询公司的真实案… · 2026/9/28 3:32:43

学Java别走弯路,这5个方向最吃香
学Java别走弯路,这5个方向最吃香

学Java的人很多,但学明白的人不多。有人学了半年还在写控制台程序,有人一年就能独当一面。差别不在天赋,而在方向。Java生态太庞大了,什么都学等于什么都没学。选对方向,事半功倍。今天盘点当前最吃香的5个Java方向&am… · 2026/9/28 3:32:15

AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions
AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions

AlphaAgents相关总结与翻译 一、文章主要内容总结 (一)研究背景与问题 传统股票投资组合管理依赖人类分析师处理海量信息(如财务披露、财报、市场新闻等),存在信息处理效率低、易受认知偏差(如损失厌恶、过度自信)影响的问题,可能错失投资收益机会。尽管AI在数据处理… · 2026/9/28 3:32:08

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

制作网页比较方便的软件怎么选?一文搞懂避坑指南
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码