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.鼠标可以移动到上面浮 ...
随机推荐
- Python3 图片水平镜像实现
# -*- coding: utf-8 -*- """ Created on Sun Feb 4 12:15:38 2018 @author: markli " ...
- linux manjaro 配置 pytorch gpu 环境
manjaro目前中国资料偏少,踩了很多坑. 安装gpu版本就这么几个步骤 1 安装英伟达的驱动cuda 2 安装 cudnn 3 安装支持gpu的pytorch 或者其他的运算框架 manja ...
- C# 使用 iTextSharp 将 PDF 转换成 TXT 文本
var pdfReader = new PdfReader("xxx.pdf"); StreamWriter output = new StreamWriter(new FileS ...
- [HihoCoder1378]网络流二·最大流最小割定理
思路: 根据最大流最小割定理可得最大流与最小割相等,所以可以先跑一遍EdmondsKarp算法.接下来要求的是经过最小割切割后的图中$S$所属的点集.本来的思路是用并查集处理所有前向边构成的残量网络, ...
- 淘宝bug bug bug
手机淘宝(苹果版)出现了一个挺耀眼的bug...... 待评价有九个,如图 点进去评价6个之后,还有三个 再出来,待评价还是有九个. 重新打开,下拉刷新都不能改变
- 如何对MongoDB 3.2.7进行用户权限管理配置
转自:https://www.jianshu.com/p/a4e94bb8a052 上次写了一篇在CentOS7上源码安装MongoDB 3.2.7,完成了MongoDB 3.2.7的安装,但需要应用 ...
- 用vue的自定义组件写了一个拖拽 组件,局部的 只能在自定义元素内的
简单实现 没有做兼容<!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- AngularJS中获取数据源的几种方式
在AngularJS中,可以从$rootScope中获取数据源,也可以把获取数据的逻辑封装在service中,然后注入到app.run函数中,或者注入到controller中.本篇就来整理获取数据的几 ...
- 2014年新一代的报表利器 Qlik Sense Desktop 初步体验
点击进入 QlikView/QlikSense 社区 交流群:432998033 Qlik Sense Desktop 的案例展示 先上几个刚刚边看边学完成的几个报表案例效果 (如果图片显示不正常, ...
- Oracle只读用户角色的建立
授予某模式下对象读权限给角色,就可以建立Oracle只读用户角色,下文对该方法的实现步骤作了详细的介绍,供您参考学习. 下面为您介绍的是Oracle只读用户角色的建立方法,该方法供您参考,如果您在Or ...