什么是 View?
在 Android 中,View 是用户界面组件的基本构建块,它占据屏幕上的一个矩形区域,负责绘制自身并处理用户交互(如点击、触摸、滑动等)。

你可以把 View 想象成乐高积木中的一块基础积木,各种各样的 UI 控件,比如按钮、文本框、图片、列表项等,都是 View 的子类或组合。
常见的 View 子类:
TextView: 用于显示文本。ImageView: 用于显示图片。Button: 可点击的文本按钮。EditText: 可编辑的文本输入框。RecyclerView: 高效显示可滚动列表的容器。LinearLayout: 线性布局,子 View 水平或垂直排列。RelativeLayout: 相对布局,子 View 可以相对于其他 View 或父容器定位。
View 的核心概念
1 View 树
一个 Android 界面通常不是单个 View,而是一个由多个 View 组成的视图树,这个树的根节点通常是 DecorView,它包含一个标题栏和一个内容区域(通常是 android.R.id.content区域中再包含各种布局(ViewGroup)和控件(View)。
DecorView (根 View)栏 (包含返回、标题等)
└── android.R.id.content (内容区域)
└── Your Layout ( activity_main.xml)
└── LinearLayout (ViewGroup)
├── TextView (View)
└── Button (View)
2 View vs. ViewGroup
这是一个非常重要的区别:

View: UI 的基本单元,它没有子视图,一个TextView本身不能再包含其他 View。ViewGroup:View的一个特殊子类,它的作用是作为其他 View 的容器,用来组织和管理子 View 的布局。LinearLayout、RelativeLayout都是ViewGroup。
简单记忆:
- 能放东西的(布局)是
ViewGroup。 - 不能放东西的(控件)是
View。
如何使用 View?
主要有两种方式:XML 布局文件 和 Java/Kotlin 代码,在实际开发中,我们通常使用 XML 来定义布局,使用代码来动态操作。
1 在 XML 中定义 View (推荐)
这是最常用、最清晰的方式,你可以在 res/layout/ 目录下的 XML 文件中声明你的 UI。
示例 (activity_main.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/my_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你好,世界!" />
<Button
android:id="@+id/my_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击我" />
</LinearLayout>
关键属性:
android:id: 为 View 唯一标识,方便在代码中引用。android:layout_width: 宽度,常用值有match_parent(填满父容器)、wrap_content(根据内容自适应)、固定值 (如100dp)。android:layout_height: 高度,同上。android:text: 文本内容 (适用于TextView,Button等)。
2 在代码中创建和操作 View
虽然不常用来构建整个 UI,但在某些动态场景下非常有用。
示例 (Kotlin):
// 1. 创建一个 TextView
val textView = TextView(this).apply {
text = "这是用代码创建的文本"
textSize = 18f
setTextColor(Color.BLUE)
}
// 2. 将 TextView 添加到布局中 (添加到 LinearLayout)
// 假设你已经有了一个 LinearLayout 实例,比如通过 findViewById 获取
val myLayout: LinearLayout = findViewById(R.id.my_layout)
myLayout.addView(textView)
// 3. 获取 XML 中定义的 View 并进行操作
val button: Button = findViewById(R.id.my_button)
button.setOnClickListener {
Toast.makeText(this, "按钮被点击了!", Toast.LENGTH_SHORT).show()
}
View 的生命周期与测量、布局、绘制
当一个 View 被添加到窗口或其可见性、尺寸发生变化时,它会经历一个核心的三步流程:
-
Measure (测量)
- 目的: 确定 View 的最终尺寸(宽度和高度)。
- 过程: View 会调用
measure()方法,该方法会调用onMeasure(),在onMeasure()中,View 会根据其布局参数(LayoutParams)和父容器的约束,计算自己的大小。 - 模式: 测量模式有三种:
EXACTLY: 精确值。layout_width="100dp"或match_parent。AT_MOST: 最大值。layout_width="wrap_content",但最大不能超过父容器的宽度。UNSPECIFIED: 不指定,View 想多大就多大(通常用于内部滚动)。
-
Layout (布局)
- 目的: 确定 View 在父容器中的位置(坐标 x, y)。
- 过程: View 会调用
layout()方法,该方法会调用onLayout(),在onLayout()中,View 会根据测量出的尺寸,为它自己和所有子 View 设置位置。ViewGroup会递归地为所有子 View 布局。
-
Draw (绘制)
- 目的: 将 View 的内容绘制到屏幕上。
- 过程: View 会调用
draw()方法,该方法会调用onDraw(),在onDraw()中,View 会使用Canvas(画布) 和Paint(画笔) 来绘制自己的背景、文字、图片等。
这个三步流程保证了 UI 能够正确、高效地显示出来。
自定义 View
当系统提供的 View 无法满足你的需求时,你可以创建自己的 View 或 ViewGroup,这是 Android 开进阶的必备技能。
基本步骤:
-
创建一个类继承
View或ViewGroup。- 如果只是想绘制一个自定义图形(如圆形、曲线),继承
View。 - 如果想创建一个自定义布局容器(如网格布局、流式布局),继承
ViewGroup。
- 如果只是想绘制一个自定义图形(如圆形、曲线),继承
-
重写关键方法:
onMeasure(): 如果你的 View 有特殊的尺寸计算逻辑。onLayout(): 如果你的ViewGroup需要特殊布局子 View 的逻辑。onDraw(Canvas canvas): 这是最核心的方法,在这里使用CanvasAPI 绘制你的 UI。
示例:一个简单的自定义圆形 View
// MyCircleView.kt
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.View
class MyCircleView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
color = Color.RED
style = Paint.Style.FILL
}
// 重写 onDraw 方法进行绘制
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
// 获取 View 的宽高
val width = width
val height = height
// 计算圆心和半径
val centerX = width / 2f
val centerY = height / 2f
val radius = Math.min(width, height) / 2f
// 画一个圆
canvas.drawCircle(centerX, centerY, radius, paint)
}
}
在 XML 中使用自定义 View:
<com.your.package.name.MyCircleView
android:layout_width="200dp"
android:layout_height="200dp" />
View 的高级特性
- 属性动画: 可以平滑地改变 View 的各种属性,如位置、大小、透明度、旋转等。
- 触摸事件处理: 通过重写
onTouchEvent(MotionEvent event)来处理用户的触摸操作。 - View 的状态:
enabled,visibility,focusable等,用于控制 View 的行为。 ViewBinding/DataBinding: 现代 Android 推荐的替代findViewById的方式,可以更安全、更方便地操作 View。
| 特性 | 描述 |
|---|---|
| 核心地位 | Android UI 的基本构建块。 |
| 两种形式 | View (控件) 和 ViewGroup (布局容器)。 |
| 两种使用方式 | XML 定义 (主要方式) 和 代码创建/操作 (动态场景)。 |
| 核心三流程 | Measure (测量) -> Layout (布局) -> Draw (绘制)。 |
| 自定义能力 | 通过继承 View/ViewGroup 并重写 onDraw() 等方法,实现无限可能。 |
掌握 View 是 Android 开发的第一步,也是最重要的一步,从理解它的基本概念到熟练使用 XML 和代码操作,再到能够自定义 View,你的 UI 开发能力会一步步得到质的飞跃。
