我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android视频悬浮窗口实现的示例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android视频悬浮窗口实现的示例代码

前言

本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回

APP
页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示:

悬浮窗口.gif

原理

 

WindowManager
View
视图进行添加、移除、更新处理;

WindowManager.LayoutParams
对窗口参数进行一系列设置。

实现

首先,需要添加相对应悬浮窗权限:


<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Activity
页面中,需要判断悬浮窗权限是否获取,如果未曾获取,需要跳转系统页,进行对应的授权操作:


public boolean requestOverlayPermission() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (!Settings.canDrawOverlays(this)) {
      Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
      startActivityForResult(intent, REQUEST_OVERLAY_CODE);
      return true;
    } else {
      return false;
    }
  }
  return false;
}

获取权限后,我们可以首先初始化我们要显示的视图,并且设置相对应的事件,这里我们采用了

VideoView
进行简单的视频播放,并且设置悬浮窗关闭及返回前台的操作:


private View initFloatView() {
  View view = View.inflate(this, R.layout.view_floating_window, null);
  // 设置视频封面
  final ImageView mThumb = (ImageView) view.findViewById(R.id.thumb_floating_view);
  Glide.with(this).load(R.drawable.thumb).into(mThumb);
  // 悬浮窗关闭
  view.findViewById(R.id.close_floating_view).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      mFloatingWindow.dismiss();
    }
  });
  // 返回前台页面
  view.findViewById(R.id.back_floating_view).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      mFloatingWindow.setTopApp(FloatingWindowActivity.this);
    }
  });
  final VideoView videoView = view.findViewById(R.id.video_view);
  //视频内容设置
 videoView.setVideoPath("https://stream7.iqilu.com/10339/article/202002/18/2fca1c77730e54c7b500573c2437003f.mp4");
  // 视频准备完毕,隐藏正在加载封面,显示视频
  videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
      mThumb.setVisibility(View.GONE);
    }
  });
  // 循环播放
  videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
      videoView.start();
    }
  });
  // 开始播放视频
  videoView.start();
  return view;
}

通过获取窗口管理

WindowManager
,设置悬浮窗口参数
WindowManager.LayoutParams
后,就可以通过
WindowManager
addView
方法,生成对应视图的悬浮窗口:


public void showFloatingWindowView(Context context, View view) {
  // 悬浮窗显示视图
  mShowView = view;
  // 获取系统窗口管理服务
  mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
  // 悬浮窗口参数设置及返回
  mFloatParams = getParams();
  // 设置窗口触摸移动事件
  mShowView.setOnTouchListener(new FloatViewMoveListener());
  // 悬浮窗生成
  mWindowManager.addView(mShowView, mFloatParams);
}

WindowManager.LayoutParams
参数设置,主要设置悬浮窗口类型为
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY


private WindowManager.LayoutParams getParams() {
  WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
  //设置悬浮窗口类型
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
  } else {
    layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
  }
  //设置悬浮窗口属性
  layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
      | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
      | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
      | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
      | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
  //设置悬浮窗口透明
  layoutParams.format = PixelFormat.TRANSLUCENT;
  //设置悬浮窗口长宽数据
  layoutParams.width = 600;
  layoutParams.height = 340;
  //设置悬浮窗显示位置
  layoutParams.gravity = Gravity.START | Gravity.TOP;
  layoutParams.x = 100;
  layoutParams.y = 100;
  return layoutParams;
}

窗口触摸移动事件,主要通过获取触摸位置,通过

WindowManager
updateViewLayout
方法设置悬浮窗口的参数,进行窗口视图位置更新:


private class FloatViewMoveListener implements View.OnTouchListener {
  //开始触控的坐标,移动时的坐标(相对于屏幕左上角的坐标)
  private int mTouchStartX;
  private int mTouchStartY;
  //开始时的坐标和结束时的坐标(相对于自身控件的坐标)
  private int mStartX, mStartY;
  //判断悬浮窗口是否移动,这里做个标记,防止移动后松手触发了点击事件
  private boolean isMove;
  @Override
  public boolean onTouch(View view, MotionEvent motionEvent) {
    int action = motionEvent.getAction();
    int x = (int) motionEvent.getX();
    int y = (int) motionEvent.getY();
    switch (action) {
      case MotionEvent.ACTION_DOWN:
        isMove = false;
        mTouchStartX = (int) motionEvent.getRawX();
        mTouchStartY = (int) motionEvent.getRawY();
        mStartX = x;
        mStartY = y;
        break;
      case MotionEvent.ACTION_MOVE:
        int mTouchCurrentX = (int) motionEvent.getRawX();
        int mTouchCurrentY = (int) motionEvent.getRawY();
        mFloatParams.x += mTouchCurrentX - mTouchStartX;
        mFloatParams.y += mTouchCurrentY - mTouchStartY;
        mWindowManager.updateViewLayout(mShowView, mFloatParams);
        mTouchStartX = mTouchCurrentX;
        mTouchStartY = mTouchCurrentY;
        float deltaX = x - mStartX;
        float deltaY = y - mStartY;
        if (Math.abs(deltaX) >= 5 || Math.abs(deltaY) >= 5) {
          isMove = true;
        }
        break;
      case MotionEvent.ACTION_UP:
        break;
      default:
        break;
    }
    //如果是移动事件不触发OnClick事件,防止移动的时候一放手形成点击事件
    return isMove;
  }
}

关闭悬浮窗,调用

WindowManager
removeView
方法即可:


public void dismiss() {
  if (mWindowManager != null && mShowView != null) {
    mWindowManager.removeView(mShowView);
  }
}

悬浮窗点击返回前台方法:


public void setTopApp(Context context) {
  //获取ActivityManager
  ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  //获得当前运行的task(任务)
  List<ActivityManager.RunningTaskInfo> taskInfoList = null;
  if (activityManager != null) {
    taskInfoList = activityManager.getRunningTasks(100);
  }
  if (taskInfoList != null) {
    for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {
      //找到本应用的 task,并将它切换到前台
      if (taskInfo.topActivity != null && taskInfo.topActivity.getPackageName().equals(context.getPackageName())) {
        activityManager.moveTaskToFront(taskInfo.id, 0);
        break;
      }
    }
  }
}

关于悬浮窗的一些基本操作到这里就基本结束了,具体的布局内容及操作,欢迎查看具体的源码实现: Github开发记录

到此这篇关于Android视频悬浮窗口实现的示例代码的文章就介绍到这了,更多相关Android视频悬浮窗口 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文章:android实现桌面移动悬浮窗口Android手机悬浮窗口小案例Android中悬浮窗口的实现原理实例分析android 添加随意拖动的桌面悬浮窗口


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android视频悬浮窗口实现的示例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android视频悬浮窗口实现的示例代码

前言 本文例子实现了点击显示悬浮窗口,同时窗口可播放视频,拖动位置,点击关闭及返回 APP 页面,通过例子来讲述悬浮窗口实现原理及细节处理,效果图如下所示:悬浮窗口.gif 原理 WindowManager 对 View 视图进行添加、移
2022-06-06

Android悬浮窗屏蔽悬浮窗外部所有的点击事件的实例代码

Android可以在所有应用上方添加View,就是给WindowManager添加一个View,在创建的View的时候可以给这个View设置LayoutParams(android.view.WindowManager.LayoutPara
2022-06-06

Android实现桌面悬浮窗、蒙板效果实例代码

现在很多安全类的软件,比如360手机助手,百度手机助手等等,都有一个悬浮窗,可以飘浮在桌面上,方便用户使用一些常用的操作。 今天这篇文章,就是介绍如何实现桌面悬浮窗效果的。 首先,看一下效果图。悬浮窗一共分为两个部分,一个是平常显示的小窗口
2022-06-06

Android中悬浮窗口的实现原理实例分析

本文实例讲述了Android中悬浮窗口的实现原理。分享给大家供大家参考。具体如下: 用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置W
2022-06-06

Android应用内悬浮窗的实现方案示例

1、悬浮窗的基本介绍悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过WindowManagerService( WMS)来管理所有的窗口,对于WMS来说,管你是Activi
2023-05-30

Android开发模仿qq视频通话悬浮按钮(实例代码)

模仿qq视频通话的悬浮按钮的实例代码,如下所示;public class FloatingWindowService extends Service{private static final String TAG="OnTouchListe
2022-06-06

Android 实现控件悬浮效果实例代码

随着移动互联网的快速发展,它已经和我们的生活息息相关了,在公交地铁里面都能看到很多人的人低头看着自己的手机屏幕,从此“低头族”一词就产生了,作为一名移动行业的开发人员,我自己也是一名“低头族”,上下班时间在公交地铁上看看新闻来打发下时间,有
2022-06-06

NodeJS实现视频转码的示例代码

视频转码就是一个先解码,再编码的过程,从而将原来的视频转换成我们需要的视频。这种转换可能包括各式(mp4/avi/flv等)、分辨率、码率、帧率等。传统的视频转码中,很常用的工具是FFmpeg。FFmpeg是一套可以用来记录、转换数字音频、
2022-06-04

Android RecyclerView打造悬浮效果的实现代码

本文介绍了Android RecyclerView悬浮效果,分享给大家,具体如下:先看个效果这是一个City列表,每个City都有所属的Province,需要在滑动的时候,将对应的Province悬浮在顶部。悬浮顶部的Province需要根
2023-05-30

pandas实现滑动窗口的示例代码

本文主要介绍了pandas实现滑动窗口的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-13

java实现窗口刷新的示例代码

Java窗口刷新示例:窗口刷新可创建流畅的用户界面。在Java中,可通过重绘请求和事件分发队列(EDQ)实现刷新。EDQ存储重绘请求,并在合适时机(如鼠标释放或窗口调整)执行它们,触发repaint()方法,从而更新组件。组件的paint()方法绘制组件内容,使用Graphics对象绘制图形原语。双缓冲技术使用前后缓冲区,以提高刷新性能。内容绘制到后缓冲区,完成后复制到前缓冲区,更新屏幕内容。示例代码:创建一个JFrame并重写其paint()方法以绘制文本,使用EventQueue.invokeLate
java实现窗口刷新的示例代码
2024-04-02

Android底部弹窗的实现示例代码

本文主要是介绍Android中实现底部弹窗的的正确姿势,如果你在实现底部弹窗时遇到了一些问题,那么请仔细阅读本文,相信文章会对你有所帮助。收获早知道阅读完本文后,你可以有以下收获 利用PopupWindow实现底部弹窗 PopupWin
2023-05-30

Flutter实现增强版的页面悬浮按钮的示例代码

Flutter 自带的 FloatingActionButton 为我们提供了一个悬浮在顶部的按钮,这个按钮始终在最顶层,因此可以做一些快捷的操作。本文就来和大家详细聊聊
2023-01-31

python+opencv实现视频抽帧示例代码

1、数据集简述: 虽然有主流庞大的COCO、VOC数据集,但是科研人员仍需要特殊领域要求的数据集,所以采用人工实地采集的方式进行收集数据集图像;通过拍照收集图像过于繁琐,所以通常是将摄像头无规则的移动旋转以及远近拉缩,进而录制
2022-06-02

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录