5分钟告诉你,Activity的视图绘制流程(onMeasure、onLayout、onDraw的调用和参数解释)

本篇主要面对有一定Android基础的同学,但是Android初学者的话,也不要急。在网上可以看到很多文章,会告诉你onMeaure是什么?里面的参数是什么意思?会教你怎么获取MeaSpec的size和mode(Unspecified、Exactly、AtMost)。也会告诉你怎么重写 onLayout,怎么使用layout方法去布局子元素,怎么实现流式布局,自动换行。还有会告诉你重写onDraw(canvas),去玩canvas去绘图,然后你会了解到PathMeasure、Bitmap、Drawable等。

但是我们还是很懵逼,为啥重写这些方法之后就行了呢?ViewGroup的measure和View的measure有啥区别呢?为啥我们有这些困惑?其实是我们的学习路线有点问题。

最好的学习方式都是top-bottom,自顶向下的,你考虑下如果我直接告诉你,onMeasure就是测量函数,里面的Mespec参数就是要通过getMode方法取模式,你是不是很懵逼、很排斥。但是如果我告诉你其实整个Activity视图元素都是在一个窗口里面的(PhoneWindow),窗口有个根View(DecorView),它的展示过程有测量、布局、绘制3个操作(measure, layout, draw),他会遍历他下面所有的View和ViewGroup,ViewGroup又遍历ViewGroup。如果把DecorView看成树的根节点的话,绘制过程就是一个树的深度遍历过程。你想要操作View(控制大小,控制布局,控制样式),其实就是操作onMeasure、onLayout、onDraw。这样讲解是不是就能懂了呀 呀呀!!!


前言

在上篇5分钟告诉你,Activity的生命周期怎么触发的(onCreate onStart onResume onPause onStop onDestroy)(附测试代码)分析Android源码是怎么调用Activity的生命周期中,我们提到了ViewRootImpl的创建,然后通过它的performTraversal,分别执行了perfromMeasure、performLayout、performDraw,来进行遍历所有View树中View节点。

这篇我先提出几个问题,然后咱们带着问题来找答案。

  1. ViewRootImpl是什么,它是什么时候创建的?
  2. DecorView是什么?ViewRootImpl是怎样执行遍历View的过程的?
  3. onMeasure、onLayout、onDraw是什么时候调用的?他们的参数是谁给他们的?

篇幅比较长,通过几个问题查看源码来解读的,请耐心的看。想先大体了解一下的同学,可以直接滑到最后结论。

【转载请注明出处:5分钟告诉你,Activity的视图绘制流程(onMeasure、onLayout、onDraw的调用和参数解释) CSDN 王智博


正片

1.初识DecorView

上篇我们讲解Activity生命周期的时候讲解到,Activity的创建和onCreate的回调是在ActivityThread.performLauchActivity,Activity创建之后,调用attach方法

step1. activity.attach(appContext, this, getInstrumentation(), r.token,...)

activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                     
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值