在屏幕上创建一个浮动试图
首先实现一个功能,在屏幕上创建一个浮窗,创建一个Window,这一步只需要使用WindowManager就可以简单实现,具体步骤如下:
WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
WindowManager mWindowManager= (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);
//设置window
typewmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//半透明
wmParams.format = PixelFormat.TRANSLUCENT;
//调整悬浮窗显示的停靠位置为左侧置顶
wmParams.gravity = Gravity.LEFT | Gravity.TOP;
// 以屏幕左上角为原点,设置x、y初始值,相对于
gravitywmParams.x = 0;
wmParams.y = 0;
//设置悬浮窗口长宽数据
wmParams.width = WindowManager.LayoutParams.MATCH_PARENT;
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
//加载自定义布局
mFloatLayout = (LinearLayout) inflater.inflate(R.layout.window_float_notification, null);
//添加到屏幕上
mWindowManager.addView(mFloatLayout, wmParams);
以上代码就能将一个自定义的试图添加到屏幕原点了。
重点对flag和Type两个属性做一下笔记:
Flag参数表示Window属性。用来控制Window的显示特性
-
FLAG_NOT_FOCUSABLE
表示window不需要获取焦点。也不需要接受各种输入事件。此标记同时会启用FLAG_NOT_TOUCH_MODAL。最终事件会传递给下层具有焦点的View. -
FLAG_NOT_TOUCH_MODAL
系统会将当前window区域以外的单机事件传递给底层的Window,当前区域以内的单机事件则自己处理。 -
FLAG_SHOW_WHEN_LOCKED
开启此模式可以让window出现在锁屏上。
Type表示Window的类型。
Window有三种类型,分别为应用Window(1-99,注:括号内为层级范围),子Window(1000-1999)和系统Window(2000-2999)。Window是分层的,层级大的会覆盖层级小的。
WindowManage所提供的功能很简单,添加View,更新View和删除View(这三个方法定义在ViewManager中,WindowManager继承自此类)。如果要删除WIndow只需要删除它里面的View即可。
给浮动窗口设置拖动功能
Paste_Image.pngWindow的内部机制
待续~
网友评论