悬浮窗实现原理:
悬浮窗要实现,需要用到几个关键的类。
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>