Android的View体系架构是构建用户界面的基础,它定义了如何在屏幕上展示和交互各种UI元素:
一、View的基本概念
- 定义:View是Android中所有UI组件的基类,用于构建用户界面。无论是按钮、文本框、图像等可见元素,还是用于组织其他View的容器,都继承自View类。
- 作用:View的主要作用是展示数据和接收用户的输入。它可以显示文本、图片、动画等内容,并响应用户的点击、滑动、手势等操作。
二、View的位置参数和属性
- 位置参数: View的位置主要由四个顶点决定,分别是左上角纵坐标(top)、左上角横坐标(left)、右下角横坐标(right)和右下角纵坐标(bottom)。 这些参数都是相对于View的父容器来说的。
- 其他属性:
- Width和Height:表示View的宽度和高度,可以使用具体的像素值或特定的布局参数(如wrap_content、match_parent)。
- Background:设置View的背景,可以是颜色、图片或其他可绘制对象。
- Padding:设置View内容与边界之间的空白区域。
- Margin:设置View与其他View之间的空白区域。
三、View的层次结构和视图树
- 层次结构: 每个Activity或Fragment都有一个根View,称为根布局。 这个根布局可以包含其他View,而这些View又可以包含其他View,形成一个层次结构,即视图树。
- 视图树的构建: 用代码或XML布局文件来定义这棵视图树。XML布局文件比较直观。
四、View的绘制流程
-
测量阶段(OnMeasure): 系统通过调用View的measure()方法来测量View的大小,确定view自己的宽度和高度,并为其子View提供测量规格。
原理: MeasureSpec(SpecMode + SpecSize),高2位包括EXACTLY(view大小直接由SpecSize决定)、AT_MOST(view ≤ SpecSize,由内容/背景大小决定)、UNSPECIFIED(不限制)。 单个view:调用measure触发onMeasure,传入MeasureSpec信息,调用setMeasureDimension设置自己宽高。 viewgroup:根据自身布局参数和子view的布局参数,计算出子view的MeasureSpec,并传给子view进行测量。
-
布局阶段(OnLayout): 在确定View的大小后,系统会通过调用view.layout()方法来确定View在父View中的位置。这是一个从顶层父View向子View递归调用的过程。
原理: 调用layout触发onLayout,设置view四个边界(左上右下),进一步调用子view的onLayout()
-
绘制阶段(OnDraw): 在布局完成后,系统会调用View的onDraw()方法来绘制View的内容。 原理:(1)调用drawBackground绘制背景; (2)onDraw(canvas)绘制内容(每个子类都复写,自定义view常在这里绘制图形和文本); (3)如果是viewgroup走dispatchDraw绘制子viewgroup,单一view空实现dispatchDraw。
五、自定义View
通过继承View类并重写相关方法、或者添加新的功能和样式,或者组合多个原生控件,来实现自定义的UI组件。
六、View的事件处理
View是用户交互的核心,它负责接收并处理各种输入事件(如点击、触摸、滑动等)。事件处理流程通常涉及到事件的分发、拦截和最终处理。 ViewGroup和View在事件处理中扮演着不同的角色,共同协作以响应用户的输入。
总结来说,Android的View体系架构是一个复杂而强大的系统,它提供了丰富的功能和灵活的扩展性,使得开发人员能够轻松地构建出各种各样的用户界面。