理解MeasureSpec

250 阅读1分钟

首次加载onMeasure,onLayout,onDraw的流程

  1. Activity的attach()创建了phoneWindow
  2. 在Activity.setContentView调用的是phoneWindow.setContentView和创建了decorView;
  3. 当activity执行onResume时,调用handleResumeActivity把decorView添加到window里了;这里使用WindowManagerGlobal的addView来处理添加流程;
  4. WindowManagerGlobal的addView创建了ViewRootImpl,并且调用它的setView方法;
  5. ViewRootImpl的setView方法里调用了requestLayout,并且调用windowmanagerService把布局参数添加进去了;
  6. ViewRootImpl的requestLayout调用scheduleTraversals方法,接着performTraversals,measure-layout-draw,分别调用onMeasure,onLayout,onDraw

MeasureSpec基本概念

它是32个二进制数组成的, 前2个数表示测量模式,后30个数表示尺寸;

三种模式: MeasureSpec.EXACTLY 对应布局中是March_parent

MeasureSpec.AT_MOST 对应布局中是warp_content

MeasureSpec.UNSPECIFIED 系统使用,忽略它的存在