2024年4月5日发(作者:)

Android窗口管理服务

WindowManagerService显示窗口动画

的原理分析

在前一文中,我们分析了Activity组件的切换过程。从这个过程可以知道,所有参与切换操

作的窗口都会被设置切换动画。事实上,一个窗口在打开(关闭)的过程中,除了可能会设

置切换动画之外,它本身也可能会设置有进入(退出)动画。再进一步地,如果一个窗口是

附加在另外一个窗口之上的,那么被附加窗口所设置的动画也会同时传递给该窗口。本文就

详细分析WindowManagerService服务显示窗口动画的原理。

在Android系统中,窗口动画的本质就是对原始窗口施加一个变换

(Transformation)。在线性数学中,对物体的形状进行变换是通过乘以一个矩阵(Matrix)

来实现,目的就是对物体进行偏移、旋转、缩放、切变、反射和投影等。因此,给窗口设置

动画实际上就给窗口设置一个变换矩阵(Transformation Matrix)。

如前所述,一个窗口在打开(关闭)的过程,可能会被设置三个动画,它们分别是

窗口本身所设置的进入(退出)动画(Self Transformation)、从被附加窗口传递过来的动画

(Attached Transformation),以及宿主Activity组件传递过来的切换动画(App

Transformation)。这三个Transformation组合在一起形成一个变换矩阵,以60fps的速度应

用在窗口的原始形状之上,完成窗口的动画过程,如图1所示。

从上面的分析可以知道,窗口的变换矩阵是应用在窗口的原始位置和大小之上的,因此,在

显示窗口的动画之前,除了要给窗口设置变换矩阵之外,还要计算好窗口的原始位置和大小,

以及布局和绘制好窗口的UI。在前面和这两篇文章中,我们已经分析过窗口的位置和大小

计算过程以及窗口UI的布局和绘制过程了,本文主要关注窗口动画的设置、合成和显示过

程。这三个过程通过以下四个部分的内容来描述:

1. 窗口动画的设置过程

2. 窗口动画的显示框架

3. 窗口动画的推进过程

4. 窗口动画的合成过程

其中,窗口动画的设置过程包括上述三个动画的设置过程,窗口动画的推进过程是

指定动画的一步一步地迁移的过程,窗口动画的合成过程是指上述三个动画组合成一个变换

矩阵的过程,后两个过程包含在了窗口动画的显示框架中。

一. 窗口动画的设置过程

窗口被设置的动画虽然可以达到三个,但是这三个动画可以归结为两类,一类是普

通动画,例如,窗口在打开过程中被设置的进入动画和在关闭过程中被设置的退出动画,另

一类是切换动画。其中,Self Transformation和Attached Transformation都是属于普通动画,

而App Transformation属于切换动画。接下来我们就分别分析这两种类型的动画的设置过程。

1. 普通动画的设置过程

从前面一文可以知道,窗口在打开的过程中,是通过调用WindowState类的成员函

数performShowLocked来实现的,如下所示:

[java] view plain copy 在CODE上查看代码片派生到我的代码片

public class WindowManagerService extends

implements r {

......

private final class WindowState implements State {

......

boolean performShowLocked() {

......

if (mReadyToShow && isReadyForDisplay()) {

......

if (!showSurfaceRobustlyLocked(this)) {

return false;

}

......

applyEnterAnimationLocked(this);

......