约束布局详解

📅 2026/7/4 22:26:08 👁️ 阅读次数 📝 编程学习
约束布局详解

布局优化是我们在开发中常常遇到的问题。我们知道布局越复杂嵌套层次越深则加载它的开销越大,性能越差。约束布局是我们在进行布局优化时经常会考虑使用的方式。

约束布局不仅提供了一些如百分比布局、角度定位、辅助线等一些好用的工具,帮助我们可以轻松实现一些效果。最主要的是,它使得布局扁平化,减少了布局的层次,从而提升了加载布局的效率。

1、建立约束

约束布局主要跟其他控件建立约束,以确定自身的位置。看一个简单的例子,文本框跟父布局建立约束,达到在父布局居中的效果。

它有四个方向,分别是start、end、top和bottom。下面的例子,预览图上四个像弹簧一样的东西就是表示约束的建立。相对的方向上约束力默认是一样的,因而文本框可以刚好处在父布局中间的位置。可以想象成两根弹簧的拉力。当然这个力可以设置为不同大小,布局位置就会发生改变,这个后面再讲。

除了和父布局建立约束,任意布局间都可以建立约束关系。

建立一个TextView让他依赖到前一个TextView的左边。

如app:layout_constraintStart_toEndOf="@id/textView1",属性表示建立约束关系。一个约束属性有两个方向。

最后一个下划线左边的方向(Start)表示需要建立约束的控件的自身的方向。下划线右侧(End)表示约束目标控件(textView1)的方向。

Start和End 实际上分别表示左和右。但是为了兼容自右向左的语言因而用Start和End。在自右向左的语言,则Start表示右,End表示左。约束布局这样定义,我们就不需要考虑语言的方向问题。

前面说过当两边约束力相同,则控件出现居中的效果。使用这种特性可以很容易实现一个控件相对另一个控件水平居中。

如下图,让TextView2的上下分别依赖到TextView1的上下,则可以轻松实现TextView2相对TextView1水平居中的效果。

2、约束属性

充满约束

约束布局中如果需要一个控件的尺寸依赖于它所约束的空间。比如上面TextView2的宽度想要跟随TextView1的高度。则可以指定TextView2的高度为“充满约束”--设置高度属性值为0dp

TextView2的高度将和TextView1保持一致。如果此时TextView2的上下分别依赖到父布局,则相当于充满父布局,等同于match_parent属性。

布局权重

约束布局没有专门的权重属性,它是使用layout_constraintHorizontal_weight进行权重方式布局,当然这是水平方向权重,它还有垂直方向权重属性。使用权重布局也需要设置对应方向上的尺寸为0dp。这点和线性布局是一样的。

通过设置TextView1和TextView2的宽度为0dp,水平方向权重分别为2和1。这两个布局将按照2:1在宽度上完全充满父布局。