下图讲解了Window在调用 windowManager 添加、删除、更新view的内部机制
附window 添加button的一个调用代码:
//window manage var btntxt = Button(this@RemoteActivity) btntxt.text = "windows test" var layoutParams = WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,3,0,PixelFormat.TRANSPARENT) layoutParams.flags =WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL layoutParams.gravity = Gravity.LEFT layoutParams.x = 100 layoutParams.y = 300 btntxt.layoutParams = layoutParams val wmManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager wmManager.addView(btntxt,layoutParams)
其中重要的两个参数layoutParams构造函数中的flag 及type,flag表示接受touchevent的方式,常用的:Flag_NO_FOCUSABLE(此window不接受任何事件)、flag_no_touch_modal(window范围内有触点自己处理,范围之外的底层window处理)、flag_show_when_locked(可以在锁屏界面显示),type 表示window类型(应用window \子window\系统window)