[关闭]
@TryLoveCatch 2022-05-07T03:23:47.000000Z 字数 2494 阅读 808

Android知识体系之布局(Layout)

Android知识体系


布局

布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。

两个阶段:测量阶段和布局阶段。

测量阶段

测量阶段,measure() 方法被父 View 调用,在 measure() 中做一些准备和优化工作后,调用 onMeasure() 来进行实际的自我测量。 onMeasure() 做的事,View 和 ViewGroup 不一样:

布局阶段

布局阶段,layout() 方法被父 View 调用,在 layout() 中它会保存父 View 传进来的自己的位置和尺寸,并且调用 onLayout() 来进行实际的内部布局。onLayout() 做的事, View 和 ViewGroup 也不一样:

自定义布局过程

重写布局过程中的相关方法:

重写方式,可以分为三类:

重写 onMeasure() 来修改已有的 View 的尺寸

也就是重写 onMeasure() 来修改已有的 View 的尺寸的具体做法:

  1. 重写 onMeasure() 方法,并在里面调用 super.onMeasure(),触发原有的自我测量;
  2. 在 super.onMeasure() 的下面用 getMeasuredWidth() 和 getMeasuredHeight() 来获取到之前的测量结果,并使用自己的算法,根据测量结果计算出新的结果;
  3. 调用 setMeasuredDimension() 来保存新的结果。

比如说,我们想写一个正方形的ImageView,就可以基于ImageView来把图片修改为正方形:

重写 onMeasure() 来全新定制自定义 View 的尺寸

全新定制尺寸和修改尺寸的最重要区别:
需要在计算的同时,保证计算结果满足父 View 给出的的尺寸限制

父 View 的尺寸限制

由来:开发者的要求(布局文件中 layout_ 打头的属性)经过父 View 处理计算后的更精确的要求;

限制的分类:

方式

  1. 重新 onMeasure(),不用调用super.onMeasure(),并计算出 View 的尺寸;
  2. 使用 resolveSize() 来让子 View 的计算结果符合父 View 的限制(当然,如果你想用自己的方式来满足父 View 的限制也行)。

重写 onMeasure() 和 onLayout()自定义 ViewGroup 的内部布局

定制 Layout 内部布局的方式

重写 onMeasure() 的三个步骤:

计算子 View 尺寸的关键

计算子 View 的尺寸,关键在于 measure() 方法的两个参数——也就是子 View 的两个 MeasureSpec 的计算。

子 View 的 MeasureSpec 的计算方式:

重写 onLayout() 的方式

在 onLayout() 里调用每个子 View 的 layout() ,让它们保存自己的位置和尺寸。

参考

https://hencoder.com/ui-2-1/
https://hencoder.com/ui-2-2/
https://hencoder.com/ui-2-3/

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注