理解Window和WindowManager

Window标识一个窗口的概念,Window是一个抽行类,它的具体实现是PhoneWindow。创建一个Window是很简单的事,只需要通过WindowManager即可完成。WindowManager是外界访问Window的入口,Window的具体实现位于WindowManagerService中。WindowManager和WindowManagerService的交互式一个IPC过程。Android中所有的师徒都是通过Window来呈现的,不管是Activity、Dialog还是Toast,他们的视图实际上都是附加在Window上的,因此,Window实际是View的实际管理者。View的事件分发机制由Window传递给DecorView,然后再由DecorView传递给我们的View,就连Activity的设置视图的方法setContentView在底层也是通过Window来完成的。

mFloatingButton = new Button(this);
mFloatingButton.setTText("button");
mLayoutParams = new WindowManager.LayoutParams(
    LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,0,0,PixelFormt.TRANSPARENT);
    mLayoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL|LayoutParams.FLAG.NOT_FOCUSABLE|LayoutParams.FLAG_SHOW_WHEN_LOCKED
    mLayoutParams.gravity=Gravity.LEFT|Gravity.TOP;
    mLayoutParams.x=100;
    mLayoutParams.y=300;
    mWindowManager.addView(mFloatingButton,mLayoutParams);

上述代码可以将一个Button添加到屏幕坐标为(100,300)的位置上。
Window的内部机制
Window是一个抽象的概念,每个Window都对应着一个View和一个ViewRootImpl,Window和Vew通过ViewRootImpl来建立联系,因此Window并不是实际存在的,它是以View的形式存在的。这点从WindowManager的定义也可以看出,它提供的三个接口方法addView、updateViewLayout以及removeView都是针对View的,这说明View才是Window存在的实体。在实际使用中无法直接访问Window,对Window的访问必须通过WindowManager。为了分析Window的内部机制,这里从Window的添加、删除以及更新说起。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值