上一篇我们我们分析到有VSync信号过来,最后会调用WindowAnimator的animateLocked函数来生成和播放动画,这篇我们我们主要从这个函数开始分析。

animateLocked函数

当VSync信号过来后在WMS中如果调用了scheduleAnimationLocked函数。就会调用animateLocked函数

private void animateLocked(long frameTimeNs) {

......

SurfaceControl.openTransaction();

SurfaceControl.setAnimationTransaction();

try {

final int numDisplays = mDisplayContentsAnimators.size();

for (int i = 0; i < numDisplays; i++) {

final int displayId = mDisplayContentsAnimators.keyAt(i);

updateAppWindowsLocked(displayId);//Activity切入动画

DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);

final ScreenRotationAnimation screenRotationAnimation =

displayAnimator.mScreenRotationAnimation;

if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {

if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {

mAnimating = true;

} else {

......

}

}

// Update animations of all applications, including those

// associated with exiting/removed apps

updateWindowsLocked(displayId);//普通窗口的动画

updateWallpaperLocked(displayId);

final WindowList windows = mService.getWindowListLocked(displayId);

final int N = windows.size();

for (int j = 0; j < N; j++) {

windows.get(j).mWinAnimator.prepareSurfaceLocked(true);//输出动画

}

}

for (int i = 0; i < numDisplays; i++) {

final int displayId = mDisplayContentsAnimators.keyAt(i);

testTokenMayBeDrawnLocked(displayId);

final ScreenRotationAnimation screenRotationAnimation =

mDisplayContentsAnimators.valueAt(i).mScreenRotationAnimation;

if (screenRotationAnimation != null) {

screenRotationAnimation.updateSurfacesInTransaction();

}

mAnimating |= mService.getDisplayContentLocked(displayId).animateDimLayers();

//TODO (multidisplay): Magnification is supported only for the default display.

if (mService.mAccessibilityController != null

&& displayId == Display.DEFAULT_DISPLAY) {

mService.mAccessibilityController.drawMagnifiedRegionBorderIfNeededLocked();

}

}

if (mAnimating) {//继续播放下一帧

mService.scheduleAnimationLocked();

}

mService.setFocusedStackLayer();

if (mService.mWatermark != null) {

mService.mWatermark.drawIfNeeded();

}

} catch (RuntimeException e) {

Slog.wtf(TAG, "Unhandled exception in Window Manager", e);

} finally {

SurfaceControl.closeTransaction();

}

boolean hasPendingLayoutChanges = false;

final int numDisplays = mService.mDisplayContents.size();

for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {

final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx);

final int pendingChanges = getPendingLayoutChanges(displayContent.getDisplayId());

if ((pendingChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {

mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;

}

if (pendingChanges != 0) {

hasPendingLayoutChanges = true;

}

}

boolean doRequest = false;

if (mBulkUpdateParams != 0) {

doRequest = mService.copyAnimToLayoutParamsLocked();

}

if (hasPendingLayoutChanges || doRequest) {

mService.requestTraversalLocked();

}

if (!mAnimating && wasAnimating) {//播放完成重新刷新布局

mService.requestTraversalLocked();

}

}上面函数显示对3种动画(Activity切换动画、屏幕旋转动画、窗口动画)调用其

stepAnimationLocked函数推进(各种状态赋值)具体是在updateWindowsLocked、updateWindowsLocked函数中调用,然后调用每个WindowState的WindowStateAnimator的prepareSurfaceLocked函数来输出动画帧。后面当mAnimating为true代表还要继续输出动画帧,继续调用WMS的scheduleAnimationLocked函数,当VSync信号过来时会继续调用animateLocked函数,最后播放完动画会调用WMS的requestTraversalLocked函数,重新刷新布局。

在updateAppWindowsLocked、updateWindowsLocked函数会调用AppWindowAnimator的stepAnimationLocked和WindowStateAnimator的stepAnimationLocked函数。这两个函数我们就不分析,在http://www.voidcn.com/article/p-aoeynxax-ev.html博客中我们分析过WindowStateAnimator的stepAnimationLocked函数。

prepareSurfaceLocked函数输出动画

而动画输出函数prepareSurfaceLocked我们也在博客http://www.voidcn.com/article/p-aoeynxax-ev.html分析过了,这个函数先会调用computeShownFrameLocked函数负责合成窗口的动画,包括窗口本身所设置的进入(退出)动画、从被附加窗口传递过来的动画,以及宿主Activity组件传递过来的切换动画。窗口的这三个动画合成之后,就可以得到一个变换矩阵。将这个变换矩阵应用到窗口的原始大小和位置上去,就可以得到窗口经过动画变换后所得到的位置和大小。

然后调用setSurfaceBoundariesLocked到SurfaceControl中设置窗口大小、位置等。

最后会调用showSurfaceRobustlyLocked函数来输出动画帧。这个函数(也在http://www.voidcn.com/article/p-aoeynxax-ev.html博客中分析过)。



android wms 窗口,Android6.0 WMS(十一) WMS窗口动画生成及播放相关推荐

  1. android+桌面歌词,Android6.0系统适配桌面歌词效果

    在360手机助手及各家的音乐播放器软件上,都使用了桌面浮动窗功能,桌面歌词都是在音乐客户端显示在前台时隐藏,在用户把软件切换到后台后显示出来,此效果在Android 6.0以前,大部分都是使用系统的A ...

  2. Android教程 -05 Android6.0权限的管理

    视频为本篇博客知识的讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 height="498" width="510" src="http://pl ...

  3. android闪光灯参数,android6.0中的闪光灯

    在android6.0中,加入了Camera相关新特性,在做开发过程中,遇到闪光灯的操作,如下: 1.导入包: import android.hardware.camera2.CameraManage ...

  4. android adbd分析,android6.0 adbd深入分析(三)adb root重启adbd流程

    上篇博客中分析过adb root pc到adbd的流程,这篇博客我们再来讲下adb root是adbd重启并且获取root的流程.我们再来回顾之前的函数: void restart_root_serv ...

  5. android fstab文件,[Android6.0][RK3399] fstab 文件格式说明和解析代码跟踪

    Author: Younix Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017.04 一.格式说明 以 RK3399 的 Andr ...

  6. Android6.0 WMS(八) 显示Activity的启动窗口

     在Android系统中,Activity组件在启动之后,并且在它的窗口显示出来之前,可以显示一个启动窗口.这个启动窗口可以看作是Activity组件的预览窗口,是由WindowManagerSe ...

  7. Reflex WMS入门系列之二十一:关闭一个不需要的盘点

    Reflex WMS入门系列之二十一:关闭一个不需要的盘点 仓库管理实践中,如果业务人员创建好了一个盘点,发现后续暂时不需要执行实际的库存清点工作,或者本次盘点因故取消,或者发现该盘点数据有误需要关闭 ...

  8. [Android Studio]详细讲解Android6.0以上请求应用权限(解决请求权限窗口一闪而过的问题)

    现在的主流手机的Android版本都是8.0/9.0(笔者的华为手机为9.0),所以在开发Android的时候尽量使用Android8.0的版本(SDK 26).随着Android版本的提升,系统的安 ...

  9. Android 系统(98)---Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)

    Android app 在线更新那点事儿(适配Android6.0.7.0.8.0) 一.前言 app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新 ...

最新文章

  1. 全国计算机二级vfp知识点,全国计算机二级VFP知识点总结
  2. 关于 ListBox 自动换行
  3. C# WMI 编程实例2则
  4. 函数默认形参与占位参数
  5. cocos2d-x游戏开发(十四)用shader使图片背景透明
  6. 使用JDK 8轻松进行细粒度排序
  7. svn中文语言包安装(最详细步骤)+Language Pack+TortoiseSVN 安装
  8. swift 3.0 中使用 xib
  9. php可以支持代码重用技术的命令,Linux下的编程 PHP高级技巧全放送(一)
  10. js 执行环境 活动对象 变量对象 作用域链的理解
  11. Linux系统安装MySQL5.7,授权远程登陆
  12. python中nums.append_Python程序中的append()和extend()
  13. map和foreach的区别和应用场景_面试官:说说UDP和TCP的区别及应用场景
  14. 台式计算机前面插耳机没声音,Win10台式机机箱前置耳机插孔没声音如何修复
  15. 计算机网络识别慢,win7系统开机后识别网络速度特别慢的解决方法
  16. deflate 压缩 java_Java和PHP配合:deflate(压缩)和inflate(解压)
  17. 与Lucene 4.10配合的中文分词比较(转)
  18. 数学方法生成六位随机数
  19. 计算机辅助设计的英语缩写是什么,计算机辅助设计的英文缩写是什么
  20. 自创银河系,转转转转转----Java球类的椭圆轨迹运动----立体效果

热门文章

  1. Django进阶教程
  2. 基于MFC开发的单文档画图(线段,多线段,矩形,椭圆,多边形),选中,变色,平移,线段长度,区域面积计算
  3. 365句百姓真理——男人好色,女人好情
  4. 【OpenPrompt】源码学习笔记
  5. MySQL执行查询语句时出现停滞状态,出现Waiting for table metadata lock的问题
  6. m4s格式转换mp3_超级详细!如何将B站缓存m4s文件无损转换为mp4格式
  7. MATLAB中的zigzag,ZIGZAG扫描的MATLAB实现
  8. Caffe--应用实践
  9. OpenGL中的gl,glu,glut的区别
  10. cad角度命令怎么输入_新手入门,学习CAD必须掌握,教你使用标注命令,绘图效率翻一倍...