Categories 新闻动态

Android应用制作指南

android的应用开发是一个复杂而有趣的过程。当你想要在屏幕上展示你的创意时,首先要理解的就是应用UI的绘制流程。下面我们就以一个简单的例子——`setContentView(R.layout.activity_main)`入手,深入了解Android应用的起始绘制过程。

一开始,通过调用`activity.java_getWindow()`方法获取到的实际上是`PhoneWindow`的实现类。在这里,我们重点讲述一下`public void setContentView(@LayoutRes int layoutResID)`这个方法的内部实现。在其内部的实现中,有以下几个步骤:

1. 初始化窗口装饰条(`initWindowDecorctionBar();`)。
2. 获取布局资源(`mLayoutInflater.inflate(layoutResID, mContentParent);`)。

接下来,为了进一步理解整个流程,我们来看看在`view.java`源码中如何通过一系列方法实现测量、布局和绘制的过程。在这个过程中,有三个主要的方法:`measure`(测量)、`layout`(布局)、`draw`(绘制)。

首先,我们从`View.requestLayout()`方法开始,递归地向上查找父容器,最终找到`DecorView`(是`PhoneWindow`的内部类,继承自帧布局)。在`PhoneWindow`源码中,我们可以看到:`(com.android.internal.policy Overrides public void setContentView(int layoutResID) { Note: FETURE_CONTENT_TRANSITIONS may be set in the process of installing the window // decor, when the theme attributes and the like are crystalized. Do not check the feature before this happens.)`

在执行了`DecorView`的`ViewRootImpl`类的`performTranversal()`方法之后,我们就可以理解下面几个关键的步骤:

1. `performMeasure()`:执行该方法的目的是测量视图树的大小。
2. `performLayout()`:该方法负责将已经计算出来的大小应用到视图树上,摆放其中的子控件。
3. `performDraw()`:最终绘制出屏幕上的UI。

接下来,我们将重点介绍`measure`过程。在XML文件中的`width`和`height`属性中,我们通常会看到如`match_parent`、`wrap_content`或者具体的数值。这些值实际上都是通过前缀作为测量模式和后缀作为一个参考值来确定的。常见的模式有:

- `EXACTLY`: 精确的尺寸,比如1dp和`match_parent`。
- `AT_MOST`: 根据父容器的当前大小以及指定的尺寸参考值来确定尺寸。
- `UNSPECIFIED`: 指定的值未指定,通常与`ScrollView`、`ListView`一起使用。

在执行测量过程中,会遍历整个视图树,然后依次测量每个视图的真实尺寸。最终调用`setMeasuredDimension(w, h)`来确定自己的宽高。

总的来说,Android应用开发中的UI绘制流程是一个复杂的过程,包含了多个步骤和细节。了解这些过程不仅有助于我们优化应用的性能,还有助于我们在未来的开发中更加得心应手。