返回

从绘图到布局,从头到尾理解HenCoder中的View的布局过程

Android

HenCoder 的第二季:自定义 View 第二部分——布局过程的自定义,从这期正式开始了。好像有点小激动。废话少说,直入正题。

之前我说过,自定义 View 最关键的有三个点:绘制、布局和触摸反馈。上一季讲过的绘制,内容虽然多(好像讲了 8 期?),但难度上其实是最简单的……

这一讲我们开始布局。布局对于 UI 来说至关重要。布局可以认为是决定元素位置和尺寸的过程。对于 Android 来说,因为视图树本身就是个树状结构,所以布局就是决定这个树状结构中各个节点的位置和尺寸。

布局这块有很多事情可以讲,这期我决定从最简单最基础的东西开始,就是 View 的 measuredDimension 和 layoutDimension。

对于一个 View 来说,它的 measuredDimension 是它经过 measure() 方法测量后的大小,而 layoutDimension 是它的父 View 在布局时给它分配的大小。顾名思义,measuredDimension 和 layoutDimension 都有宽高两个值。

View 的 measuredDimension 可以通过 getMeasuredWidth() 和 getMeasuredHeight() 这两个方法来获取,而 layoutDimension 可以通过 getWidth() 和 getHeight() 这两个方法来获取。

对于一个自定义 View 来说,它需要根据自己的需要来测量自己的 measuredDimension。我们可以通过 override measure() 方法来实现这一点。

在 measure() 方法中,我们可以根据 View 的特性来决定它的大小。比如,一个 TextView 的大小可以根据它的文本内容来决定,一个 ImageView 的大小可以根据它的图片大小来决定。

一旦 View 的 measuredDimension 确定了,那么它的父 View 在布局的时候就会根据它的 measuredDimension 来决定它的 layoutDimension。

如果 View 的 measuredDimension 和 layoutDimension 不一致,那么 View 的 onSizeChanged() 方法就会被调用。

在 onSizeChanged() 方法中,View 可以根据自己的需要来做一些事情,比如调整自己的内容或者位置。

了解了 View 的 measuredDimension 和 layoutDimension 之后,我们就可以开始讨论一些关于布局的细节问题了。

比如,我们可以讨论一下当 View 的 measuredDimension 和 layoutDimension 不一致时,View 会如何处理。

又或者,我们可以讨论一下当 View 的父 View 的大小改变时,View 会如何处理。

这些问题都是布局中非常常见的问题,我们会在后面的文章中一一讨论。