Android 浮动窗口进阶——画中画,浮动视频(附Demo)
今天继续上一篇Android顶层窗口、浮动窗口的进阶应用。上一篇主要讲解了WindowManager服务和如何使用WindowManager编写一个顶层窗口。今天主要是讲讲如何在顶层窗口里面播放视频,这个功能对很多嵌入式设备来说十分有用。例如现在手机和平板上一些视频播放器就可以实现画中画功能,只显示一部分小窗口播放,用户可以继续操作其他功能。当你在看视频的时候收到短信,你只要进入画中画功能,视频可以继续播放,同时你可以去操作短信功能。

(PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)
1、MediaPlayer视频播放
视频播放使用Android自带的播放功能,下面简单介绍一下MediaPlayer的使用。MediaPlayer使用其实十分方便,不过它支持的格式并不多,不过这里主要是为了演示如何实现画中画功能。因为后面打算把这个画中画功能加入到VLC播放器里面,这样就可以解决支持格式不多问题。
//Edited by mythou
//http://www.cnblogs.com/mythou/
// 播放界面使用surfaceview实现
surfaceView = (SurfaceView) mlayoutView.findViewById(R.id.myView);
//获取surfaceHolder,控制surfaceview
surfaceHolder = surfaceView.getHolder();
//回调,检测surfaceview的三种状态
surfaceHolder.addCallback(this);
//surfaceview的显示源类型
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//mediaplayer初始化
mediaPlayer = new MediaPlayer();
//设置不同的监听接口
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnSeekCompleteListener(this);
mediaPlayer.setOnVideoSizeChangedListener(this);
String filePath = "/mnt/card/test.mp4";// "/mnt/sdcard/test.mp4";//
// 本地地址和网络地址都可以
try
{
mediaPlayer.setDataSource(filePath);
}
catch (IllegalArgumentException e)
{
// TODO: handle exception
Log.v(LOGCAT, e.getMessage());
onExit();
}
上面是初始化surfaceView和MeidaPlayer的代码,surfaceview在android应用开发里面十分重要,基本上设计视频或者动画类型的界面,都需要用到它。如果不了解的朋友,建议好好去熟悉一下这个类的使用。下面我们看看surfaceview的回调接口:
//Edited by mythou
//http://www.cnblogs.com/mythou/
@Override
public void surfaceCreated(SurfaceHolder holder)
{
Log.v(LOGCAT, "suc calles");
mediaPlayer.setDisplay(holder);// 若无次句,将只有声音而无图像
try
{
//播放视频
mediaPlayer.prepare();
} catch (IllegalStateException e)
{
onExit();
} catch (IOException e)
{
onExit();
}
}
上面是surfaceview里面其中一个回调接口,在这里我们处理视频准备开始播放,以及把surfaceview设置到MediaPlayer里面,让他们两者协调工作。播放的功能是MediaPlayer实现,而画面显示是依赖surfaceview实现。
2、设置WindowManager窗口
//Edited by mythou
//http://www.cnblogs.com/mythou/
public void initWindow()
{
// 获取WindowManager
wm = (WindowManager) context.getApplicationContext().getSystemService(
"window");
// 设置LayoutParams(全局变量)相关参数
// wmParams = ((MyApplication)getApplication()).getMywmParams();
wmParams = new WindowManager.LayoutParams();
/**
* 以下都是WindowManager.LayoutParams的相关属性 具体用途可参考SDK文档
*/
wmParams.type = /*LayoutParams.TYPE_SYSTEM_ALERT | */LayoutParams.TYPE_SYSTEM_OVERLAY; // 设置window type
// 设置图片格式,效果为背景透明
wmParams.format = PixelFormat.TRANSPARENT;
// 设置Window flag wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE
| LayoutParams.FLAG_LAYOUT_NO_LIMITS;
/*
* 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
* wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
* LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
*/
wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角
// 以屏幕左上角为原点,设置x、y初始值
currentDisplay = wm.getDefaultDisplay();
WIDTH = currentDisplay.getWidth();
HEIGHT = currentDisplay.getHeight();
wmParams.x = (WIDTH - VIEW_WIDTH) / ;
wmParams.y = ;
// 设置悬浮窗口长宽数据
wmParams.width = VIEW_WIDTH;
wmParams.height = VIEW_HEIGHT;
}
上面是使用WindowManager设置浮动窗口流程,跟我们上一篇界面的方法一致,具体不了解的朋友,可以看看我上一篇文章。
3、界面绑定画面
下面我们看看如何把我们的视频播放界面绑定到顶层显示View上面,上一篇已经介绍过,只需要调用addview方法即可。
//Edited by mythou
//http://www.cnblogs.com/mythou/
MyFloatView sFloatView;
ViewGroup fView;
//绑定XML配置的界面
fView = (ViewGroup) View.inflate(context, R.layout.main, null);
// 显示myFloatView图像
sFloatView = new MyFloatView(fView);
sFloatView.bindViewListener();
sFloatView.showLayoutView();
上面是通过配置一个XML来显示界面,XML界面里面定义了Surfaceview类,最后在FloatView里面的showLayoutView调用WindowManager的addView添加到窗口服务里面。
public void showLayoutView()
{
wm.addView(mlayoutView, wmParams);
}
上面就是大概的显示绑定流程,具体详细代码,请查看Demo里面的代码。这个Demo是在CSDN上面下载的,本来是想自己写一个,不过既然有开发者已经分享出来,我就没有重新自己写了,这个Demo我修改了一些错误,原版下载的,导入后会关联一个工程导致出错,修正了这个问题。下载我下面的代码,直接导入就可以使用。然后设置一下视频路径。
这只是一个很简单功能,视频路径也是写死了,只是让大家知道如何实现画中画功能。可以把这功能移植到我们的多媒体播放器上面实现视频的画中画播放。
测试Demo:MoviewView2013-8-10.rar
相关文章:
Android 实现顶层窗口、浮动窗口(附Demo)
Edited by mythou
原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3250302.html
Android 浮动窗口进阶——画中画,浮动视频(附Demo)的更多相关文章
- Android Studio 的蓝牙串口通信(附Demo源码下载)
根据相关代码制作了一个开源依赖包,将以下所有的代码进行打包,直接调用即可完成所有的操作.详细说明地址如下,如果觉得有用可以GIthub点个Star支持一下: 项目官网 Kotlin版本说明文档 Jav ...
- Delphi 悬浮窗口、浮动窗口的实现
源:Delphi 悬浮窗口.浮动窗口的实现 浮动窗体的实现 http://blog.tianya.cn/blogger/post_show.asp?BlogID=68097&PostID=80 ...
- Android 实现顶层窗口、浮动窗口(附Demo)
做过Window程序开发的朋友应该都知道,我们要把程序窗口置顶很简单,只要设置一些窗口属性即可.但是到了Android,你无法简单设置一个属性,就让Android的Activity置顶.因为只要有新的 ...
- Android浮动窗口的实现
1.浮动窗口的实现原理 看到上图的那个小Android图标了吧,它不会被其他组建遮挡,也可以响应用户的点击和拖动事件,它的显示和消失由WindowManager直接管理,它就是Android浮动窗口. ...
- CSS进阶内容—浮动和定位详解
CSS进阶内容-浮动和定位详解 我们在学习了CSS的基本知识和盒子之后,就该了解一下网页的整体构成了 当然如果没有学习之前的知识,可以到我的主页中查看之前的文章:秋落雨微凉 - 博客园 CSS的三种布 ...
- (转)JS浮动窗口(随浏览器滚动而滚动)
原文:http://hi.baidu.com/aiyayaztt/item/4201c55a6b729dced2e10c79 JS浮动窗口(随浏览器滚动而滚动) 往往用于一些联系方式,互动平台模块,随 ...
- 复制360于Launcher浮动窗口的屏幕显示内存使用情况(基本版)
MainActivity如下面: package cc.cc; import android.os.Bundle; import android.view.View; import android.v ...
- 抄360于Launcher浮动窗口的屏幕显示内存使用情况(改进版)
MainActivity例如下列: package cc.cc; import android.os.Bundle; import android.view.View; import android. ...
- Jquery 类似新浪微博,鼠标移到头像,用浮动窗口显示用户信息,已做成一个jquery插件
请注意!!!!! 该插件demo PHP 的 demo下载 C#.NET的demo下载 需要如下图, 1.鼠标移动到头像DIV时,Ajax获取数据,并让浮动DIV显示出来. 2.鼠标可以移动到上面浮 ...
随机推荐
- Python爬虫之正则表达式的使用(三)
正则表达式的使用 re.match(pattern,string,flags=0) re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none 参数 ...
- LVN与其在Linux上的实现
参考资料: LVM详解-骏马金龙-博客园 How to reduce the size of an LVM partition formatted with xfs filesystem on Cen ...
- Springzz中使用监听器,用于容器一启动就加载准备数据(application范围内的数据,用于减轻服务器压力,不用每次都去查数据)
java代码: public class InitListener implements ServletContextListener { public void contextInitialized ...
- 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)
本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...
- Winform自动更新组件分享
作者:圣殿骑士 出处:http://www.cnblogs.com/KnightsWarrior/ 关于作者:专注于微软平台项目架构.管理和企业解决方案.自认在面向对象及面向服务领域有一定的造诣,熟悉 ...
- 【面试 SQL】【第十六篇】SQL相关面试
=================================================================================== 1.一张表,姓名,科目,成绩,一 ...
- Linux 保护文件 不给修改
chatter +i file 文件不能删除,不能更改,不能移动 chatter -i file 恢复 lsattr file 查看 ----i--------e-- file 修改会提示: f ...
- [web前端] yarn和npm命令使用
原文地址: https://blog.csdn.net/mjzhang1993/article/details/70092902/ 最初接触 yarn 还是在 0.17.10 版本,由于各种各样的原因 ...
- 使用promise 和 generator来管理工作流
根据p219的代码改编 示例代码如下 function oneStep(value){ return new Promise(function(resolve, reject){ resolve('o ...
- Next Permutation leetcode java
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...