android实现多画面播放,可无缝切换小窗/全屏的android播放器实现
效果:
普通模式多画面 / 全屏播放
小窗模式
布局和拖拽功能介绍
普通窗口下的视图层级关系
将AutoMonitorPlayer作为控件时,layout图层关系如上图。AutoMonitorPlayer内部包含一个FrameLayout,将SurfaceView包含在内。
页面小窗
当切换到小窗模式时,AutoMonitorPlayer将容器Framelayout删除出子节点,外部的根节点android.R.id.content再将容器FrameLayout加为子节点://父节点变了,需要从老的父节点处删掉容器
this.removeView(mContainer);
//android.R.id.content是MainActivity布局最外面的一层FrameLayout
ViewGroup contentView =(ViewGroup)NiceUtil.scanForActivity(mContext).findViewById(android.R.id.content);
FrameLayout.LayoutParams params =mConfig.getTinyWindowLayoutParams();contentView.addView(mContainer,params);
关于小窗的拖拽,自定义继承自FrameLayout的类(DragFrameLayout)作为SurfaceView容器类,接收到onTouch回调的移动消息后,调用layout修改自己的位置,接收到up消息后,调用setLayoutParams修改自身窗口参数://临时修改视图显示
layout(oriLeft,oriTop,oriRight,oriBottom);
//这里修改gravity,使用left和top为Margins的定位参数,只需要给这两个值就可以了((LayoutParams)oldParams).gravity= Gravity.LEFT| Gravity.TOP;((LayoutParams)oldParams).setMargins(oriLeft,oriTop,0,0);setLayoutParams(oldParams);
必须要说明的是,目前这种实现方式,小窗还是和页面绑定的。如果要全局窗口,需要新建全局弹窗,再将FrameLayout作为该全局弹窗的视图子节点。
全局小窗
全局窗口需要使用AlertDialog(TinyDialog):getWindow().getAttributes().type= WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
使用AlertDialog要注意权限的申请,除了AndroidManifest.xml中申明权限,如果是android6.0以上的SDK,还需要在代码中动态申请权限:context.startActivityForResult(newIntent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:"+ context.getPackageName())), 0);
创建了全局窗口,我们就要把FrameLayout容器放入这个窗口:mTinyDialg.addContentView(mContainer,newFrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
如图,和页面内小窗比较类似,不同的是AlertDiaolg不再属于应用中的布局,即使切出应用也可见。
关于全局小窗的拖拽。页面小窗其实改变的是Framelayout的窗口位置,而全局小窗改变的是AlertDialog的窗口位置。
有一点很重要,我们知道Android有一套触摸消息传递机制,默认情况下会先传递给子布局,如果消息没有被消费掉,再一层层往上传递。AlertDialog作为FrameLayout的父节点,要想优先消费触摸消息,必须进行消息拦截,要覆写dispatchTouchEvent方法:@Overridepublic booleandispatchTouchEvent(@NonNull MotionEvent ev) {returnonTouchEvent(ev);}
然后根据触摸坐标确定要移动到哪里,再通过WindowManager改变自己的位置:mWindowManager.updateViewLayout(getWindow().getDecorView(), layoutParams);
全屏
全屏时,同样是AutoMonitorPlayer将容器Framelayout删除出子节点,外部的根节点android.R.id.content再将容器FrameLayout加为子节点,同时,需要隐藏ActionBar、状态栏,并根据需要设置屏幕方向。
接口介绍
接口名参数说明
android实现多画面播放,可无缝切换小窗/全屏的android播放器实现相关推荐
- Flash全屏播放外部多个Flv视频并且按键进行切换+全屏播放外部Flv视频+指定元件播放外部Flv视频(非全屏)(可以作为遮罩来播放)
目录 一.目的: 1.Flash全屏播放外部多个Flv视频并且按键进行切换+全屏播放外部Flv视频+指定元件播放外部Flv视频(非全屏),所以将其记录下来 二.参考: 1.[AS3编程教学]如何加载并 ...
- android webview 横竖屏_webview播放视频并且点击全屏横屏的方法
title: webview播放视频并且点击全屏横屏的方法 date: 2016-11-28 10:33:27 tags: tips 首先initWebView,好吧有点多,有些是项目里其他需求需要的 ...
- 微信视频播放器隐藏播放控件,视频全屏做法分享
转自:https://www.haorooms.com/post/weixin_hidevideo_control 本人实测有效.为了防止以后还要用到,到时候找不到,所以转载一下. 前言 平时项目中视 ...
- excel2016html,Excel2016中切换至全屏视图的两种方法
在Excel工作表的使用过程中,有时因为工作表中的内容较多,无法在当前屏幕中完整显示,这时切换到全屏视图来查看要更方便一些.在Excel 2016中切换至全屏视图,主要有以下两种方法: 方法一:使用快 ...
- 在iframe 中视频可以正常播放,但是就是不能全屏。解决方法
在iframe 中视频可以正常播放,但是就是不能全屏.解决方法 参考文章: (1)在iframe 中视频可以正常播放,但是就是不能全屏.解决方法 (2)https://www.cnblogs.com/ ...
- 安全牛课堂课程自动播放下一集以及全屏
安全牛课堂课程自动播放下一集以及全屏 最近帮别人定制了一个TamperMonkey脚本.本身他想录制安全牛课堂的课程.所以需要视频可以自动播放下一集.同时为了为了效果更好,需要自动全屏播放.最后再脚本 ...
- Android手机循环切换图片全屏播放
自己写的手机全屏切换播放图片,开发的是android4.3,运行测试的手机是Android5.1的,布局文件就不说了,就是一个ImageView,代码如下: import java.util.Time ...
- android 全屏动画,Android开发之全屏与非全屏的切换设置方法小结
本文实例讲述了Android开发之全屏与非全屏的切换设置方法.分享给大家供大家参考,具体如下: 静态方法 1. 代码方式 在Activity类OnCreate方法中设置,代码如下 @Override ...
- html5仿抖音全屏播放,仿抖音视频全屏播放滑动切换
1 前言 随着移动技术的快速迭代,数据流量费用的快速下降,视频.直播正成为全民的媒体盛宴,我司必然也不会缺席此次盛宴,这里讲述的是通过h5实现仿抖音视频全屏播放&滑动切换的效果,供我司直播鉴定 ...
最新文章
- 基于gateway网关实现限流
- 360安全路由器v2处理器_您的路由器有多不安全?
- 识别中文_中文场景文字识别大赛官方baseline
- 1000以内完数c语言程序_C语言完数编程题目详解
- docker构建自己的镜像
- 数学建模之微分方程模型详解
- CTF压缩包隐写类(zip、RAR、zip伪加密)
- create table
- GNU ARM 汇编基础笔记
- 中医针灸学综合练习题库【10】
- Todo Tree插件配置
- MATLAB toc使用
- 通过Flex布局设置水平垂直居中
- 39 Flutter仿京东商城项目 收货地址列表、增加 修改收货地址布局、弹出省市区选择器...
- 肥胖与高血压有什么关系?
- Android 文件系统获取root权限和重新挂载根目录为可读写
- Python画图常用代码总结,这20个画图代码现拿现用
- 解决Hexo博客引用网络图片无法显示的问题
- Python实现名片管理系统,办公必备!
- word敲空格文字不后退,用word来打文字的时候,为什么敲一下空格后面的文字就消失????...