目录
7.2.7 ImageFilterButton和ImageFilterView
7.2 辅助类
ConstraintLayout 为解决布局嵌套过深问题,提供了以下实用辅助控件,助力开发者更高效地进行布局。
7.2.1 Guideline(辅助线)
(1)作用
类似设计稿里的参考线,用于辅助定位控件,自身不可见。可设置水平或垂直方向,通过百分比、固定距离等方式确定位置,让控件对齐更灵活,避免为了特定对齐嵌套额外布局。
(2)优势
比如实现多个控件垂直方向等距排列,用水平辅助线按百分比划分区域,控件对齐辅助线,无需嵌套线性布局去设置权重,简化结构。
(3)使用
android:orientation="horizontal|vertical" <!-- 辅助线的对齐方式 -->
app:layout_constraintGuide_percent="0-1" <!-- 距离父级宽度或高度的百分比(小数形式) -->
app:layout_constraintGuide_begin="" <!-- 距离父级起始位置的距离(左侧或顶部) -->
app:layout_constraintGuide_end="" <!-- 距离父级结束位置的距离(右侧或底部) -->
7.2.2 Barrier(屏障)
(1)作用
根据多个控件的边界(左、右、上、下等)动态确定自身位置,作为 “屏障” 让其他控件对齐到它,适配不同内容长度的控件布局。
(2)优势
像评论列表,头像、昵称、评论内容长度不固定,用屏障基于头像和昵称的右侧确定位置,让评论内容统一对齐屏障,无需嵌套复杂布局适配不同长度。
(3)使用
当我们创建布局时,有时会遇到布局可以根据本地化而更改的情况。这里借助有一个非常简单的例子:
constraintlayout网站中的例子,可以直接访问链接进行查看。
7.2.3 Group(组)
(1)作用
可将多个控件归为一组,统一控制它们的可见性,不用逐个设置控件 visibility
,简化显示 / 隐藏逻辑。
(2)优势
比如表单提交成功后,隐藏 “提交按钮、输入框” 等多个控件,用 Group 关联后一键隐藏,比遍历设置每个控件可见性更高效,也避免布局嵌套去包裹这些控件统一控制。
(3)使用
app:constraint_referenced_ids="id,id" <!-- 加入组的控件id -->
7.2.4 Placeholder(占位符)
(1)作用
预先占好位置,运行时可将其他控件 “替换” 到该位置,用于动态切换不同控件显示,保持布局结构稳定。
(2)优势
如页面有多种状态(加载中、内容、空数据),用占位符提前占好内容区域位置,不同状态切换对应控件替换到占位符,无需嵌套多个布局切换显示,让布局更简洁。
(3)使用
7.2.5 Flow(流式虚拟布局)
Flow 是 Android ConstraintLayout 2.1.0 版本引入的强大辅助布局工具,用于解决复杂的流式布局问题。它本质上是一个虚拟容器,可以将一组控件按照流式排列(类似 FlexboxLayout
或 LinearLayout
的 wrap_content 效果),同时保持 ConstraintLayout 的约束能力。
(1)核心特性
-
流式排列:控件会按照添加顺序自动换行/列,避免手动计算位置。
-
支持多方向
-
水平方向:控件从左到右排列,超出宽度时自动换行。
-
垂直方向:控件从上到下排列,超出高度时自动换列。
-
-
灵活的对齐方式:支持
start
、end
、center
、space_around
、space_between
等对齐模式。 -
与 ConstraintLayout 无缝集成:Flow 本身不可见,只负责排列控件,控件仍受 ConstraintLayout 约束管理。
(2)使用
Flow
的constraint_referenced_ids
关联的控件是没有设置约束的,这一点和普通的链是不一样的,这种排列方式是Flow
的默认方式none
。
链约束
链约束决定了流式布局中,控件超出一行 / 列时的换行 / 列规则,通过 app:flow_wrapMode
设置,核心模式有三种。
app:flow_wrapMode="none|chain|aligned"
链约束模式 | 效果描述 | 适用场景示例 | |
---|---|---|---|
none (默认) | 所引用的view形成一条链,水平居中,超出屏幕两侧的view不可见 | 控件数量少、明确希望强制在单行/列显示时用,比如固定数量的标签导航 | ![]() |
chain | 所引用的view形成一条链,超出部分会自动换行,同行的view会平分宽度 | 需要自动换行且每行控件均匀分布的场景,比如动态加载的标签列表、商品卡片流式排列 | ![]() |
aligned | 所引用的view形成一条链,但view会在同行同列。 | 对布局规整度要求高的场景,比如图片网格、表单多列排版 | ![]() |
对齐约束
上面展示的都是相同大小的view
,那么不同大小view
的对齐方式,Flow
也提供了相应的属性进行配置。
app:flow_verticalAlign="top|bottom|center|baseline" <!-- 顶对齐、底对齐、中心对齐、基线对齐 -->
app:flow_horizontalAlign="start|end|center" <!-- 开始对齐、结尾对齐、中心对齐 -->
数量约束
数量约束通过 app:flow_maxElementsWrap
实现,用于限制每行 / 列最多显示的控件数量,超出则自动换行 / 列。
7.2.6 Layer(层布局)
Layer
继承自ConstraintHelper
,是一个约束助手,相对于Flow
来说,Layer
的使用较为简单,常用来增加背景,或者共同动画。图层 (Layer
) 在布局期间会调整大小,其大小会根据其引用的所有视图进行调整,代码的先后顺序也会决定着它的位置。
-
如果代码在所有引用
view
的最后面,那么它就会在所有view
的最上面,反之则是最下面。 -
在最上面的时候如果添加背景,就会把引用的
view
覆盖掉。
7.2.7 ImageFilterButton和ImageFilterView
ImageFilterButton
和ImageFilterView
是 Android 开发中,ConstraintLayout
库提供的用于处理图片特效的控件,让开发者能更便捷地实现图片的多样视觉效果。
ImageFilterView的主要功能
<!-- 图片资源与滤镜效果 -->
app:src="" <!-- 基础图片源,作为背景层显示 -->
app:altSrc="" <!-- 替代图片源,作为前景层叠加显示 -->
app:crossfade="0-1" <!-- 前景层透明度,默认0为全透明,1为不透明。altSrc提供的资源将会和src提供的资源通过crossfade属性形成交叉淡化效果。
<!-- 圆角处理 -->
app:round="dimension" <!-- 以固定长度设置圆角半径,取值范围0到size/2 -->
app:roundPercent="0-1" <!-- 以百分比设置圆角半径,取值范围0到1 -->
<!-- 图片变换效果 -->
app:imageZoom="float" <!-- 图片缩放比例,大于1放大,小于1缩小 -->
app:imageRotate="degrees" <!-- 图片旋转角度,以12点钟方向为0度,顺时针增加 -->
app:imagePanX="integer" <!-- 图片在X轴方向的平移距离 -->
app:imagePanY="integer" <!-- 图片在Y轴方向的平移距离 -->
ImageFilterView的其他属性
<!-- 图像色彩调整 -->
app:saturation="float" <!-- 饱和度调整,1为原色,0为灰阶,>1为超饱和 -->
app:brightness="float" <!-- 亮度调整,1为原色,0为黑色,>1为高亮 -->
app:warmth="float" <!-- 色温调整,1为中性,<1为冷色调,>1为暖色调 -->
app:contrast="float" <!-- 对比度调整,1为原色,0为灰色,>1为高对比度 -->
<!-- 图像混合模式 -->
app:overlay="boolean" <!-- 叠加模式,定义alt图像是在原始图像的顶部淡入还是交叉淡入。true为淡入,false为交叉淡入(适用于半透明对象) -->
这些辅助控件与 ConstraintLayout 结合,能大幅减少布局嵌套,让界面结构更扁平,提升渲染性能,也让布局逻辑更清晰、易维护,在处理复杂界面布局时非常实用 。
最后,希望通过这样详细的介绍,大家可以对 Android 应用程序界面的构建以及视图的设置和使用有更清晰的理解。