Android 画中画 Picture-in-picture 使用
Android 8.0 Api 26以上 已允许画中画模式启动,主要用于播放视频。
第一步
默认情况下,系统不自动支持应用程序的PIP。
通过将设置android:supportsPictureInPicture为来在清单中注册视频活动 true
<activity android:name=".MainActivity"android:supportsPictureInPicture="true"android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>
第二步
调用 enterPictureInPictureMode() 就可以开启画中画模式了。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {enterPictureInPictureMode();}
到这里已经实现了画中画的雏形了。可以看到画中画中显示的少部分界面,官方建议画中画中只播放视频,所以就需要自己操作页面,除了视频播放控件,把其他全部隐藏。就会用到下面这个回调。
onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig)
当进入或退出画中画模式后都会回调,isInPictureInPictureMode为true时,是进入画中画(也就是变成小窗后),退出画中画时未false。
@Overridepublic void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);if (isInPictureInPictureMode) {mTvTitle.setVisibility(View.GONE);mIv.setVisibility(View.GONE);mPinp.setVisibility(View.GONE);} else {mTvTitle.setVisibility(View.VISIBLE);mIv.setVisibility(View.VISIBLE);mPinp.setVisibility(View.VISIBLE);}}
添加播放视频控件 SurfaceView + MediaPlayer
mSurfaceViewHolder = mSurfaceView.getHolder();mediaPlayer = MediaPlayer.create(this, R.raw.vid_bigbuckbunny);mSurfaceViewHolder.addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {mediaPlayer.setDisplay(mSurfaceViewHolder);mediaPlayer.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}});
这样就可以把画中画的视频播放起来了,但是发现进入画中画之后视频就暂停播放了,退出画中画模式后又会继续播放,我们希望,无论进入还是退出画中画的视频都能继续进行。
解决办法:
在官方文档介绍了,在进入和退出画中画时都会回调当前activity的 onStop()和onStart()。在onStop()和onStart()中继续播放视频。
@Overrideprotected void onResume() {Log.d("MainActivity", "onResume");if (mediaPlayer != null){mediaPlayer.start();}super.onResume();}@Overrideprotected void onStop() {Log.d("MainActivity", "onStop");mediaPlayer.pause();super.onStop();}
但是我认为在生命周期中操作视频的播放,就把逻辑扩大化了,示例中只是为了学习画中画案例才写到生命周期中,当业务复杂时,或者逻辑校验不成熟时,都会导致bug的发生。onPictureInPictureModeChanged()回调函数中操作思路清晰,操作和业务逻辑都在一条业务线上。
到这就不往下继续实现了,因为可做的东西实在太多了,在其他示例中都包含这些部分。包括画中画的显示大小,画中画显示中的暂停、快进、快退、音量的按钮,全屏显示时视频播放的大小,显示视频详情时,向上滑动自动进入画中画模式等等。
官方文档
Android 画中画 Picture-in-picture 使用相关推荐
- iOS9 画中画 Picture in Picture
画中画 (Picture in Picture) iOS9系统在iPad上支持多任务分屏和画中画视频播放,画中画视频播放就将视频播放窗口化,然后浮动在屏幕上,此时你可以使用其他APP.但是有限制:1. ...
- iOS画中画Picture in Picture:你需要知道的9个知识点
iOS9最后给我们带来了每个人期待已久的"多任务",Slider Over.Split View 和画中画(PiP),已经使iPad成为一个比之前更强大.更便利的工具.使你在工作中 ...
- 总结系列-Android画中画模式-看这篇就够啦
最近做做播放器,有个浮窗播放的需求,两种实现方式,一种是申请浮窗权限,创建浮窗参考 flowWindow,一种是采用画中画模式(8.0以上) 关于画中画 Android 8.0 Oreo(API Le ...
- Android 画中画(图片)
Android 画中画(图片) 简介: Android 8.0(API 级别 26)允许以画中画 (PIP) 模式启动 Activity.画中画是一种特殊类型的多窗口模式,最常用于视频播放.使用该模式 ...
- Android 画中画(视频)
Android 画中画(视频) 简介: Android 8.0(API 级别 26)允许以画中画 (PIP) 模式启动 Activity.画中画是一种特殊类型的多窗口模式,最常用于视频播放.使用该模式 ...
- Android画中画模式-看这篇就够啦
最近做做播放器,有个浮窗播放的需求,两种实现方式,一种是申请浮窗权限,创建浮窗参考 flowWindow,一种是采用画中画模式(8.0以上) 关于画中画 Android 8.0 Oreo(API Le ...
- android 画中画模式自定义,Android 8.0 Oreo 画中画模式
Android 8.0 Oreo(API Level 26)允许活动启动画中画 Picture-in-picture(PIP)模式.PIP 是一种特殊类型的多窗口模式,主要用于视频播放.PIP 模式已 ...
- Android 画中画模式
画中画支持 Android 8.0(API 级别 26)允许以画中画模式启动 Activity.画中画是一种特殊类型的多窗口模式,最常用于视频播放.使用该模式,用户可以通过固定到屏幕一角的小窗口观看视 ...
- Android画中画
基础画中画 manifest 设置 为了适配开启画中画状态时窗口的大小尺寸变化合理,我们需要修改 activity 中的对应属性 请为您的主 activity 添加如下属性 configChanges ...
- Android画中画(PIP)模式使用
学更好的别人, 做更好的自己. --<微卡智享> 本文长度为1679字,预计阅读6分钟 前言 现在手机端各大视频APP基本都有悬浮窗视频模式,我以前文章<Android制作带悬浮窗控 ...
最新文章
- 8.6亿个人信息被偷 网络安全团队曝光交易内幕
- mysql字段值后面有隐形字符_MySQL 隐形索引
- 电脑端跳转手机版的php代码,帝国CMS电脑端自动跳转到手机端移动端的方法
- select html value属性,HtmlSelect.DataValueField 属性 (System.Web.UI.HtmlControls) | Microsoft Docs...
- BZOJ 3043 IncDec Sequence:反向差分
- 蓝桥杯 - 试题 H: 扫雷(思维)
- Vue.js的的理解及优缺点
- linux防火墙没看3306访问不,Linux配置防火墙,开启80端口、3306端口
- 不重新编译DLL,让FCKEditor支持附件上传
- 费诺编码的gui页面设计_GUI设计和UI设计有什么区别?
- 在VS2015中使用SDL2.0
- Linux内核和用户空间数据交互copy_to_user和copy_from_user
- 如何在excel中取消合并单元格后内容自动填充?
- ASTC压缩格式总结
- c语言万花筒,C/C++——元胞自动机万花筒
- 内功修炼之lodash——chunk、zip、groupBy、invokeMap方法
- 罗马数字转换python_Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
- pyhton———使用urllib 下载文件~~过掉岁月过掉风
- 微信小程序进阶学习笔记Day05
- 【计算机网络】数据链路层 : 后退 N 帧协议 GBN ( 滑动窗口 | 发送窗口长度 | “发送方“ 累计确认、超时机制 | “接收方“ 按序接收、确认帧发送机制 | 计算示例 )★
热门文章
- 贝塞尔函数积分用matlab_MATLAB 学习笔记-10微分与积分
- 鸿蒙系统会和苹果系统一样好用吗,华为的鸿蒙系统会像苹果系统那样不需要杀毒和清理垃圾吗?...
- Aes加/解密工具类 --Java
- 店宝宝:“会员电商”,电商发展的新风口
- java activerecord.db_JFinal 源码分析 [DB+ActiveRecord]
- 360浏览器的收藏夹隐藏了,怎么处理?
- RMXP脚本解析(十五):Game_Battler(分割定义三)
- OpenCV玩九宫格数独(二):knn数字识别
- Spring中Enable*功能的使用
- 【FJOI 20170305】省选模拟赛