悬浮窗实现原理:

 悬浮窗要实现,需要用到几个关键的类。

 WindowManager:声明了 addView() 、updateViewLayout()、removeView()三个方法的接口

    要创建出悬浮窗:那就得使用addView(布局对象,布局参数)方法

    要更新悬浮窗的数据,如实现拖动悬浮框:那就得使用updateViewLayout(View,LayoutParams)方法

            通常拖拽是写在布局类的onTouchEvent中的,所以这里通常传入的是updateViewLayout(this,mParams)

            通常悬浮窗显示的数据是要实时更新的,如手机内存情况:可以通过服务开启timer定时执行

    要移除悬浮窗:可以使用removeView(布局对象)方法

而WindowManager是一个接口,所以自然需要去找它的实现类

WindowManagerImpl:是WindowManager一个重要的实现类,它主要用于保存每个图层的数据——View[],ViewRoot[],WindowManager.LayoutParams[]

    但具体操作悬浮窗时不直接使用它,而是使用它的一个内部类

WindowManagerImpl.CompatModeWrapper:实现了WindowManager接口的WindowManagerImpl内部类,用它来实现悬浮窗的操作

    特别之处在,它是不依赖Activity存活的!!所以通过服务和CompatModeWrapper就可以实现悬浮窗!!

    而创建的悬浮窗与Home的交互属性,记录在WindowManager.LayoutParams即可,调用addView(布局,WindowManager.LayoutParams)即可!!

Window.LocalWindowManager:隶属于Activity的窗口管理器,它依然是实现了WindowManger接口,在每个ActivityThread创建一个Activity的时候,都会有一个对应的LocalWindowManger

 

了解了这些之后,实现悬浮窗就不难了,麻烦点在于:

    悬浮窗的必要参数(照抄即可),如mParams.type = WindowManager.LayoutParams.TYPE_PHONE表示悬浮窗在Activity上层,在状态栏下层!

    拖拽的实现:主要是要考虑需要的参数,以左上角为起点计算等

    判断当前是否是桌面:通常需要判断当前是桌面还是其他activity在运行,如果是其他activity在运行的话,就应当将悬浮窗关闭,当是桌面的时候再开启

 

参考两篇博客:

 http://blog.csdn.net/guolin_blog/article/details/8689140

 http://blog.csdn.net/stevenhu_223/article/details/8504058

侧边弹框+淡入淡出效果实现:

 靠PopupWindow的setAnimationStyle(动画资源)方法设置动画效果

 所以:

在res下新建anim目录,将动画的配置文件给定义好

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <set xmlns:andro >
 3 
 4     <!-- 定义从下向上进入的动画 -->
 5     <translate
 6         android:duration="3000"
 7         android:fromYDelta="100%"
 8         android:toYDelta="0" />
 9 
10     <!-- 定义淡入,持续3s完成 -->
11     <alpha
12         android:duration="3000"
13         android:fromAlpha="0.0"
14         android:toAlpha="1.0" />
15 
16 </set>
弹出和淡入效果

相关文章:

  • 2022-01-08
  • 2021-12-08
  • 2021-11-19
  • 2021-12-19
  • 2022-12-23
  • 2021-07-03
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-18
  • 2022-12-23
相关资源
相似解决方案