在谈如何使用onLayout方法前,先简单回忆一下知识点:
View视图结构:
View视图可以是单一的一个如TextView,也可以是一个视图组(ViewGroup)如LinearLayout。
如图:对于多View的视图他的结构是树形结构,最顶层是ViewGroup,ViewGroup下可能有多个ViewGroup或View。
这个树的概念很重要,因为无论我们是在测量大小或是调整布局的时候都是从树的顶端开始一层一层,一个分支一个分支的进行(树形递归)。
View 和位置相关的常用方法:
开发过程中,我们常用到一些诸如 getTop 的方法,这一小节简单地介绍这些方法,说明他们真正的含义。这里需要补充说明的是,这些方法设计到的单位都是 Pixel
,不是 dip 哦。
方法名 | 含义 |
---|---|
getTop | view左上角与父view之间的距离 |
getBottom | 子View右下角距父View顶部的距离 |
getLeft | 子View左上角距父View左侧的距离 |
getRight | 子View右下角距父View左侧的距离 |
下面的图例也说明了这一点。
Layout(源码分析):
Layout的作用就是为整个View树计算实际的位置,而通过刚才对View树的介绍知道,想计算整个View树的位置,就需要递归的去计算每一个子视图的位置(Measure同理)。
而确定这个位置很简单,只需要mLeft,mTop,mRight,mBottom四个值(注意:这4个值是子View相对于父View的值,下面会详细介绍)。
在代码中如何设置这4个值呢?
首先,无论是系统提供的LinearLayout还是我们自定义的View视图,他都需要继承自ViewGroup类,之后必须要做的就是重写onLayout方法(因为在onLayout在ViewGroup中被定义为抽象方法)。
ViewGroup-onlayout:
/**
* 当这个view和其子view被分配一个大小和位置时,被layout调用。