View 和 ViewGroup 的绘制流程

3,647 阅读1分钟
原文链接: www.cnblogs.com

View和ViewGroup

View

  1. View就是用户交互的组件(控件)
  2. View是矩形的
  3. View的职责是绘制和事件处理
  4. View是android所有控件的父类

ViewGroup

  1. ViewGroup是View的一个子类
  2. ViewGroup能够包含其他的view(孩子)
  3. ViewGroup是布局的基类

View和ViewGroup的关系

2. 组合关系

View的绘制流程

xml的实质

  1. 实现布局不一定使用xml
  2. 谷歌给开发者的开发糖,提高开发界面的效率
  3. xml还是会转换代码形式创建界面

控制View的大小 测量

  1. measure -> onMeasure
  2. 找出控件的大小
  3. 真正的测量工作在onMeasure方法里面
  4. onMeasure方法里面必须调用setMeasuredDimension();
  5. setMeasuredDimension保存测量的宽高的值mMeasuredWidth,mMeasuredHeight

控制View的位置 布局

  1. layout
  2. 四个位置l, t, r, b 相对于父容器
  3. layout->setFrame 完成了对四个成员变量的赋值mLeft, mTop, mRight, mBottom
  4. 父容器发起孩子的布局,调用孩子layout方法,传入四个位置

View的绘制 绘制

  1. draw - > onDraw
  2. 要去实现onDraw方法绘制控件

ViewGroup的绘制流程

ViewGroup继承自View,绘制流程遵循View的绘制流程

ViewGroup的测量

相同点:measure -> onMeasure
不同点:作为一个父容器,需要去测量孩子,拿到孩子申请的宽高,打包成对孩子的期望,去测量孩子(child.measure)

ViewGroup的布局

相同点:layout(l, t, r, b)
不同点:ViewGroup要去覆写onLayout,去布局孩子,调用孩子layout方法,指定孩子上下左右的位置

ViewGroup的绘制

相同点:draw -> onDraw
不同点:ViewGroup一般不会去画自己,ViewGroup默认实现了dispatchDraw去绘制孩子(child.draw)

getWidth和getMeasuredWidth的区别

  1. getWidth = mRight - mLeft, mRight和mLeft只有layout->setFrame才有值
  2. getMeasuredWidth 测量之后才有值