最近在研究悬浮窗,先展示下效果图
![AndroidStudio悬浮窗 AndroidStudio悬浮窗](https://i-blog.csdnimg.cn/blog_migrate/f6e277e064d3dc7a74273dd4227b921c.jpeg)
![AndroidStudio悬浮窗 AndroidStudio悬浮窗](https://i-blog.csdnimg.cn/blog_migrate/dadd960531d21d186586ceeb0ca8935d.jpeg)
需要掌握的知识有:
- WindowManager类:
- addView方法用于添加一个悬浮窗。
- updateViewLayout方法用于更新悬浮窗的参数。
- removeView用于移除悬浮窗。
- 获取WindowManager对象:
windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- WindowManager.LayoutParams类:
- type值用于确定悬浮窗的类型,一般设为2002,表示在所有应用程序之上,但在状态栏之下。
- flags值用于确定悬浮窗的行为,比如说不可聚焦,非模态对话框等等。
- gravity值用于确定悬浮窗的对齐方式,一般设为左上角对齐,这样当拖动悬浮窗的时候方便计算坐标。
- x值用于确定悬浮窗的位置,如果要横向移动悬浮窗,就需要改变这个值。
- y值用于确定悬浮窗的位置,如果要纵向移动悬浮窗,就需要改变这个值。
- width值用于指定悬浮窗的宽度。
- height值用于指定悬浮窗的高度。
- 对于一个没有被载入或者想要动态载入的界面,使用LayoutInflater.inflate()来载入:
LayoutInflater layoutInflater = LayoutInflater.from(context);layoutInflater.inflate(R.layout.float_window_small, this);
- 发布apk,安装到手机以后,手动开启软件权限(在手机设置中)。
-------------------------------------------------------------------
- MainActivity:点击“创建悬浮窗”按钮,开启Service
![AndroidStudio悬浮窗 AndroidStudio悬浮窗](https://i-blog.csdnimg.cn/blog_migrate/22c638d929fadce1ba3590cbe0026460.jpeg)
- FloatWindowService:创建悬浮窗(设置悬浮窗相关参数、加载xml界面)
- 一般悬浮窗都可以移动:例如360悬浮窗
- getY()是表示Widget相对于自身左上角的y坐标;
- getRawY()是表示相对于屏幕左上角(状态栏左上角)的y坐标值;
- windowManager.updateViewLayout()的原点为状态栏左下角,所以手指按下时纵坐标的值都需要减去状态栏高度。
- 如果手指离开屏幕时,xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,则视为触发了单击事件。
![AndroidStudio悬浮窗 AndroidStudio悬浮窗](https://i-blog.csdnimg.cn/blog_migrate/f6e277e064d3dc7a74273dd4227b921c.jpeg)
![AndroidStudio悬浮窗 AndroidStudio悬浮窗](https://i-blog.csdnimg.cn/blog_migrate/dadd960531d21d186586ceeb0ca8935d.jpeg)
- 获取内存使用百分比:
![AndroidStudio悬浮窗 AndroidStudio悬浮窗](https://i-blog.csdnimg.cn/blog_migrate/596e7f9938ae24b4cf4a919ff50962a7.jpeg)