一、简单概括
-
View(视图):是所有 UI 组件的基类。它是一个可以在屏幕上绘制某样东西并与用户交互的矩形区域。比如一个按钮 (
Button)、一个文本框 (TextView)、一张图片 (ImageView) 都是一个View。它们是单一的、不可再分的控件。 -
ViewGroup(视图组):是
View的一个特殊子类。它本身是一个不可见的容器,它的职责是容纳和管理多个View或其他的ViewGroup。比如线性布局 (LinearLayout)、相对布局 (RelativeLayout)、帧布局 (FrameLayout) 等都是ViewGroup。它决定了其子视图的排列和布局方式。
二、详细解释
1. View(视图)
a. 本质:
一个 View 对象占据屏幕上的一个矩形区域。它负责两件核心事情:
-
绘制 (Draw):在
onDraw()方法中,通过Canvas和Paint对象将自己绘制到屏幕上。例如,Button会绘制背景、文字和点击效果。 -
事件处理 (Event Handling):响应用户的交互,如触摸、点击、键盘输入等。它通过
onTouchEvent(),onKeyDown()等方法来处理这些事件。
b. 属性:
每个 View 都拥有一系列属性来控制其外观和行为,这些属性通常在 XML 布局文件中设置,也可以在代码中动态修改。常见属性包括:
-
尺寸 (Size):
layout_width,layout_height -
ID:
id -
边距 (Margins):
layout_margin... -
内边距 (Padding):
padding... -
背景 (Background):
background -
可见性 (Visibility):
visibility -
...以及大量控件特有的属性,如
TextView的text,textColor,textSize等。
2. ViewGroup(视图组)
a. 本质:
ViewGroup 继承自 View,这意味着它本身也是一个 View,拥有 View 的所有特性(可以被绘制、可以响应事件)。但它的核心功能是作为其他视图的容器。
b. 职责:
-
容纳子视图 (Contain Children):通过
addView()等方法添加子View。 -
测量子视图 (Measure Children):在布局过程中,
ViewGroup会测量每个子视图的大小(调用子视图的onMeasure()方法)。 -
布局子视图 (Layout Children):根据自身的布局规则(如线性排列、相对位置等),决定每个子视图在屏幕上的具体位置(调用子视图的
onLayout()方法)。 -
管理子视图交互:处理子视图之间可能的事件分发和冲突。
c. 布局管理器 (Layout Managers):
ViewGroup 的具体功能由其子类(各种布局)实现,这些子类被称为布局管理器。常见的包括:
-
LinearLayout:将子视图按水平或垂直方向线性排列。
-
RelativeLayout:子视图的位置是相对于父容器或兄弟视图来确定的。
-
FrameLayout:将所有子视图堆叠在左上角,通常用于放置单个视图或作为碎片(
Fragment)的容器。 -
ConstraintLayout:功能最强大的布局,通过约束关系灵活地定义视图位置,可以创建扁平化、高性能的复杂布局。
-
RecyclerView / ListView / GridView:用于高效地显示和管理大量数据的列表或网格。
d. 嵌套 (Nesting):
ViewGroup 可以包含其他 ViewGroup,这就形成了视图层级的嵌套。例如,一个垂直的 LinearLayout 里可以包含一个水平的 LinearLayout 和一个 Button。
三、核心关系与工作原理
-
继承关系:
ViewGroup是View的子类。这意味着在任何需要View的地方,你都可以传递一个ViewGroup(“是一个”的关系)。 -
组合关系:
ViewGroup内部包含和管理着多个View(“有一个”的关系)。 -
视图树 (View Tree):整个 Activity 的界面构成了一棵视图树。树的根节点是一个
DecorView(它本身是一个FrameLayout),树干和树枝是各种ViewGroup,树叶则是最终的View(如Button,TextView)。 -

-
布局流程 (Layout Pass):当界面需要绘制时,系统会遍历这棵视图树两次:
-
测量流程 (Measure Pass):从根节点开始,自上而下地遍历,每个
ViewGroup根据规则测量其子视图的尺寸。最终确定每个视图的getMeasuredWidth()和getMeasuredHeight()。 -
布局流程 (Layout Pass):同样自上而下,每个
ViewGroup根据测量结果和自身规则,设置每个子视图的位置(left,top,right,bottom)。
-
四、结与类比
一个非常贴切的类比是 “俄罗斯套娃” 或 “盒子里的东西”:
-
View:就像是套娃中最小的那个实心娃娃,或者盒子里的一个具体物品(比如一个玩具小车、一个苹果)。它是一个具体的、不可再分的东西。 -
ViewGroup:就像是一个空心的、更大的套娃,或者一个盒子、一个箱子。它本身也是一个“东西”(继承自View),但它的主要价值在于它能容纳和组织其他更小的套娃或物品。
| 特性 | View | ViewGroup |
|---|---|---|
| 本质 | 单一的 UI 控件 | 其他 View 的容器 |
| 继承关系 | 是所有 UI 组件的基类 | 继承自 View |
| 功能 | 绘制自身、处理用户交互 | 容纳、测量、布局其子视图 |
| 可见性 | 通常是可见的 | 本身通常是不可见的(只是一个布局框架) |
| 示例 | Button, TextView, ImageView | LinearLayout, RelativeLayout, ConstraintLayout |
727

被折叠的 条评论
为什么被折叠?



