`
cavalry800528
  • 浏览: 53068 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

(PS:新建的Q_Q_群,有兴趣可以加入一起讨论: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) / 2;
        wmParams.y = 0;
        // 设置悬浮窗口长宽数据
        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我修改了一些错误,原版下载的,导入后会关联一个工程导致出错,修正了这个问题。下载我下面的代码,直接导入就可以使用。然后设置一下视频路径。

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

 

测试DemoMoviewView2013-8-10.rar

 

相关文章:

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

 

Edited by mythou

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

 
2
2
分享到:
评论

相关推荐

    Android浮动窗口demo

    总结来说,"Android浮动窗口demo"提供了一个实现悬浮窗功能的示例,通过创建Service、设置布局、处理权限以及控制显示和关闭,展示了如何在Android应用中实现实时网速显示或其他类似功能的悬浮窗口。这个示例对于...

    安卓Android源码——浮动窗口播放器.zip

    【标题】"安卓Android源码——浮动窗口播放器"指的是一个专门为Android平台设计的应用程序源代码,它允许视频在屏幕的任何位置以浮动窗口的形式进行播放。这种功能常见于一些多任务处理的应用,如音乐播放器或视频...

    android 浮动窗口 模拟Home键

    在Android系统中,浮动窗口(Float Window)是一种特殊类型的窗口,它可以在用户界面的顶层显示,允许用户在不离开当前应用的情况下访问或操作其他内容。这种技术常用于各种辅助工具或者快捷方式应用,例如,模拟...

    安卓Android源码——视频浮动窗口源码.zip

    这个压缩包“安卓Android源码——视频浮动窗口源码.zip”提供了相关的源代码,帮助开发者理解和实现这样的功能。 首先,我们需要了解的是Android系统的权限管理。在Android 4.1(API级别16)之后,系统引入了浮动...

    Android源码——视频浮动窗口源码_new_66.zip

    本资源"Android源码——视频浮动窗口源码_new_66.zip"提供了实现这一功能的源代码,有助于开发者理解和学习如何在Android系统中创建浮动窗口。 首先,让我们了解一下Android悬浮窗的基本原理。在Android中,悬浮窗...

    2021-辅助类库-Android 视频浮动窗口源码.zip

    在Android开发中,实现视频浮动窗口(也称为悬浮窗或浮动播放器)是一项常见的需求,尤其是在需要让用户在使用其他应用的同时观看视频的应用场景下。这个压缩包“2021-辅助类库-Android 视频浮动窗口源码.zip”提供...

    android 360浮动窗口

    在Android开发中,360浮动窗口是一种常见的应用交互设计,它允许用户在主屏幕上进行悬浮操作,提高用户的使用效率和体验。360浮动窗口通常用于即时通讯、音乐播放、视频监控等场景,使用户可以同时处理多个任务。...

    android浮动窗口实现级点击消失例子

    在Android开发中,浮动窗口(通常称为悬浮窗或者小部件)是一种常见的功能,它可以在主屏幕或其他应用之上显示内容,为用户提供便捷的操作或...通过学习和运行这个例子,你将更深入地理解Android中浮动窗口的实现方式。

    android浮动窗口项目源码

    【描述】所提及的"能像w7一样在android系统上面一层一层的打开一个窗口,类似w7的桌面系统",意味着该项目的目标是模仿Windows 7中的 Aero Shake 和 Aero Peek 等特性,允许用户在Android设备上以浮动窗口的形式自由...

    android 浮动窗口 小窗口

    在本篇文章中,我们将深入探讨如何在Android中实现浮动窗口,并分享相关的代码示例。 首先,要创建一个浮动窗口,我们需要使用Android的`WindowManager`服务。`WindowManager`允许我们向系统窗口层次结构添加、移除...

    Android 视频浮动窗口源码.zip

    在Android开发中,实现视频浮动窗口(又称为悬浮窗或小窗口)是一项有趣且实用的技术。这通常涉及到在用户界面的任何位置展示一个小型的视频播放器,即使用户在使用其他应用时,视频也能继续播放。这样的功能常见于...

    Android 浮动窗口 StandOut

    "Android 浮动窗口 StandOut"是一个专为此目的设计的框架,使得开发者能够轻松地在自己的应用中实现这种功能。 StandOut框架的核心特性包括: 1. **自定义窗口大小和位置**:开发者可以根据需求设定浮动窗口的尺寸...

    android 浮动按钮、浮动窗口、悬浮窗口

    在Android开发中,浮动按钮(Floating Action Button, FAB)、浮动窗口(Floating Window)和悬浮窗口(Floating Window)是常见的用户界面元素,用于提供便捷的操作入口或者实现特殊显示效果。以下将详细介绍这些...

    Android小应用——短信控制的浮动窗

    总结起来,实现"Android小应用——短信控制的浮动窗"涉及了Android权限管理、广播接收器、悬浮窗口的创建与管理、短信解析、动态内容更新、用户交互以及安全性设计等多个技术点。通过这个项目,开发者不仅可以提升...

    浮动窗口动画显示

    在Android开发中,实现浮动窗口动画显示涉及到多个关键知识点,包括自定义视图、窗口权限、动画处理以及触摸事件响应。下面将详细讲解这些概念及其应用。 首先,我们需要理解Android中的浮动窗口,通常称为“悬浮窗...

    android桌面浮动窗口实现

    在Android系统中,实现桌面浮动窗口(也称为悬浮窗或小部件)的技术主要涉及到权限申请、自定义ViewGroup以及窗口管理器(WindowManager)的使用。以下是对这一主题的详细阐述: 首先,为了在Android应用中创建浮动...

    Android浮动窗口

    在Android开发中,浮动窗口(通常称为悬浮窗或者系统通知窗口)是一种可以在用户界面的顶层显示的小型窗口,常用于即时通讯应用、音乐播放器、屏幕录制等场景,以提供便捷的功能访问或信息展示。本示例是一个简单的...

    android视频播放浮动窗口对话框

    在Android开发中,实现视频播放浮动窗口对话框是一项常见的需求,尤其在移动设备上,用户可能希望在使用其他应用的同时观看视频。这个功能通常被称为"悬浮窗"或"小窗口模式",它允许视频在屏幕的任何位置自由移动并...

Global site tag (gtag.js) - Google Analytics