对window和view显示的理解

    很多时候都搞不清window和view之间的关系,今天重新看了一下api和源代码,终于又有多点认识了。其实window没有继承其他类,它是object的直接子类,这和iPhone中window和view的关系不同。window是抽象类,由系统内部实现,我们通常实例化不了。window其实是对view的包装,提供更多的特性,比如标题、进度条等,可通过requestFeature(int id)方法进行设置。

    每个activity都包含一个window, 它的内部实现是PhoneWindow, 要添加新的window在activity中,则通过WindowManager来实现,调用addView(View view, LayoutParams lp)方法, lp是WindowManager.LayoutParams, lp有许多参数可以进行设置,而且都是public来的,主要有x, y, width, height, flags等,详细说明可以参看api文档和源代码。

    总的来说,我们看到的ui界面还是通过view来实现的,window只是对其进行了包装作了其他额外的处理,或者说,它是把view和WindowManager.LayoutParams绑定了一起,看看Dialog的实现就清楚了。window是不能实例化的,不过可以通过WindowManager的addView, removeView方法来增加或删除。真正的window貌似在android里有2个,一个是activity的PhoneWindow, 另一个是dialog的MidWindow, 在activity里增加其他window就直接是view了。PhoneWindow在activity里显示的是它的DecorView, 它是一个FramwLayout, 调用activity的setContentView方法设置的view其实是DecorView下的一个子view, activity里view的结构层次可通过hierarchyviewer工具查看。估计这个DecorView最终也是通过WindowManager的addView方法才显示在屏幕上的,WindowManager的实现是WindowManagerImpl, 它里面每个view对应一个ViewRoot, ViewRoot通过setView方法才把把view显示出来。所以,ViewRoot才是最终实现view显示的类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值