整 个Android的窗口机制是基于一个叫做 WindowManager,这个接口可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是View,直接忽略我们以 前的Activity或者Dialog之类的东东。其实我们的Activity或者Diolog底层的实现也是通过WindowManager,这个 WindowManager是全局的,整个系统就是这个唯一的东东。它是显示View的最底层了
API里关于windowmanager的描述
The interface that apps use to talk to the window manager.
程序们(-_-;)用来和window manager对话的接口。它继承了 ViewManager接口(有意思,实现了另一个接口的接口)
所以自然也就集成了ViewManager的三个方法
abstract void addView(View view, ViewGroup.LayoutParams params) //添加视图
abstract void removeView(View view) //移除视图
abstract void updateViewLayout(View view, ViewGroup.LayoutParams params) //升级Viewlayout?
windowmanager有2个静态嵌套类
WindowManager.BadTokenException
Exception that is thrown when trying to add view whose WindowManager.LayoutParams
token
is invalid.
当视图添加一个标志已无效的View时,将会抛出这样一个异常。
(我一开始的时候没有在manifest里添加权限时,也曾经抛出过这个异常)
WindowManager.LayoutParams
重头戏来了,使用windowmanager比较简单,就三个方法,add,move,update
但是在WindowManager.LayoutParams里可以设置View的XML属性,除了基本的width ,height外还有很多,能够进行各种组合配置,完成各种效果
呵呵,详细的可能要慢慢研究了,现在先记个大概的概念框架
如果要用windowmanager来实现一个简单的悬浮窗操作,在获得了windowmanager和windowmanager.LayoutParams之后
接着就要定义一个View对象,并对这个对象进行填充
于是就要用到View.inflate()方法了.
public static View inflate (Context context, int resource, ViewGroup root)
Inflate a view from an XML resource. This convenience method wraps the LayoutInflater
class, which provides a full range of options for view inflation.
用一个XML源填充view.