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)绘制


更多相关文章

  1. Android Animation动画(Frame-By-Frame Animations 、Tween Anima
  2. Android 控件的显示和隐藏
  3. android子线程中刷新界面控件
  4. 【Android】【Lottie】在Android中使用Lottie动画
  5. android图片闪烁或帧动画
  6. Android超炫日期日历控件:TimesSquare
  7. Android 动画ObjectAnimator中height和translationY
  8. Android高手进阶教程(二十七)之---基于ViewFlipper实现的自定义
  9. android-控件样式(Theme)自定义

随机推荐

  1. 成为更好的Android开发者前,我们需要注意
  2. Android:实现退出确认对话框
  3. Android(安卓)Layout_weight 属性
  4. Android(安卓)自定义CheckBox 样式
  5. android tips:从资源文件中读取文件流显
  6. 2013.08.08——— android 中文简繁体转
  7. Android:如何显示网络图片
  8. android NDK/JNI-实例开发流程
  9. Android网络连接处理学习笔记
  10. 使用 EditText来调用软键盘的搜索功能