for view安卓

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 安卓 正文

什么是 View?

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

for 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

这是一个非常重要的区别:

for view安卓
(图片来源网络,侵删)
  • View: UI 的基本单元,它没有子视图,一个 TextView 本身不能再包含其他 View。
  • ViewGroup: View 的一个特殊子类,它的作用是作为其他 View 的容器,用来组织和管理子 View 的布局。LinearLayoutRelativeLayout 都是 ViewGroup

简单记忆:

  • 能放东西的(布局)是 ViewGroup
  • 不能放东西的(控件)是 View

如何使用 View?

主要有两种方式:XML 布局文件Java/Kotlin 代码,在实际开发中,我们通常使用 XML 来定义布局,使用代码来动态操作。

1 在 XML 中定义 View (推荐)

这是最常用、最清晰的方式,你可以在 res/layout/ 目录下的 XML 文件中声明你的 UI。

示例 (activity_main.xml):

for view安卓
(图片来源网络,侵删)
<?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 被添加到窗口或其可见性、尺寸发生变化时,它会经历一个核心的三步流程:

  1. Measure (测量)

    • 目的: 确定 View 的最终尺寸(宽度和高度)。
    • 过程: View 会调用 measure() 方法,该方法会调用 onMeasure(),在 onMeasure() 中,View 会根据其布局参数(LayoutParams)和父容器的约束,计算自己的大小。
    • 模式: 测量模式有三种:
      • EXACTLY: 精确值。layout_width="100dp"match_parent
      • AT_MOST: 最大值。layout_width="wrap_content",但最大不能超过父容器的宽度。
      • UNSPECIFIED: 不指定,View 想多大就多大(通常用于内部滚动)。
  2. Layout (布局)

    • 目的: 确定 View 在父容器中的位置(坐标 x, y)。
    • 过程: View 会调用 layout() 方法,该方法会调用 onLayout(),在 onLayout() 中,View 会根据测量出的尺寸,为它自己和所有子 View 设置位置。ViewGroup 会递归地为所有子 View 布局。
  3. Draw (绘制)

    • 目的: 将 View 的内容绘制到屏幕上。
    • 过程: View 会调用 draw() 方法,该方法会调用 onDraw(),在 onDraw() 中,View 会使用 Canvas (画布) 和 Paint (画笔) 来绘制自己的背景、文字、图片等。

这个三步流程保证了 UI 能够正确、高效地显示出来。


自定义 View

当系统提供的 View 无法满足你的需求时,你可以创建自己的 ViewViewGroup,这是 Android 开进阶的必备技能。

基本步骤:

  1. 创建一个类继承 ViewViewGroup

    • 如果只是想绘制一个自定义图形(如圆形、曲线),继承 View
    • 如果想创建一个自定义布局容器(如网格布局、流式布局),继承 ViewGroup
  2. 重写关键方法:

    • onMeasure(): 如果你的 View 有特殊的尺寸计算逻辑。
    • onLayout(): 如果你的 ViewGroup 需要特殊布局子 View 的逻辑。
    • onDraw(Canvas canvas): 这是最核心的方法,在这里使用 Canvas API 绘制你的 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 开发能力会一步步得到质的飞跃。

-- 展开阅读全文 --
头像
苹果手机怎么用手机刷机
« 上一篇 前天
电脑启动密码忘了怎么破解?
下一篇 » 前天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]