FloatWindow-优雅实现Android悬浮窗
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悬浮窗相关推荐
- Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了
机型多杂,适配无法完全兼容,不如换种实现方式,性能比悬浮窗好,不需要权限,效果更好:https://blog.csdn.net/m0_38058826/article/details/10399339 ...
- android悬浮窗语音识别demo
带有android悬浮窗的语音识别语义理解demo 如发现代码排版问题,请访问CSDN博客 Android桌面悬浮窗实现比较简单,本篇以一个语音识别,语义理解的demo来演示如何实现android悬浮 ...
- Android 悬浮窗功能的实现
前言 我们大多数在两种情况下可以看到悬浮窗,一个是视频通话时的悬浮窗,另一个是360卫士的悬浮球,实现此功能的方式比较多,这里以视频通话悬浮窗中的需求为例.编码实现使用Kotlin.Java版本留言邮 ...
- Android悬浮窗的简单实现
1. 前言 现在很多应用都有小悬浮窗的功能,比如看直播的时候,通过Home键返回桌面,直播的小窗口仍可以在屏幕上显示.下面将介绍下悬浮窗的的一种简单实现方式. 2.原理 Window我们应该很熟悉,它 ...
- Android悬浮窗的实现
Android悬浮窗的实现 *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本文也发布于本人的知乎文章:https://zhuanlan.zhihu.com/p/39421112 ...
- Android悬浮窗原理解析(Window)[源码]
悬浮窗,在大多数应用中还是很少见的,目前我们接触到的悬浮窗,差不多都是一些系统级的应用软件,例如:360安全卫士,腾讯手机管家等:在某些服务行业如金融,餐饮等,也会在应用中添加悬浮窗,例如:美团的偷红 ...
- 安卓java浮层不响应点击事件,Android悬浮窗屏蔽悬浮窗外部所有的点击事件的实例代码...
Android可以在所有应用上方添加View,就是给WindowManager添加一个View,在创建的View的时候可以给这个View设置LayoutParams(android.view.Wind ...
- Android展开悬浮窗功能,Android 悬浮窗 (附圆形菜单悬浮窗)
序言 Android悬浮窗的实现,主要有四个步骤: 1. 声明及申请权限 2. 构建悬浮窗需要的控件 3. 将控件添加到WindowManager 4. 必要时更新WindowManager的布局 一 ...
- android动态获取悬浮窗,Android 悬浮窗实现
Android悬浮窗实现中需要注意的两点是 1.Android 6.0之后的悬浮窗动态申请 2.Window 的type属性在Android8.0前后的适配 public abstract class ...
- Android悬浮窗开启 适配所有机型(附源码)
Android悬浮窗开启 适配所有机型(附源码) 1.开启悬浮窗权限 清单文件中添加: <uses-permission android:name="android.permissio ...
最新文章
- java equal hashcode_Java(二)equal 和 hashcode使用
- “夸夸机器人”App来了:变身百万粉丝大V,48万人给你的帖子点赞
- Maltego发布新版本4.2.18
- centos7下nginx配置
- Android之多线程----异步消息处理机制之Handler详解
- Django REST framework 视图
- printstream_Java PrintStream clearError()方法与示例
- 【OpenCV 例程200篇】69. 连续非周期信号的傅立叶系数
- smarty中英文多编码字符截取乱码问题
- Java基础---代码块和final关键字
- Android TableLayout 表格布局
- android edittext格式验证,EditText实现输入限制和校验功能实例代码
- arcpy:TIF/IMG上色后转KMZ文件
- 分享NI卸载工具(免费)
- 揭秘seo快排原理,seo快排流量
- Civil 3D 2012 SP 2.1发布了
- 传奇服务端服务端运行7个窗口的各窗口功能讲解
- 2018总结,2019展望
- 解决https://start.spring.io/连接不上的问题
- VMware+Ubuntu18.04详细安装教程
热门文章
- 查询 MySQL 字段注释的 5 种方法
- QT——可视化界面ui
- netsh interface portproxy本地ip与端口映射及本地虚拟ip(windows)
- axure form列表_AxureRP教程
- 云原生到底是什么?一文了解云原生四要素!
- 计算机教师个人业绩成果自述,申报中学信息技术高级教师职称晋升个人业绩成果自述.docx...
- Atcoder Grand Contest 005 题解
- Python正则表达式re库
- SVN上传、更新、添加、删除文件、版本回退
- linux系统宝塔安装nodejs,node安装,nodejs安装,Windows nodejs安装,Linux nodejs安装