Android进阶系列0—View的工作流程:measure,layout,draw小结

本文主要来自《Android开发艺术探索》和郭霖 《Android视图绘制流程完全解析,带你一步步深入了解View(二)》 两部分的综合理解。
本文只阐述流程,不讲述细节,大家可以结合上述两部分的细节看。如有问题,欢迎大家在评论区指出,谢谢!
View由ViewRoot完成三大流程。在ActivityThread中,当Activity对象被创建完毕后,DecorView会被添加到Window中,同时创建ViewRootImpl的对象,将其和DecorView关联。
View的绘制流程由ViewRoot的performTraversals()方法调用performMeasure,performLayout,performDraw完成顶级View(即DecorView)的measure,layout,draw。

measure

View的measure要分View和ViewGroup两种情况考虑,对于View我们可以给出通用的measure()方法,但是不同的ViewGroup(指ViewGroup的具体实现类,比如LinearLayout,RelativeLayout等)需求不一样,measure的过程不尽相同,所以ViewGroup给出了可以共用的方法,如measureChildren(),measureChild()等,留出了各ViewGroup实现类自行编写的抽象方法onMeasure()。

View的measure

  1. View的对象调用measure()方法处理传入的MeasureSpec参数(这个参数比较好懂,就不解释了)

  2. measure()方法内调用onMeasure()方法处理MeasureSpec参数

  3. onMeasure()中再调用setMeasuredDimension()方法去设置View的具体宽高值

  4. 宽高值由getDefaultSize()方法将传入的MeasureSpec处理后得到(对于UNSPECIFIED这种情况,宽高值还与getSuggestedMinimumWidth等参数有关,由于这种SPEC_MODE很少用,这里不做讨论)

上述流程代码结构如下:

public final void measure(int widthMeasureSpec, int heightMeasureSpec) {  
    ...
    @Override
    onMeasure(widthMeasureSpec, heightMeasureSpec);  
    ...
}  

protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){
    setMeasuredDimension(getDefaultSize(...),
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值