学习的第一步就是先找到函数的入口:根据R.id.fullscreen这个全屏按钮的点击事件,我们很快就能定位到名叫gotoScreenFullscreen的函数。

code line 737

public void gotoScreenFullscreen() {

ViewGroup vg = (ViewGroup) getParent();

vg.removeView(this);

cloneAJzvd(vg);

CONTAINER_LIST.add(vg);//作者在这里保存了原视图的父布局

vg = (ViewGroup) (JZUtils.scanForActivity(getContext())).getWindow().getDecorView();//和他也没有关系

vg.addView(this, new FrameLayout.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

setScreenFullscreen();

JZUtils.hideStatusBar(getContext());

JZUtils.setRequestedOrientation(getContext(), FULLSCREEN_ORIENTATION);

JZUtils.hideSystemUI(getContext());//华为手机和有虚拟键的手机全屏时可隐藏虚拟键 issue:1326

}

从上方代码第三行跳转到下面这个方法,可以看出作者用构造器构造了一个新的对象替代了原来位置的对象。

public void cloneAJzvd(ViewGroup vg) {

try {

Constructor constructor = (Constructor) Jzvd.this.getClass().getConstructor(Context.class);

Jzvd jzvd = constructor.newInstance(getContext());

jzvd.setId(getId());

vg.addView(jzvd);

jzvd.setUp(jzDataSource.cloneMe(), SCREEN_NORMAL, mediaInterfaceClass);

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

}

}

继续看第一个方法第四行开始,毫无疑问,作者获取getDecorView()根视图,然后将原来的对象放入了跟视图,同时隐藏了状态栏,也即是开启了全屏模式,汗,简单粗暴。

还不够,那如何从全屏模式回来呢,作者在打开全屏的时候,就将原视图的父容器存放到了一个链表中。

public static boolean backPress() {

Log.i(TAG, "backPress");

if (CONTAINER_LIST.size() != 0 && CURRENT_JZVD != null) {//判断条件,因为当前所有goBack都是回到普通窗口

CURRENT_JZVD.gotoScreenNormal();

return true;

} else if (CONTAINER_LIST.size() == 0 && CURRENT_JZVD != null && CURRENT_JZVD.screen != SCREEN_NORMAL) {//退出直接进入的全屏

CURRENT_JZVD.clearFloatScreen();

return true;

}

return false;

}

进入正题

public void gotoScreenNormal() {//goback本质上是goto

gobakFullscreenTime = System.currentTimeMillis();//退出全屏

ViewGroup vg = (ViewGroup) (JZUtils.scanForActivity(getContext())).getWindow().getDecorView();

vg.removeView(this);

CONTAINER_LIST.getLast().removeAllViews();

CONTAINER_LIST.getLast().addView(this, new FrameLayout.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

CONTAINER_LIST.pop();

setScreenNormal();//这块可以放到jzvd中

JZUtils.showStatusBar(getContext());

JZUtils.setRequestedOrientation(getContext(), NORMAL_ORIENTATION);

JZUtils.showSystemUI(getContext());

}

看完上面的代码一开始有点蒙蔽,为啥要把父容器的中视图全清理掉。回忆之前的接入过程,是因为

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/jz_video"

android:layout_width="match_parent"

android:layout_height="match_parent" />

如上所示,作者一开始就要求为播放器增加一层嵌套,可能是为了图方便,毕竟这比从复杂布局中恢复容易的多。

至此了解饺子播放器全屏播放的原理了。

感想:我也想过做全屏播放,可从没想过这样来切换,我想的是构造新的SufaceView然后重新接入视屏播放的数据,把问题想复杂了,感谢大佬的代码让我豁然开朗。

android饺子播放器屏幕全屏,记录一次 学习饺子播放器切换全屏播放原理相关推荐

  1. android自适应屏幕翻转,Android中正确自适应屏幕翻转

    大家都知道,很多Android手机带有重力感应传感器,能够对手机的翻转做出响应.比如应用在屏幕的自动翻转.重力感应游戏等方面. 只要在androidmanifest.xml中对应的Activity中加 ...

  2. MediaPlayer+TextureView,完美切换全屏、小窗口的 Android 视频播放器

    NiceVieoPlayer 项目地址:xiaoyanger0825/NiceVieoPlayer  简介:MediaPlayer+TextureView,完美切换全屏.小窗口的 Android 视频 ...

  3. android 按键铺满屏幕,安卓全屏状态下键盘充满屏幕留不出ui控件的解决办法附edittext和键盘的属性...

    1.我们先看看常用和不常用的属性值(Edittext) android:inputType参数类型说明 android:inputType="none"--输入普通字符 andro ...

  4. 自定义Android视频播放器 - 切换横竖屏

    前一篇自定义了SurfaceView,然后尝试横屏显示,虽然视频适配方面没有问题,但是没有占满整个屏幕. 我分析了一下一般的视频播放器,发现: 竖屏播放视频,播放器的宽度占满手机屏幕的宽度,播放器的高 ...

  5. 播放器SkeyeWebPlayer多分屏(九宫格)、拖动(拖入分屏播放)、双击分屏放大缩小等功能的使用

    免费视频直播.点播H5播放器SkeyeWebPlayer多屏(九宫格).双击分屏放大缩小.拖动(拖入分屏播放)等功能的使用. 1.SkeyeWebPlayer多屏(九宫格)布局切换,一般采用1.4.9 ...

  6. Android Video Player. 安卓视频播放器,封装 MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音,悬浮播放,广告播放,列表播放,弹幕

    DKVideoPlayer 项目地址:dueeeke/DKVideoPlayer 简介: Android Video Player. 安卓视频播放器,封装 MediaPlayer.ExoPlayer. ...

  7. Flash全屏播放外部多个Flv视频并且按键进行切换+全屏播放外部Flv视频+指定元件播放外部Flv视频(非全屏)(可以作为遮罩来播放)

    目录 一.目的: 1.Flash全屏播放外部多个Flv视频并且按键进行切换+全屏播放外部Flv视频+指定元件播放外部Flv视频(非全屏),所以将其记录下来 二.参考: 1.[AS3编程教学]如何加载并 ...

  8. android虚拟机固定横屏幕竖屏,用VBox虚拟机安装Android 屏幕90度翻转竖屏设置

    在虚拟机中安装好Android之后,有一些Android应用(比如UC浏览器.UC桌面)不能安装.但更有一些程序是可以安装,却自动顺时间旋转了90度,操作和看起来非常不爽! 这个情况下,在Androi ...

  9. android横竖屏切换动画,Android应用怎么实现屏幕横竖屏切换功能

    Android应用怎么实现屏幕横竖屏切换功能 发布时间:2020-11-26 15:48:57 来源:亿速云 阅读:121 作者:Leah Android应用怎么实现屏幕横竖屏切换功能?针对这个问题, ...

最新文章

  1. swift3.0三种反向传值
  2. mysql行级安全_MySQL学习笔记(五):MySQL表级锁和行级锁
  3. jquery 赋值时不触发change事件解决
  4. u8转完看不到菜单_web网页有错误,无法看到操作菜单-用友U8
  5. 如何运用大数据进行信贷审批?
  6. 为什么选择使用Sass而不是Less?
  7. mysql能将查询结果与表左查询,MySQL查询与结构
  8. 数据分析师系列课程 统计学基础1
  9. Flutter 性能优化
  10. ESP8266开启热点和TCP Server
  11. JWT原理 对比 appid secretkey 鉴权
  12. 苹果设备验证是否正品
  13. HTML之表单元素“Password”引发的思考-你的密码安全吗???
  14. 自己动手做Arduino玩具(三)
  15. 微信支付官方揭开刷脸支付神秘面纱
  16. 淘宝鹊桥计算工具安卓版小程序
  17. git pull 提示错误 fatal: refusing to merge unrelated histories
  18. 辽宁中职升高职计算机考试,2021年_辽宁省_中职升高职高考真题
  19. BUUCTF--[GWCTF 2019]枯燥的抽奖
  20. 【码蹄集新手村 600 题】判断输入的俩个正整数是否为蛮生质数(蛮生素数)

热门文章

  1. 树莓派将DHT11温度湿度上传到阿里云物联网平台
  2. 大学计算机基础知识点word,大学计算机基础考试知识重点
  3. 廖的python教程_廖雪峰的Python教程教程-02
  4. html桌球渐变色,用HTML 5打造斯诺克桌球俱乐部(2)
  5. 华为超级夜景是什么?P20手机怎么拍摄好看的超级夜景?
  6. 获取同花顺数据接口_如何获取深沪股票 LEVEL2 数据接口?
  7. 学计算机的看图写话,爸爸打电脑小明玩汽车看图写话一年级
  8. 公共基础知识:中国十大名关
  9. 蒸汽机器人布里茨天赋_lol机器人S6天赋加点图|2016赛季英雄联盟蒸汽机器人布里茨S6天赋、出装、符文加点最新全攻略_好特教程...
  10. 远航 Hello world.