Android 视图、视图组和布局
Android 所有UI组件都是 View 的子类
Layout 被设计为是视图的容器,目的是为了控制子视图怎样处于屏幕的位置
Layout 包含:
ConstraintLayout 约束布局:在 Android 7 引入,这是布局中最推荐使用的布局。ConstraintLayout 允许为每个视图设置简单的约束,以此定义该视图在布局中的位置及其行为。这种布局的灵活性使得复杂布局能够快速轻松地创建,无需相互嵌套其他类型的布局,从而提升了布局性能。
LinearLayout 线性布局:根据所选方向将子视图定位在单行或列中。可以在每个子元素上设置权重值,以指定该子元素相对于其他子元素应该占据多少布局空间。
TableLayout 表格布局:一系列子视图在一个表格格式的行和列中,表中每一行都代表一个 TableRow 对象,每一个 TableRow 又包含一个 cell 对象。
FrameLayout 帧布局:FrameLayout 目的是为了分配屏幕中的区域,通常为了显示一个单独的视图。如果多个子视图被添加到其中,他们互相层叠显示到左上角。通过为每个子视图设置布局重心(或对齐方式),可以实现各个子视图的不同定位。
RelativeLayout 相对布局:相对布局允许子视图通过指定子视图对齐方式和外边距,使其既能相对于彼此定位,也可以相当于包含他们的布局视图的定位。
AbsoluteLayout 绝对布局:允许子视图在被其包含内部指定 X 和 Y 坐标,这种布局灵活性很低
GridLayout 网格布局:GridLayout实例由不可见的线划分,这些线形成一个包含行和列单元格的网格。然后将子视图放置在单元格中,并可以配置为在水平和垂直方向上覆盖多个单元格,从而可以快速轻松地实现各种布局选项。GridLayout中组件之间的间隙可以通过在相邻单元格中放置一种称为Space视图的特殊视图类型来实现,或者通过设置边距参数来实现。
CoordinatorLayout 协调布局:-作为Android设计支持库的一部分引入Android 5.0, CoordinatorLayout是专门为协调应用程序屏幕顶部的应用程序栏与其他视图元素的外观和行为而设计的。当使用Basic Views activity模板创建新activity时,主布局中的父视图将使用CoordinatorLayout实例实现。
View 的层级
每一个 view 在用户界面中都代表一个矩形的显示区域,一个 view 负责在矩形区域里绘制内容,并且对屏幕上该部分发生的事件做出响应。
一个用户界面屏幕由视图层级结构组成,根视图位于树形结构的顶部,子视图位于下方的分支上。
容器视图的子视图显示在其父视图之上,且被限制显示在父视图的显示区域范围内。
ConstraintLayout
要全面理解并使用 ConstraintLayout,掌握以下核心概念至关重要:
• 约束(Constraints)
• 边距(Margins)
• 对立约束(Opposing Constraints)
• 约束偏差(Constraint Bias)
• 链(Chains)
• 链样式(Chain Styles)
• 参考线(Guidelines)
• 组(Groups)
• 屏障(Barriers)
• 流(Flow)
约束
约束布局负责管理其包含的可视组件的位置和调整尺寸的行为。
约束是一系列规则,规定一个组件如何相对于其他组件、包含该组件的约束布局的边界,以及通过一种称为参考线的特殊元素,来设置对齐方式和间距。
约束还规定了一个 Activity 的用户界面的布局,如何去响应设备的方向变化,或如何应对在不同屏幕尺寸设备上显示的情况。为实现合理配置,一个组件必须有足够的约束连接,这样约束布局的布局引擎才能在水平和垂直方向上确定其位置。
边距
边距是一种指定固定距离的约束形式,只设置边距灵活性很低,对于不同尺寸设备和屏幕旋转,需要设置相对约束。
相对约束
作用于单个组件且沿同一轴的两个约束被称为相对约束,也就是说一个组件的左右两端都添加了约束就是水平方向上有了相对约束。
在使用相对约束后,组件的定位就会基于百分比而非坐标
约束偏差
默认情况下,相对约束的权重相等,使得相应组件沿相对轴居中。
在 ConstraintLayout 中设置水平和垂直居中可以使用如下代码:
水平
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
垂直
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
约束偏差使得组件沿相对轴的定位能够按照指定的百分比偏向于某一个约束。
链
约束布局链提供了一种方式,能将两个或更多组件的布局行为定义为一个组来进行设置。
链可以在垂直轴或水平轴上声明,并进行配置,以定义链中组件的间距和尺寸设定方式。
当组件通过双向约束连接在一起时,它们就形成了链
链样式
链样式设置应用到链的头组件,规定了约束布局链的布局行为。
约束布局支持以下链样式:
伸展链 —— 链内包含的组件会在可用空间中均匀分布。这是链的默认行为。
默认就是这样
内部伸展链 —— 链内包含首尾组件组件平均分布,CSS中的 space-between
加权链 —— 允许通过权重属性来定义链中每个组件所占据的空间。
紧凑链 —— 链组成的组件没有间距的放在一起
配置组件尺寸
约束布局提供了三种选项设置到每个独立的组件,去管理调整尺寸的行为
固定:fixed 组件固定大小
匹配约束:Match Constraint 允许组件根据布局引擎调整大小,以满足当前约束条件
内容匹配:根据组件内容自动调整大小
约束设置模式
自动连接模式
可以自动建立约束连接添加到布局上。
自动连接模式使用算法,根据组件的位置以及组件与父布局各边和布局中其他元素的接近程度,来确定要建立的最佳约束条件。
接口模式
接口模式使用一种启发式的方式,这种方式包含算法和改良,在组件已经被添加到布局之后去自动连接约束。
这种模式通常用于自动连接关闭且对象没有添加任何约束连接的情况下。
在 Android 中一个组件的某个锚点连接另一个组件的,但没有选择具体某一边,则会弹出列表,左右两端连接其他组件弹出的是参照 end 和 start,上下是 top 和 bottom
右键点击组件,通过show baseline 可以进行与其他组件的对齐
约束的相关数值信息可以通过这部分修改
约束屏障
约束屏障是一个虚拟的参照元素,它本身并不在界面上显示,主要用于将多个视图组合在一起,并为这些视图提供一个共同的约束参照边界。在组件进行右键单击可设置约束屏障,约束屏障两侧的组件不能越过屏障。
ConstraintSets
ConstraintSets 是 ConstraintLayout 库的一个重要特性,它主要用于管理和应用 ConstraintLayout 中的约束集,能帮助开发者更灵活地动态修改布局约束。
每一个约束布局的实例与一系列的约束建立联系,用于定义子视图的位置和约束。
ConstraintSets 类可以通过 Java 代码进行创建、配置、复制等操作
可以这样创建和设置约束
ConstraintSet set = new ConstraintSet();
set.connect(button.getId(), ConstraintSet.LEFT, editText1.getId(), ConstraintSet.RIGHT, 70);
连接父组件
set.connect(button1.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 100);
一些注意:
1、发现了在使用拖拽方式进行组件的布局设置,自动出现bias=“0.5”,主要是两种原因:居中对齐逻辑和自动约束策略
布局编辑器通常会尝试以一种合理的默认方式来放置和约束组件。当拖拽一个组件到布局中时,如果没有明确指定其在水平或垂直方向上的具体对齐方式等约束,编辑器可能会自动添加 bias="0.5"
2、编辑器有自动约束生成的机制,它会根据组件的位置和周围已存在的组件或布局边界等情况,尝试为组件添加一些默认的约束和属性,bias属性就是其中之一。如果开启自动布局连接会自动出现 bias=“0.5”
3、在使用链式布局方式需要去除指定方向上相对于父组件的约束,否则会和链样式产生冲突