About FloatWindow

Android APP中实现悬浮窗的场景很多,比如悬浮窗播放视频,离开直播间,或者退出应用,继续播放直播流等。本项目在线上稳定运行,仅供参考,可根据自己的需求,改进,欢迎交流。

悬浮窗的实现方式

一,Window Manager实现

通常的做法是使用WindowManager,使用其addView方法,添加一个布局view来实现系统弹窗,大部分window type需要申请权限,如果是 TYPE_SYSTEM_ALERT 形式,需要申请以下权限:

android.permission.SYSTEM_ALERT_WINDOW

该方式,既可以在app内部显示,也可以在应用外也显示,缺点是有兼容性问题,需要做ROM适配,而且因为更新布局迟钝,不适合对悬浮窗做缩放操作,本项目有该方案的具体实现,具体参照demo。
悬浮窗主要是通过WindowManager这个类实现的,这个类有3个方法:

void addView (View view, WindowManager.LayoutParams params)//添加一个悬浮窗
void removeView (View view)//移除悬浮窗
void updateViewLayout (View view, WindowManager.LayoutParams params)//更新悬浮窗参数

以下是部分代码:

 /*** 利用系统弹窗实现悬浮窗** @param mContext*/private void initSystemWindow(Context mContext) {windowManager = SystemUtils.getWindowManager(mContext);WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();wmParams.packageName = mContext.getPackageName();wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_SCALED| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;if (float_window_type == FLOAT_WINDOW_TYPE_DIALOG) {//wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;wmParams.type = WindowManager.LayoutParams.TYPE_TOAST;} else if (float_window_type == FLOAT_WINDOW_TYPE_ALERT_WINDOW) {//需要权限wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;}wmParams.format = PixelFormat.RGBA_8888;wmParams.gravity = Gravity.START | Gravity.TOP;wmParams.width = floatViewParams.width;wmParams.height = floatViewParams.height;wmParams.x = floatViewParams.x;wmParams.y = floatViewParams.y;floatView = new FloatWindowView(mContext, floatViewParams, wmParams);windowManager.addView((View) floatView, wmParams);}

二,顶级view添加悬浮窗

demo中还提供了另外一种优雅的实现方式,无需申请权限,任意界面都可以显示悬浮窗,此弹窗,无需申请权限,可以拖动,缩放,关闭,点击,没有兼容性问题,限于app内部,可以在BaseActivity中注入。

/*** 直接在activity根布局添加悬浮窗** @param mContext*/private void initCommonFloatView(Context mContext) {floatView = new FloatView(mContext, floatViewParams);View rootView = activity.getWindow().getDecorView().getRootView();contentView = (FrameLayout) rootView.findViewById(android.R.id.content);contentView.addView((View) floatView);}

基本上可以满足大部分的需要,仅供参考。

duqian2010@gmail.com

详细代码,请移步我的Github,请star一下表示支持噢:
Android-FloatWindow

FloatWindow-优雅实现Android悬浮窗相关推荐

  1. Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了

    机型多杂,适配无法完全兼容,不如换种实现方式,性能比悬浮窗好,不需要权限,效果更好:https://blog.csdn.net/m0_38058826/article/details/10399339 ...

  2. android悬浮窗语音识别demo

    带有android悬浮窗的语音识别语义理解demo 如发现代码排版问题,请访问CSDN博客 Android桌面悬浮窗实现比较简单,本篇以一个语音识别,语义理解的demo来演示如何实现android悬浮 ...

  3. Android 悬浮窗功能的实现

    前言 我们大多数在两种情况下可以看到悬浮窗,一个是视频通话时的悬浮窗,另一个是360卫士的悬浮球,实现此功能的方式比较多,这里以视频通话悬浮窗中的需求为例.编码实现使用Kotlin.Java版本留言邮 ...

  4. Android悬浮窗的简单实现

    1. 前言 现在很多应用都有小悬浮窗的功能,比如看直播的时候,通过Home键返回桌面,直播的小窗口仍可以在屏幕上显示.下面将介绍下悬浮窗的的一种简单实现方式. 2.原理 Window我们应该很熟悉,它 ...

  5. Android悬浮窗的实现

    Android悬浮窗的实现 *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本文也发布于本人的知乎文章:https://zhuanlan.zhihu.com/p/39421112 ...

  6. Android悬浮窗原理解析(Window)[源码]

    悬浮窗,在大多数应用中还是很少见的,目前我们接触到的悬浮窗,差不多都是一些系统级的应用软件,例如:360安全卫士,腾讯手机管家等:在某些服务行业如金融,餐饮等,也会在应用中添加悬浮窗,例如:美团的偷红 ...

  7. 安卓java浮层不响应点击事件,Android悬浮窗屏蔽悬浮窗外部所有的点击事件的实例代码...

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

  8. Android展开悬浮窗功能,Android 悬浮窗 (附圆形菜单悬浮窗)

    序言 Android悬浮窗的实现,主要有四个步骤: 1. 声明及申请权限 2. 构建悬浮窗需要的控件 3. 将控件添加到WindowManager 4. 必要时更新WindowManager的布局 一 ...

  9. android动态获取悬浮窗,Android 悬浮窗实现

    Android悬浮窗实现中需要注意的两点是 1.Android 6.0之后的悬浮窗动态申请 2.Window 的type属性在Android8.0前后的适配 public abstract class ...

  10. Android悬浮窗开启 适配所有机型(附源码)

    Android悬浮窗开启 适配所有机型(附源码) 1.开启悬浮窗权限 清单文件中添加: <uses-permission android:name="android.permissio ...

最新文章

  1. java equal hashcode_Java(二)equal 和 hashcode使用
  2. “夸夸机器人”App来了:变身百万粉丝大V,48万人给你的帖子点赞
  3. Maltego发布新版本4.2.18
  4. centos7下nginx配置
  5. Android之多线程----异步消息处理机制之Handler详解
  6. Django REST framework 视图
  7. printstream_Java PrintStream clearError()方法与示例
  8. 【OpenCV 例程200篇】69. 连续非周期信号的傅立叶系数
  9. smarty中英文多编码字符截取乱码问题
  10. Java基础---代码块和final关键字
  11. Android TableLayout 表格布局
  12. android edittext格式验证,EditText实现输入限制和校验功能实例代码
  13. arcpy:TIF/IMG上色后转KMZ文件
  14. 分享NI卸载工具(免费)
  15. 揭秘seo快排原理,seo快排流量
  16. Civil 3D 2012 SP 2.1发布了
  17. 传奇服务端服务端运行7个窗口的各窗口功能讲解
  18. 2018总结,2019展望
  19. 解决https://start.spring.io/连接不上的问题
  20. VMware+Ubuntu18.04详细安装教程

热门文章

  1. 查询 MySQL 字段注释的 5 种方法
  2. QT——可视化界面ui
  3. netsh interface portproxy本地ip与端口映射及本地虚拟ip(windows)
  4. axure form列表_AxureRP教程
  5. 云原生到底是什么?一文了解云原生四要素!
  6. 计算机教师个人业绩成果自述,申报中学信息技术高级教师职称晋升个人业绩成果自述.docx...
  7. Atcoder Grand Contest 005 题解
  8. Python正则表达式re库
  9. SVN上传、更新、添加、删除文件、版本回退
  10. linux系统宝塔安装nodejs,node安装,nodejs安装,Windows nodejs安装,Linux nodejs安装