Android-XML转成View过程简述

背景

一般我们创建Activity的时候,先是在布局XML中添加好想要的内容。之后,在Activity的java文件中,添加如下代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        }

这样,就完成了将XML布局内容,添加到App中去了。

那么问题来了,Android是怎么实现将XML转换成Activity界面的呢?

分析过程简述:

  1. 调用setContentView方法,加载XML内容。在setContentView方法里面,调用inflate方法,加载XML中的视图内容。如果遇到GroupView对象,递归加载GroupView中视图的内容。最后,形成View树。
  2. View树创建之后,调用rootView的performTraversals方法。此方法内部调用measure(),然后再调用onMeasure()开始真正的View测量,最后将View树中的所有view的大小尺寸,都计算出来。(注:测量的是View的width和height)

    但是,onMeasure()又分为两种情况:

    • 如果是View,列入Button,ImageView等视图,那么onMeasure()方法就是简单的测量出视图的尺寸
    • 如果是GroupView,例如LinearLayout,RelativeLayout等布局视图。那么onMeasure()方法会测量除了自身视图以外,还会调用measureChild()等方法去测量其子视图的尺寸大小。
  3. 测量好各个View的尺寸之后。调用onLayout()方法,遍历所有的子view,确定每一个视图的位置。(注:确定的是位置,即子视图相对于父视图的左上角,左下角,右上角,右下角的位置)
  4. 最后,调用draw()方法。将view树中的内容,根据layout()方法中求出的位置,绘制出来。

将XML转换成Activity界面的就此完成了。

源码分析

Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)

Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

你可能感兴趣的:(xml,android,源代码,布局)