Android 动画框架代码分析


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值