• 目标
  • WindowManager
  • 效果实现

目标

类似于某鱼、某猫直播平台的悬浮窗功能,能够在APP切换到后台后进行播放直播。
是不是很酷炫?
WindowManager很简单就能实现将一个View悬浮在系统上。

WindowManager

WindowManaget是Android最重要的服务之一,WindowManager是全局唯一的。
其将View和屏幕联系起来,用户的交互操作也传递给它,作为桥梁完成逻辑处理与视图的通讯。
常用的也就三个方法:addView(),removeView(),updateViewLayout()。用于添加、删除、更新视图。

1 . 简单的获取WindowManager对象:

// 获取WindowManager对象
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

2 .获取一个View视图

// 获取一个View
mView = LayoutInflater.from(mContext).inflate(R.layout.window_test, null);

3 .创建WindowManager.LayoutParams

      WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();// 设置为始终layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 设置弹出的Window不持有焦点layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 大小layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;// 位置layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;// 设置背景透明layoutParams.format = PixelFormat.TRANSLUCENT;return layoutParams;

4 .显示、隐藏View

// 显示
mWindowManager.addView(mView, mParams);
// 隐藏
mWindowManager.removeView(mView);

WindowManager.LayoutParams参数细节,具体看源码 -_-!!!也可以看这儿

效果实现

一个简单的效果:悬浮在整个系统之上,同时能够随着手指移动Window。

/*** 测试Window** @author fengzhen* @version v1.0, 2017/7/14*/
public class TestWindow {private Context mContext;private final WindowManager mWindowManager;private View mView;private boolean isShowing = false;private WindowManager.LayoutParams mParams;public TestWindow(Context context) {this.mContext = context;// 根据 WINDOW_SERVICE 获取到 WindowManagermWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);}/*** 创建布局参数** @author fengzhen* @version v1.0, 2017/7/14 17:05*/private WindowManager.LayoutParams createWindowParams() {WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();// 设置为始终顶层layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 设置弹出的Window不持有焦点layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 大小layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;// 位置layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;// 设置背景透明layoutParams.format = PixelFormat.TRANSLUCENT;return layoutParams;}/*** 展示弹框** @author fengzhen* @version v1.0, 2017/7/14 17:14*/public void show() {if (isShowing) return;if (mView == null) {mView = LayoutInflater.from(mContext).inflate(R.layout.window_test, null);//如果需要拖动取消下面注释mView.findViewById(R.id.btn_hide).setOnTouchListener(new View.OnTouchListener() {int startX;int startY;int startDownX;int startDownY;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN: // 按下// 手指按下时的坐标位置startX = (int) event.getRawX();startY = (int) event.getRawY();startDownX = (int) event.getRawX();startDownY = (int) event.getRawY();break;case MotionEvent.ACTION_MOVE: // 移动// 移动后的坐标位置int newX = (int) event.getRawX();int newY = (int) event.getRawY();// 偏移量int dx = newX - startX;int dy = newY - startY;// 给偏移量设置边距// 小于x轴if (mParams.x < 0) {mParams.x = 0;}// 小于y轴if (mParams.y < 0) {mParams.y = 0;}// 超出x轴if (mParams.x > mWindowManager.getDefaultDisplay().getWidth() - mView.getWidth()) {mParams.x = mWindowManager.getDefaultDisplay().getWidth() - mView.getWidth();}// 超出y轴if (mParams.y > mWindowManager.getDefaultDisplay().getHeight() - mView.getHeight()) {mParams.y = mWindowManager.getDefaultDisplay().getHeight() - mView.getHeight();}// 更新窗体的坐标mParams.x += dx;mParams.y += dy;mWindowManager.updateViewLayout(mView, mParams);// 重新赋值起始坐标startX = (int) event.getRawX();startY = (int) event.getRawY();break;case MotionEvent.ACTION_UP: // 抬起int upX = (int) event.getRawX();int upY = (int) event.getRawY();// 更新窗体的坐标if (upX < mWindowManager.getDefaultDisplay().getWidth() / 2) {for (int i = 0; i < mWindowManager.getDefaultDisplay().getWidth() / 2; i++) {mParams.x = upX - i;mWindowManager.updateViewLayout(mView, mParams);}} else {for (int i = 0; i < mWindowManager.getDefaultDisplay().getWidth() / 2; i++) {mParams.x = upX + i;mWindowManager.updateViewLayout(mView, mParams);}mParams.x = mWindowManager.getDefaultDisplay().getHeight();}break;default:break;}return true;  // 当有父控件有点击事件时,这里要返回false,不然父控件就拿不到点击事件了}});mParams = createWindowParams();}mWindowManager.addView(mView, mParams);isShowing = true;}/*** 隐藏** @author fengzhen* @version v1.0, 2017/7/14 17:14*/public void hide() {if (!isShowing) return;if (mWindowManager != null && mView != null) {mWindowManager.removeView(mView);isShowing = false;}}
}

WindowManager——悬浮在所有app之上相关推荐

  1. android悬浮窗 tab,Android WindowManager悬浮窗

     Android WindowManager悬浮窗 Android WindowManager悬浮窗的实现代码不难,悬浮窗创建成功后将悬浮悬停在设备的屏幕桌面上.悬浮窗通常使用情况:假设APP需要 ...

  2. 【微信小程序】echarts视图层会悬浮在所有视图之上问题原因

    问题:小程序使用下拉菜单时,echarts视图层会悬浮在所有视图之上问题 项目场景: 小程序使用echarts视图层会悬浮在所有视图之上问题原因 问题描述: 真机调试时小程序使用echarts视图层会 ...

  3. android 让应用悬浮,快速回复+app下载

    快速回复+应用多窗口,在玩游戏或者看视频的时候可以开启悬浮窗口回复消息,不用特意切换后台回复消息非常方便.可以自由调节软件的窗口大小以及位置,无需root就能使用.内存占用小不用担心会对其他应用造型卡 ...

  4. 有什么手机提词软件可以悬浮窗口?

    随着短视频的发展,现在的人们大多都开始自己直播,不管是直播带货还是直播录制,其实都少不了用提词器来提词.一款好用的提词器能帮助我们顺利地完成直播录制,避免我们因为卡词.忘词而让直播陷入尴尬的氛围.因此 ...

  5. android项目小说阅读开发背景颜色,Android 小说阅读护眼模式

    Android 小说阅读护眼模式 实现方案:采用全局dialog 覆盖APP  悬浮在 其他APP之上,给dialog设置护眼色值 自定义护眼模式dialog public class EyeProt ...

  6. Android 小说阅读护眼模式

    Android 小说阅读护眼模式 实现方案:采用全局dialog 覆盖APP  悬浮在 其他APP之上,给dialog设置护眼色值 自定义护眼模式dialog public class EyeProt ...

  7. android 输入法 悬浮窗口,Android EditText悬浮在输入法之上

    Android EditText悬浮在输入法之上 使用 android:windowSoftInputMode="adjustResize" 会让界面整体被顶上去,很多时候我们不需 ...

  8. android添加悬浮窗,在Android中使用WindowManager实现悬浮窗口

    最近在做一个项目的过程中,客户提出要一个能悬浮于所有应用的界面.下图右侧这个界面就是需要实现的悬浮于所有应用之上的视图. 下面就介绍一下如何通过WindowManager来实现这个效果. 通过Wind ...

  9. app小窗口悬浮工具_悬浮助手SoftCircle

    悬浮助手SoftCircle是一款十分非常好的工具类手机app,悬浮助手SoftCircle简洁且强劲,彻底不占运行内存.很感兴趣的朋友们赶紧来下载悬浮助手SoftCircle试试吧! 手机软件详细介 ...

最新文章

  1. iPhone音频播放后台控制
  2. oracle连续周数,详细讲解Oracle数据库的“周数计算”
  3. 神奇的python(一)之python脚本调用shell常用方法
  4. Ubuntu虚拟机及Petalinux开发平台安装
  5. JS Jquery 中 的遍历
  6. Excel怎么将两列数据合并成一列
  7. 苹果严打iMessage垃圾短信
  8. Dilated/Atrous Convolution
  9. 智慧公厕系统让如厕成为一种享受
  10. STM32-SPI资料整理
  11. Java题目训练——年终奖和迷宫问题
  12. C盘扩容,不需要相邻盘清空
  13. 计算机主板diy,DIY电脑配件立即选——主板篇
  14. 计算机毕设(附源码)JAVA-SSM流浪动物救助系统
  15. “传统文化传承人暨未来经济人才研修班”首期在山东省成功举办
  16. Sqlite如何读取CherryTree生成的.ctb文件
  17. 容器网络问题排查常用命令
  18. 网页版电子病历初步完成
  19. AIX下批量替换文件中的字符串 linux替换包含换行符的内容
  20. 计算机一级教程文档ppt,计算机一级word操作教程.ppt

热门文章

  1. java logcat_logcat -- 基本用法
  2. 【JUnit】作自己的测试工具MyJUnit
  3. Roslaunch使用GDB调试
  4. 回归分析(Regression Analysis)
  5. 运输公司对用户计算运费,路程越远,折扣越多,标准如下图
  6. OpenStack常用命令手册
  7. Web前端开发精品课HTML CSS JavaScript基础教程第六章课后编程题答案
  8. openssl 对称加密算法enc命令详解
  9. foreign 磁盘阵列_megaraid报foreign unconf bad一例
  10. 什么时间吃药最好?吃药的最佳时间?