写这篇文章的原因是因为做项目的时候需要一个类似桌面歌词的悬浮框,然后在实现过程中遇到了一下细节问题
1、首先是明确实现一个悬浮框需要一个WindowManager(单例,管理窗口)和 WindowManager.LayoutParams(确定窗口位置、大小等)
params.flags
Window Widget 为了不影响其他UI的操作,需要对WindowManager.LayoutParams 的params.flags进行设置
1、WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,如果
设置了这两个说明window不影响其他UI的操作,同时也导致window不能监听点击等需要焦点的事件,但是可以接收Touch事件,所以会使用
Touch事件来代替点击事件的处理
2、如果再加上WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE就说明该窗口是不可以操作的!
params.type
用于设置窗口的优先级
params.gravity
这个参数用于确定窗口如何停靠,如果没有设置这个参数(貌似Window会默认设置params.gravity = Gravity.CENTER,
这时params.x和params.y就是相对于Gravity.CENTER指定的边),如果真的没设置那么params.x和params.y就是绝对位置
public int x;
如果忽略gravity属性,那么它表示窗口的绝对X位置。
当设置了 Gravity.LEFT 或 Gravity.RIGHT 之后,x值就表示到特定边的距离。
public int y;
如果忽略gravity属性,那么它表示窗口的绝对Y位置。
当设置了 Gravity.TOP 或 Gravity.BOTTOM 之后,y值就表示到特定边的距离。
params.width 、params.height
当设置为 WindowManager.LayoutParams.MATCH_PARENT,那么params.x(or params.y)的值设置之后也没有效果!
如果为WindowManager.LayoutParams.WRAP_CONTENT则params.x(or Params.y)的值有效,而且window的大小会根
据params.x(params.y)来设置