Activity启动时,view的绘制流程.

  • 经过打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
  • 也是不会执行此方法的.
    */

猜你喜欢

转载自blog.csdn.net/djh2717/article/details/81029570
今日推荐