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 使用相关推荐

  1. iOS9 画中画 Picture in Picture

    画中画 (Picture in Picture) iOS9系统在iPad上支持多任务分屏和画中画视频播放,画中画视频播放就将视频播放窗口化,然后浮动在屏幕上,此时你可以使用其他APP.但是有限制:1. ...

  2. iOS画中画Picture in Picture:你需要知道的9个知识点

    iOS9最后给我们带来了每个人期待已久的"多任务",Slider Over.Split View 和画中画(PiP),已经使iPad成为一个比之前更强大.更便利的工具.使你在工作中 ...

  3. 总结系列-Android画中画模式-看这篇就够啦

    最近做做播放器,有个浮窗播放的需求,两种实现方式,一种是申请浮窗权限,创建浮窗参考 flowWindow,一种是采用画中画模式(8.0以上) 关于画中画 Android 8.0 Oreo(API Le ...

  4. Android 画中画(图片)

    Android 画中画(图片) 简介: Android 8.0(API 级别 26)允许以画中画 (PIP) 模式启动 Activity.画中画是一种特殊类型的多窗口模式,最常用于视频播放.使用该模式 ...

  5. Android 画中画(视频)

    Android 画中画(视频) 简介: Android 8.0(API 级别 26)允许以画中画 (PIP) 模式启动 Activity.画中画是一种特殊类型的多窗口模式,最常用于视频播放.使用该模式 ...

  6. Android画中画模式-看这篇就够啦

    最近做做播放器,有个浮窗播放的需求,两种实现方式,一种是申请浮窗权限,创建浮窗参考 flowWindow,一种是采用画中画模式(8.0以上) 关于画中画 Android 8.0 Oreo(API Le ...

  7. android 画中画模式自定义,Android 8.0 Oreo 画中画模式

    Android 8.0 Oreo(API Level 26)允许活动启动画中画 Picture-in-picture(PIP)模式.PIP 是一种特殊类型的多窗口模式,主要用于视频播放.PIP 模式已 ...

  8. Android 画中画模式

    画中画支持 Android 8.0(API 级别 26)允许以画中画模式启动 Activity.画中画是一种特殊类型的多窗口模式,最常用于视频播放.使用该模式,用户可以通过固定到屏幕一角的小窗口观看视 ...

  9. Android画中画

    基础画中画 manifest 设置 为了适配开启画中画状态时窗口的大小尺寸变化合理,我们需要修改 activity 中的对应属性 请为您的主 activity 添加如下属性 configChanges ...

  10. Android画中画(PIP)模式使用

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为1679字,预计阅读6分钟 前言 现在手机端各大视频APP基本都有悬浮窗视频模式,我以前文章<Android制作带悬浮窗控 ...

最新文章

  1. 8.6亿个人信息被偷 网络安全团队曝光交易内幕
  2. mysql字段值后面有隐形字符_MySQL 隐形索引
  3. 电脑端跳转手机版的php代码,帝国CMS电脑端自动跳转到手机端移动端的方法
  4. select html value属性,HtmlSelect.DataValueField 属性 (System.Web.UI.HtmlControls) | Microsoft Docs...
  5. BZOJ 3043 IncDec Sequence:反向差分
  6. 蓝桥杯 - 试题 H: 扫雷(思维)
  7. Vue.js的的理解及优缺点
  8. linux防火墙没看3306访问不,Linux配置防火墙,开启80端口、3306端口
  9. 不重新编译DLL,让FCKEditor支持附件上传
  10. 费诺编码的gui页面设计_GUI设计和UI设计有什么区别?
  11. 在VS2015中使用SDL2.0
  12. Linux内核和用户空间数据交互copy_to_user和copy_from_user
  13. 如何在excel中取消合并单元格后内容自动填充?
  14. ASTC压缩格式总结
  15. c语言万花筒,C/C++——元胞自动机万花筒
  16. 内功修炼之lodash——chunk、zip、groupBy、invokeMap方法
  17. 罗马数字转换python_Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
  18. pyhton———使用urllib 下载文件~~过掉岁月过掉风
  19. 微信小程序进阶学习笔记Day05
  20. 【计算机网络】数据链路层 : 后退 N 帧协议 GBN ( 滑动窗口 | 发送窗口长度 | “发送方“ 累计确认、超时机制 | “接收方“ 按序接收、确认帧发送机制 | 计算示例 )★

热门文章

  1. 贝塞尔函数积分用matlab_MATLAB 学习笔记-10微分与积分
  2. 鸿蒙系统会和苹果系统一样好用吗,华为的鸿蒙系统会像苹果系统那样不需要杀毒和清理垃圾吗?...
  3. Aes加/解密工具类 --Java
  4. 店宝宝:“会员电商”,电商发展的新风口
  5. java activerecord.db_JFinal 源码分析 [DB+ActiveRecord]
  6. 360浏览器的收藏夹隐藏了,怎么处理?
  7. RMXP脚本解析(十五):Game_Battler(分割定义三)
  8. OpenCV玩九宫格数独(二):knn数字识别
  9. Spring中Enable*功能的使用
  10. 【FJOI 20170305】省选模拟赛