系列文章解读&说明:
Android Framework 窗口子系统 的 分析主要分为以下部分:
(01)WindowMangerService基础知识
(02)应用进程和WindowManagerService之间的关系
(03)窗口显示次序
(04)确定窗口尺寸
(05)窗口布局说明
(06)窗口动画之Choreographer机制
(07)窗口动画之Animation & Animator
(08)窗口动画之动画系统框架
本模块分享的内容:窗口动画之动画系统
本章关键点总结 & 说明:
导图是不断迭代的,这里主要关注? 左上角 Android 窗口动画系统部分(因为导图是在太大,因此这里做了分层处理)。子导图展开后如下所示:
在这张图??上,我们主要关注下方的动画系统框架即可。一方面从WMS入口开始解读动画系统,了解Animator各种类型和作用,另一方面从解读WindowStateAnimator开始解读了动画关键流程:动画选择和设置、Transformation计算、动画渲染。
1 动画系统框架
这里以Animator为研究入口研究WMS动画子系统框架,即WMS的scheduleAnimationLocked为入口,用于启动动画,代码如下
/** Note that Locked in this case is on mLayoutToAnim */
void scheduleAnimationLocked() {
if (!mAnimationScheduled) {//避免重复发送
mAnimationScheduled = true;
mChoreographer.postCallback(
//处理mAnimator.mAnimationRunnable,mAnimator是WMS所有动画的管理者
Choreographer.CALLBACK_ANIMATION, mAnimator.mAnimationRunnable, null);
}
}
这里专注分析Animator(属于WindowAnimator类)的mAnimationRunnable实现,代码如下:
WindowAnimator(final WindowManagerService service) {
mService = service;
mContext = service.mContext;
mPolicy = service.mPolicy;
mAnimationRunnable = new Runnable() {
@Override
public void run() {
synchronized (mService.mWindowMap) {
mService.mAnimationScheduled = false;
//渲染一帧动画
animateLocked();
}
}
};
}
动画的渲染在animateLocked函数中。WindowAnimator的animateLocked实现如下:
// Locked on mService.mWindowMap.
private void animateLocked() {
if (!mInitialized) {
return;
}
//获取时间戳
mCurrentTime = SystemClock.uptimeMillis();
mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
boolean wasAnimating = mAnimating;
mAnimating = false;
SurfaceControl.openTransaction();
SurfaceControl.setAnimationTransaction();
try {
//遍历,处理旋转动画和窗口的动画
final int numDisplays = mDisplayContentsAnimators.size();
for (int i = 0; i < numDisplays; i++) {
final int displayId = mDisplayContentsAnimators.keyAt(i);
//关键点1:处理AppWindowAnimator动画,更新Transform,影响surface位置
updateAppWindowsLocked(displayId);
DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
//关键点2:处理旋转动画
final ScreenRotationAnimation screenRotationAnimation =
displayAnimator.mScreenRotationAnimation;
if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
mAnimating = true;
} else {
mBulkUpdateParams |= SET_UPDATE_ROTATION;
screenRotationAnimation.kill();
displayAnimator.mScreenRotationAnimation = null;
if (mService.mAccessibilityController != null
&& displayId == Display.DEFAULT_DISPLAY) {
mService.mAccessibilityController.onRotationChangedLocked(
mService.getDefaultDisplayContentLocked(), mService.mRotation);
}
}
}
//关键点3:处理WindowStateAnimator动画,更新Transform值
updateWindowsLocked(displayId);
updateWallpaperLocked(displayId);
final WindowList windows = mService.getWindowListLocked(displayId);
final int N = windows.size();
for (int j = 0; j < N; j++) {
//关键点4:渲染动画,将集合AppWindowAnimator、ScreenRotationAnimator、WindowStateAnimator的Transformation集合到一起
//修改surface的layer、matrix、alpha、等属性,进而实现动画的渲染。
windows.get(j).mWinAnimator.prepareSurfaceLocked(true);
}
}