最近在做一个流量统计的,有个悬浮窗会像样点。所以稍微研究了下悬浮窗口的实现:效果图如下:做了个透明背景。。。
- 悬浮窗口需要在主界面出现,就算APP被关闭了,因此悬浮窗口应该用一个service来控制;
- 既然悬浮窗口高于其他应用显示在手机上,那控制悬浮窗口的应该是系统类,其中WindowManger为悬浮窗口主要实现类;
WindowManager:窗口管理器,往窗口上添加和删除一个控件,主要有一下步骤:
(1)首先获取WindowManager对象,
WindowManager mWindowManager=
getApplication().getSystemService(getApplication().WINDOW_SERVICE);
(2)设置悬浮控件的样式,WindowManager对象,对于控件的样式有专门的类进行封装:WindowManager.LayoutParams,
重要的属性和方法:
LayoutParams.x 设置控件默认在屏幕的x轴
LayoutParams.y 设置控件默认在屏幕的y轴
LayoutParams.gravity 设置控件在屏幕的gravity
LayoutParams.format 设置控件在屏幕
LayoutParams.width 设置控件的宽度
……详细请参考API文档
如下:
//获取param对象
WindowManager.LayoutParam wmParams=new WindowManager.LayoutParams();
//调整悬浮窗显示的停靠位置为左侧置顶
wmParams.gravity = Gravity.LEFT | Gravity.TOP;
// 以屏幕左上角为原点,设置x、y初始值
wmParams.x = 0;
wmParams.y = 0;
//设置悬浮窗口长宽数据
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
3、将自定义的view和上面定义的wmParams样式添加到窗口中,作为悬浮窗
LayoutInflater inflater = LayoutInflater.from(getApplication());
//获取浮动窗口视图所在布局
LinearLayout mFloatLayout = (LinearLayout) inflater.inflate(R.layout.flow_window, null);
//添加mFloatLayout
mWindowManager.addView(mFloatLayout, wmParams);
4、移除该悬浮窗
mWindowManager.removeViewImmediate (View view)
“`
自此,可以轻松将一个控件悬浮在手机上,该悬浮窗口会高于一切,无论在任何界面它都会出现,无法比较“智能化”,即只有在手机主界面(一级界面)才显示,其他时候不显示,要怎么做?
思路是:由于我是用悬浮来做手机流量的更新,因此只要更新的时候,我判断一下现在手机显示的界面是否为主界面,如果不是,我就隐藏起来,就可以了。