View生成及绘制流程

1.activity,window,view,viewroot之间的关系

acitvity包含一个phonewindow, phonewindow里面持有一个view的根视图decorview,viewroot既不属于view,也不属于viewgroup,他主要负责跨进程通信。

2.view的生成

acitivtythread的handleLaunchActivity方法里面会调用attach方法,生成一个phonewindow,接着调用setContentview方法生成decorview。一个activity对应一个window和decorview。这时本地的window和decorview已经生成了。然后在handleResumeActivity()方法里,调用addView方法,最终会通过ViewRootImpl里面的mWindowSession.addtodisplay()方法,进行跨进程通信,到WMS里注册。之后会走到performTraversals()方法,进行绘制。具体的绘制流程就是performmeasure进行测量,performlayout进行布局,performdraw进行绘制。

3.理解MeasureSpec

MeasureSpec表示的是一个32位的整形值,它的高2位表示测量模式SpecMode,低30位表示某种测量模式下的规格大小SpecSize。MeasureSpec是View类的一个静态内部类,用来说明应该如何测量这个View。

4.为什么view.post()能保证获取到view的宽高?

因为view.post()方法里有attachInfo的判断,当他为空的时候,会加入到主线程的消息队列中。View.post() 添加的任务的执行是在View绘制任务后才执行,即在View绘制流程结束之后执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值