Activity提供了函数overridePendingTransition,来为activity之间的切换提供了播放动画的功能。

那么,这些能被播放的动画怎么来描述的呢?

先看看overridePendingTransition的声明,

public void overridePendingTransition(int enterAnim, int exitAnim)

以下是一个具体的调用实例,

overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);

enterAnim和exitAnim是个整型,在实例中具体对应于R.anim.zoom_enter和R.anim.zoom_exit,是两个anim资源文件。

这些资源文件,用set,alpha,scale,rotate,translate等header来描述,在运行中,被

frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中的overridePendingTransition来加载(其实最终由windowManager的overridePendingAppTransition来设置);设置完成之后,最终会由applyAnimationLocked来完成动画播放。

这段过程,应该阅读frameworks/base/services/java/com/android/server/WindowManagerService.java。

关注几个函数和类:

  • WindowManagerService.applyAnimationLocked
  • WindowManagerService.loadAnimation
  • AnimationUtils.loadAnimation
  • AppWindowToken.setAnimation

而这些header,是分别对应于android.view.animation package里的这些类的:

  • AnimationSet
  • AlphaAnimation
  • ScaleAnimation
  • RotateAnimation
  • TranslateAnimation

也就是说动画功能是由这些类来提供的,这就带来了一个问题,若期望动画不可能用这些类来实现,怎么办?

这里有个可行的路子:

  1. 添加自定义动画类至android.view.animation
  2. 扩展AnimationUtils.loadAnimation来支持这些自定义动画类。
Advertisements