android窗口退出动画,Android Framework 窗口子系统 (08)窗口动画之...

系列文章解读&说明:

Android Framework 窗口子系统 的 分析主要分为以下部分:

(01)WindowMangerService基础知识

(02)应用进程和WindowManagerService之间的关系

(03)窗口显示次序

(04)确定窗口尺寸

(05)窗口布局说明

(06)窗口动画之Choreographer机制

(07)窗口动画之Animation & Animator

(08)窗口动画之动画系统框架

本模块分享的内容:窗口动画之动画系统

本章关键点总结 & 说明:

20190712101608105.png

导图是不断迭代的,这里主要关注? 左上角 Android 窗口动画系统部分(因为导图是在太大,因此这里做了分层处理)。子导图展开后如下所示:

20190712101705357.png

在这张图??上,我们主要关注下方的动画系统框架即可。一方面从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);

}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值