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

(PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)

1、MediaPlayer视频播放

  视频播放使用Android自带的播放功能,下面简单介绍一下MediaPlayer的使用。MediaPlayer使用其实十分方便,不过它支持的格式并不多,不过这里主要是为了演示如何实现画中画功能。因为后面打算把这个画中画功能加入到VLC播放器里面,这样就可以解决支持格式不多问题。

  1.  
  1. //Edited by mythou
    //http://www.cnblogs.com/mythou/
  1. // 播放界面使用surfaceview实现
  2. surfaceView = (SurfaceView) mlayoutView.findViewById(R.id.myView);
  3. //获取surfaceHolder,控制surfaceview
  4. surfaceHolder = surfaceView.getHolder();
  5. //回调,检测surfaceview的三种状态
  6. surfaceHolder.addCallback(this);
  7. //surfaceview的显示源类型
  8. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  9. //mediaplayer初始化
  10. mediaPlayer = new MediaPlayer();
  11. //设置不同的监听接口
  12. mediaPlayer.setOnCompletionListener(this);
  13. mediaPlayer.setOnErrorListener(this);
  14. mediaPlayer.setOnPreparedListener(this);
  15. mediaPlayer.setOnSeekCompleteListener(this);
  16. mediaPlayer.setOnVideoSizeChangedListener(this);
  17. String filePath = "/mnt/card/test.mp4";// "/mnt/sdcard/test.mp4";//
  18. // 本地地址和网络地址都可以
  19. try
  20. {
  21. mediaPlayer.setDataSource(filePath);
  22. }
  23. catch (IllegalArgumentException e)
  24. {
  25. // TODO: handle exception
  26. Log.v(LOGCAT, e.getMessage());
  27. onExit();
  28. }

  上面是初始化surfaceView和MeidaPlayer的代码,surfaceview在android应用开发里面十分重要,基本上设计视频或者动画类型的界面,都需要用到它。如果不了解的朋友,建议好好去熟悉一下这个类的使用。下面我们看看surfaceview的回调接口:

  1.  
  1. //Edited by mythou
    //http://www.cnblogs.com/mythou/
  1.   @Override
  2. public void surfaceCreated(SurfaceHolder holder)
  3. {
  4. Log.v(LOGCAT, "suc calles");
  5. mediaPlayer.setDisplay(holder);// 若无次句,将只有声音而无图像
  6. try
  7. {
           //播放视频
  8. mediaPlayer.prepare();
  9. } catch (IllegalStateException e)
  10. {
  11. onExit();
  12. } catch (IOException e)
  13. {
  14. onExit();
  15. }
      }

  上面是surfaceview里面其中一个回调接口,在这里我们处理视频准备开始播放,以及把surfaceview设置到MediaPlayer里面,让他们两者协调工作。播放的功能是MediaPlayer实现,而画面显示是依赖surfaceview实现。

 2、设置WindowManager窗口

  1.   
  1. //Edited by mythou
    //http://www.cnblogs.com/mythou/
  1.   public void initWindow()
  2. {
  3. // 获取WindowManager
  4. wm = (WindowManager) context.getApplicationContext().getSystemService(
  5. "window");
  6. // 设置LayoutParams(全局变量)相关参数
  7. // wmParams = ((MyApplication)getApplication()).getMywmParams();
  8. wmParams = new WindowManager.LayoutParams();
  9. /**
  10. * 以下都是WindowManager.LayoutParams的相关属性 具体用途可参考SDK文档
  11. */
  12. wmParams.type = /*LayoutParams.TYPE_SYSTEM_ALERT | */LayoutParams.TYPE_SYSTEM_OVERLAY; // 设置window type
  13. // 设置图片格式,效果为背景透明
  14. wmParams.format = PixelFormat.TRANSPARENT;
  15. // 设置Window flag
  16.  
  17. wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
  18. | LayoutParams.FLAG_NOT_FOCUSABLE
  19. | LayoutParams.FLAG_LAYOUT_NO_LIMITS;
  20. /*
  21. * 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
  22. * wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
  23. * LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
  24. */
  25. wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角
  26. // 以屏幕左上角为原点,设置x、y初始值
  27. currentDisplay = wm.getDefaultDisplay();
  28. WIDTH = currentDisplay.getWidth();
  29. HEIGHT = currentDisplay.getHeight();
  30. wmParams.x = (WIDTH - VIEW_WIDTH) / ;
  31. wmParams.y = ;
  32. // 设置悬浮窗口长宽数据
  33. wmParams.width = VIEW_WIDTH;
  34. wmParams.height = VIEW_HEIGHT;
  35. }

上面是使用WindowManager设置浮动窗口流程,跟我们上一篇界面的方法一致,具体不了解的朋友,可以看看我上一篇文章。

3、界面绑定画面

  下面我们看看如何把我们的视频播放界面绑定到顶层显示View上面,上一篇已经介绍过,只需要调用addview方法即可。

  1.  
  1. //Edited by mythou
    //http://www.cnblogs.com/mythou/
  1. MyFloatView sFloatView;
  2. ViewGroup fView;
  3. //绑定XML配置的界面
  4. fView = (ViewGroup) View.inflate(context, R.layout.main, null);
  5. // 显示myFloatView图像
  6. sFloatView = new MyFloatView(fView);
  7. sFloatView.bindViewListener();
  8. sFloatView.showLayoutView();

  上面是通过配置一个XML来显示界面,XML界面里面定义了Surfaceview类,最后在FloatView里面的showLayoutView调用WindowManager的addView添加到窗口服务里面。

  1. public void showLayoutView()
  2. {
  3. wm.addView(mlayoutView, wmParams);
  4. }

  上面就是大概的显示绑定流程,具体详细代码,请查看Demo里面的代码。这个Demo是在CSDN上面下载的,本来是想自己写一个,不过既然有开发者已经分享出来,我就没有重新自己写了,这个Demo我修改了一些错误,原版下载的,导入后会关联一个工程导致出错,修正了这个问题。下载我下面的代码,直接导入就可以使用。然后设置一下视频路径。

  这只是一个很简单功能,视频路径也是写死了,只是让大家知道如何实现画中画功能。可以把这功能移植到我们的多媒体播放器上面实现视频的画中画播放。

测试DemoMoviewView2013-8-10.rar

相关文章:

Android 实现顶层窗口、浮动窗口(附Demo)

Edited by mythou

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3250302.html 

  1.  

Android 浮动窗口进阶——画中画,浮动视频(附Demo)的更多相关文章

  1. Android Studio 的蓝牙串口通信(附Demo源码下载)

    根据相关代码制作了一个开源依赖包,将以下所有的代码进行打包,直接调用即可完成所有的操作.详细说明地址如下,如果觉得有用可以GIthub点个Star支持一下: 项目官网 Kotlin版本说明文档 Jav ...

  2. Delphi 悬浮窗口、浮动窗口的实现

    源:Delphi 悬浮窗口.浮动窗口的实现 浮动窗体的实现 http://blog.tianya.cn/blogger/post_show.asp?BlogID=68097&PostID=80 ...

  3. Android 实现顶层窗口、浮动窗口(附Demo)

    做过Window程序开发的朋友应该都知道,我们要把程序窗口置顶很简单,只要设置一些窗口属性即可.但是到了Android,你无法简单设置一个属性,就让Android的Activity置顶.因为只要有新的 ...

  4. Android浮动窗口的实现

    1.浮动窗口的实现原理 看到上图的那个小Android图标了吧,它不会被其他组建遮挡,也可以响应用户的点击和拖动事件,它的显示和消失由WindowManager直接管理,它就是Android浮动窗口. ...

  5. CSS进阶内容—浮动和定位详解

    CSS进阶内容-浮动和定位详解 我们在学习了CSS的基本知识和盒子之后,就该了解一下网页的整体构成了 当然如果没有学习之前的知识,可以到我的主页中查看之前的文章:秋落雨微凉 - 博客园 CSS的三种布 ...

  6. (转)JS浮动窗口(随浏览器滚动而滚动)

    原文:http://hi.baidu.com/aiyayaztt/item/4201c55a6b729dced2e10c79 JS浮动窗口(随浏览器滚动而滚动) 往往用于一些联系方式,互动平台模块,随 ...

  7. 复制360于Launcher浮动窗口的屏幕显示内存使用情况(基本版)

    MainActivity如下面: package cc.cc; import android.os.Bundle; import android.view.View; import android.v ...

  8. 抄360于Launcher浮动窗口的屏幕显示内存使用情况(改进版)

    MainActivity例如下列: package cc.cc; import android.os.Bundle; import android.view.View; import android. ...

  9. Jquery 类似新浪微博,鼠标移到头像,用浮动窗口显示用户信息,已做成一个jquery插件

    请注意!!!!! 该插件demo PHP 的 demo下载  C#.NET的demo下载 需要如下图, 1.鼠标移动到头像DIV时,Ajax获取数据,并让浮动DIV显示出来. 2.鼠标可以移动到上面浮 ...

随机推荐

  1. Git学习笔记:基础篇

    git可以说是所有开发者出开发语言之外的最基本的基本功了,熟悉git可以方便的进行代码版本控制,以及与其他开发者进行合作开发.本文内容是我以往学习git时做的笔记,主要是关于git最基本的操作,但 只 ...

  2. Windows环境下 PHP调用R脚本

    写在前面的: 由于是windows平台实现的,只要保证脚本命令能在cmd控制台运行,则可以在php中利用system()实现. 注意事项: (1).保证system的路径中无汉字和空格 !!  (亲身 ...

  3. 如何开发一个npm包并发布

    一.安装nodejs 不多说了,网上教程多得是 二.创建自己的npm包 目录结构 npm-test a.js b.js package.json 开发 为了简单便于理解,就开发一个简单地hello程序 ...

  4. 2002 ACM 杭电 计算球体积

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2002 注意,要用double 才能过,float过不了. 体积公式要加括号(优先级别)(4 * Π * r ...

  5. Java中的ReentrantLock和synchronized两种锁定

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  6. 通过ZwQuerySystemInformation获取EPROCESS

    google一下,发现很多都是直接通过ZwQuerySystemInformation通过11号获取进程结构SYSTEM_PROCESS_INFORMATION,对于详细的进程信息表达不够.所以想要通 ...

  7. 微信小程序页面带参数跳转及接收参数内容navigator

    功能从index页面跳转到draw页面,并在draw页面获取id及imgUrl index.wxml <navigator class='looks-view' wx:for="{{i ...

  8. shell自动补全功能:bash和zsh

    首要一点:shell有多种,比如bash.zsh.csh.ksh.sh.tcsh等 因此,制作自动补全功能时,要先搞清楚,你使用的是哪种shell,各个shell制作方法是不同的,网上大部分介绍的是关 ...

  9. Java编程最差实践(常见编程错误典范)

    转载自  http://macrochen.iteye.com/blog/1393502 每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题.虽然一般 ...

  10. 教育单元测试mock框架优化之路(中)

    转载:https://sq.163yun.com/blog/article/169564470918451200 三.间接依赖的bean的mock替换 对于前面提供的@Mock,@Spy+@Injec ...