if (mAnimateMove) {
mAnimateMove = false;
mAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(),//初始化窗口对象
mAnimDw, mAnimDh); } else {
mAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(), displayInfo.appWidth, displayInfo.appHeight); }
mAnimDw = displayInfo.appWidth; mAnimDh = displayInfo.appHeight;
mAnimation.setStartTime(mAnimationStartTime != -1 ? mAnimationStartTime : currentTime);
mLocalAnimating = true;// 设置为true代表已经初始化窗口对象 mAnimating = true; }
if ((mAnimation != null) && mLocalAnimating) { mLastAnimationTime = currentTime;
if (stepAnimation(currentTime)) {//通过时间判断动画是否显示完毕 return true; } } }
mHasLocalTransformation = false;
if ((!mLocalAnimating || mAnimationIsEntrance) && mAppAnimator != null//没有设置窗口动画或者窗口动画结束了
&& mAppAnimator.animation != null) {
// 如果有Activity动画,将mAnimating设为true mAnimating = true;
mHasTransformation = true; mTransformation.clear(); return fwww.sm136.comalse; } else if (mHasTransformation) {
// Little trick to get through the path below to act like // we have finished an animation. mAnimating = true; } else if (isAnimating()) { mAnimating = true; }
} else if (mAnimation != null) { mAnimating = true; }
if (!mAnimating && !mLocalAnimating) { return false; }
mAnimating = false;
mKeyguardGoingAwayAnimation = false; mAnimatingMove = false; mLocalAnimating = false; ......
mHasLocalTransformation = false; ......
mTransformation.clear(); ......
return false; }
该方法的工作就是设置WindowStateAnimator对象的几个成员变量,首先调用WindowState对象的isDrawnLw来判断窗口系统的状态,只有准备好了才能显示,接着判断mAnimation是否为空,不为空代表已经设置好了动画对象。
接下来判断mLocalAnimating变量的值,为false则调用mAnimation的intialize方法来完成动画对象的初始化(主要设置动画的高度和宽度),然后将mLocalAnimating和mAnimating设为true。完成初始化后,接着调用stepAnimation方法来判断动画是否已经显示完成,没有完成返回true。
如果没有设置动画或者动画已经结束了,则还有判断窗口所在的Activity是否还存在动画,如果有,将mAnimating设置true(表示还要继续播放动画),如果同时mHasTransformation的值仍然为true,或者isAnimating方法返回true,也将mAnimating设置为true。 isAnimating会根据当前动画对象mAnimation是否为空,它的附加窗口的动画对象是否为空,以及窗口所在的Activity的动画对象是否为空等条件来判断,这表示只要有可能mAnimating就会设置为true。这样的目的尽量让动画完成显示,即使没有可显示的动画,多刷新几次不会有副作用,但如果少画了一次,屏幕上就可能留下不正确画面了。 [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 boolean isAnimating() {
return mAnimation != null
|| (mAttachedWinAnimator != null && mAttachedWinAnimator.mAnimation != null)
|| (mAppAnimator != null && mAppAnimator.isAnimating()); }
我们再看看动画的生成过程,WindowStateAnimator的prepareSurfaceLocked方法来完成计算一帧动画并显示工作:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片 public void prepareSurfaceLocked(final boolean recoveringMemory) {
......
computeShownFrameLocked();//计算要显示的动画帧
setSurfaceBoundariesLocked(recoveringMemory);
if (mIsWallpaper && !mWin.mWallpaperVisible) { hide();//如果是壁纸窗口,隐藏
} else if (w.mAttachedHidden || !w.isOnScreen()) { hide();//如果窗口不可见,隐藏 ......
} else if (mLastLayer != mAnimLayer || mLastAlpha != mShownAlpha || mLastDsDx != mDsDx || mLastDtDx != mDtDx || mLastDsDy != mDsDy || mLastDtDy != mDtDy
|| w.mLastHScale != w.mHScale || w.mLastVScale != w.mVScale
|| mLastHidden) {//每个值是否有变化 displayed = true;
mLastAlpha = mShownAlpha; mLastLayer = mAnimLayer; mLastDsDx = mDsDx; mLastDtDx = mDtDx; mLastDsDy = mDsDy; mLastDtDy = mDtDy;
w.mLastHScale = w.mHScale; w.mLastVScale = w.mVScale;
if (mSurfaceControl != null) { try {
mSurfaceAlpha = mShownAlpha;
mSurfaceControl.setAlpha(mShownAlpha); mSurfaceLayer = mAnimLaync630.comer; mSurfaceControl.setLayer(mAnimLayer); mSurfaceControl.setMatrix(
mDsDx * w.mHScale, mDtDx * w.mVScale, mDsDy * w.mHScale, mDtDy * w.mVScale);
if (mLastHidden && mDrawState == HAS_DRAWN) { if (showSurfaceRobustlyLocked()) {//输出动画帧 mLastHidden = false; if (mIsWallpaper) {
mService.dispatchWallpaperVisibility(w, true);
}
mAnimator.setPendingLayoutChanges(w.getDisplayId(),
WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); } else {
w.mOrientationChanging = false; } }
if (mSurfaceControl != null) { w.mToken.hasVisible = true; }
} catch (RuntimeException e) {
Slog.w(TAG, \ if (!recoveringMemory) {
mService.reclaimSomeSurfaceMemoryLocked(this, \ } } } } ...... }
该函数先调用了computeShownFrameLocked函数计算当前需要显示的动画帧数据,mAnimLayer表示窗口的Z轴、mShownAlpha窗口透明度;mDsDx、mDtDx、mDsDy和mDtDy表示二维变换矩阵;w.mHScale w.mVScale表示窗口的缩放比例
只有计算出的数据和上一次数据不一样才会调用showSurfaceRobustlyLocked输出动画帧。