Android 浮动窗口进阶——画中画,浮动视频(附Demo)

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

一、MediaPlayer视频播放 网络

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

复制代码

 
 
//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实现。 this

 

 二、设置WindowManager窗口 spa

复制代码

  

//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) / 2; wmParams.y = 0; // 设置悬浮窗口长宽数据 wmParams.width = VIEW_WIDTH; wmParams.height = VIEW_HEIGHT; }

复制代码

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

 

三、界面绑定画面 code

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

复制代码

 
 
//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我修改了一些错误,原版下载的,导入后会关联一个工程致使出错,修正了这个问题。下载我下面的代码,直接导入就可使用。而后设置一下视频路径。

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

相关文章
相关标签/搜索