Android 动画框架代码分析
16lz
2021-01-23
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-anmt2/
Android学习:
http://www.ibm.com/developerworks/cn/opensource/theme/android/
Activity之间、不同窗口间的切换动画:
WindowManager
performLayoutAndPlaceSurfacesLockedInner()
调用的是StartActivity,是标准的系统切换动画。看能否让动画在目标Activity准备好之后才开始计划动画的时间?
Activity.startActivity()
Instrumentation.execStartActivity()
ActivityManagerNative.startActivity()
IBinder.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
ActivityManagerService.ActivityStack.startActivityMayWait();
ActivityStack.startActivityLocked();
mService.mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN)WindowManagerService.prepareAppTransition(int transit)
WindowManagerService.executeAppTransition()
WindowManagerService.performLayoutAndPlaceSurfacesLocked()
ActivityStack.resumeTopActivityLocked(ActivityRecord prev)
mService.mWindowManager.executeAppTransition();
WindowManagerService.executeAppTransition();
mAppTransitionReady = true; //此变量表示已经作好准备,动画要开始了
WindowManagerService.performLayoutAndPlaceSurfacesLocked()
WindowManagerService.performLayoutAndPlaceSurfacesLockedInner(), //其中咐循环所有窗口,并实现动画
currentTime = SystemClock.uptimeMillis(); (当前时间)
performLayoutLockedInner(); // 先布局,再动画
mPolicy.beginAnimationLw(dw, dh);
WindowManagerPolicy.beginAnimationLw()
PhoneWindowManager.beginAnimationLw()
WindowState.stepAnimationLocked(currentTime, dw, dh); //开始动画(记录开始时间)
PhoneWindowManager.animatingWindowLw()
PhoneWindowManager.finishAnimationLw()
if (mAppTransitionReady) {
mAppTransitionReady = false;
mAppTransitionRunning = true; //动画已经在运行中
mAppTransitionTimeout = false;
mStartingIconInTransition = false;
mSkipAppTransitionAnimation = false;
WindowManagerService.prepareAppTransition(int transit)
mAppTransitionReady = false; //此变量表示已经作好准备,动画要开始了
mAppTransitionTimeout = false;
mStartingIconInTransition = false;
mSkipAppTransitionAnimation = false;
mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
mH.sendMessageDelayed(mH.obtainMessage(H.APP_TRANSITION_TIMEOUT),5000);
WindowState.stepAnimationLocked(currentTime, dw, dh)
if (!mLocalAnimating) {
if (DEBUG_ANIM) Slog.v(
TAG, "Starting animation in " + this +
" @ " + currentTime + ": ww=" + mFrame.width() + " wh=" + mFrame.height() +
" dw=" + dw + " dh=" + dh + " scale=" + mWindowAnimationScale);
mAnimation.initialize(mFrame.width(), mFrame.height(), dw, dh);
mAnimation.setStartTime(currentTime); //动画正式开始计时!
mLocalAnimating = true;
mAnimating = true;
}
同一窗口内的View之间的动画机制:
View.getAnimation()
ViewGroup:
// Layout animation
private LayoutAnimationController mLayoutAnimationController;
private Animation.AnimationListener mAnimationListener;
drawChild(Canvas canvas, View child, long drawingTime); //绘制子控件
Animation:
getTransformation(long currentTime, Transformation outTransformation); //得到某时刻的运动结果
ViewGroup.drawChild(Canvas canvas, View child, long drawingTime):
final Animation a = child.getAnimation(); //获得子控件的动画对象
more = a.getTransformation(drawingTime, mChildTransformation); // 计算子控件在绘制时刻的运动结果transformation
transformToApply = mChildTransformation;
// 根据子控件的transformation对画布进行相应设置
// 如果控件有Drawing_Cache,则用canvas.drawBitmap(cache)进行绘制,否则直接child.draw(canvas)绘制
更多相关文章
- Android Animation动画(Frame-By-Frame Animations 、Tween Anima
- Android 控件的显示和隐藏
- android子线程中刷新界面控件
- 【Android】【Lottie】在Android中使用Lottie动画
- android图片闪烁或帧动画
- Android超炫日期日历控件:TimesSquare
- Android 动画ObjectAnimator中height和translationY
- Android高手进阶教程(二十七)之---基于ViewFlipper实现的自定义
- android-控件样式(Theme)自定义