- 经过打log发现,activity的生命周期中,setContentView调用后并不会马上进行view的初次测量和绘制
- 要等到调用onResume之后才会开始测量并且绘制,所以在onCreate和onResume方法中获取一个view的宽高都会是0
- 因此,如果要在Activity的生命周期类获取view的宽高,可以采用以下几种方法:
- 1,view.post()方法,此方法会发送一个消息到消息队列,而此方法执行和handler的post是有区别的
- 2,view的getViewTreeObserve的OnGlobalLayoutListener,在view被布局之后,会被回调,此方法会回调多次,
- 要注意判断.
-
- 通过打log发现,一个Activity的界面的绘制流程如下:
- 1,启动一个Activity后,系统会执行一系列的初始化过程,之后才会走Activity的生命周期.
- 2,在Activity的onCreate的方法内部,当执行到setContentView时,会调用view的构造方法,
- 初始化view的数据(注意和黄油刀没有关系),紧接着会执行到onFinishInflate(在onResume之前执行).
- 3,onCreate方法之后,会接着走到onResume方法内,在onResume方法执行完成之后,此时Activity要
- 马上展示界面供用户操作了,所以这个时候才会开始真正的view的绘制渲染.
- 4,View的绘制渲染过程中:
- ⑴ 会最先执行onAttachedToWindow(此方法执行之后,view的post和handler的
- post将没有区别,如果view没有onAttachedToWindow,view的post的runnable不会发送到MessageQueue
- 而是会由ViewRootImpl的RunQueue执行).
- ⑵ 然后是View的onMeasure执行,此方法执行之后才能获取到View宽高信息(getMeasureXXX).
- ⑶ 测量了view的宽高信息后,会对View进行空间大小分配,所以会走到onSizeChange方法内.
- ⑷ 大小分配完成后,会对view进行布局,从而走到onLayout方法内.(此方法执行之后才能通过getWidth或者
- getHeight获取view分配到的空间大小,绝大多数情况下,这两个方法和getMeasureXXX获取的值一样,
- 但是他们之间的计算原理不同,getMeasureXXX获取的值是在onMeasure方法内部最终调用setMeasureDimension
- 时传入的值,而getXXX获取的是通过view的上下左右边的位置差值计算得到的),onLayout方法执行之后,会首次
- 触发OnGlobalLayoutListener,从而执行onGlobalLayout,所以可以通过此方法在Activity生命周期
- 内获取View的宽高.
- ⑸ 所有的准备工作到此算是结束了,终于开始view的最终绘制,即onDraw!!
- ⑹ 最后,当Activity被销毁,执行了onDestroy之后,会走到View的onDetachedFromWindow,
- 只有当Activity被Destroy之后,才会执行此方法,即使是跳转到另外一个Activity,当前Activity被stop
- 也是不会执行此方法的.
*/
Activity启动时,view的绘制流程.
猜你喜欢
转载自blog.csdn.net/djh2717/article/details/81029570
今日推荐
周排行