Android6.0 WMS(六) WMS动画管理(3)

2019-04-04 23:16

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输出动画帧。


Android6.0 WMS(六) WMS动画管理(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:旅游资源 读书笔记

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: