Android Animation

整理自Get Animated (Android Dev Summit ‘18),解释那复杂的Android动画框架和工具。

  1. android.view.animation:过时的动画

    过时了,不好用了。包括创建在R.anim.中的资源(考虑使用R.animator.)。

    当且仅当处理Window Animation时或Fragment Transition的自定义动画需确保View已经measured不得不使用这个,

    1
    <item name="android:windowEnterAnimation">@anim/foo</item>
  2. android.animation:从API 11开始的Animator

    来自R.animator.的资源。

    Animator => ValueAnimator => ObjectAnimator

    1. ValueAniamtor

      1
      2
      3
      ValueAnimator.ofFloat(1f, 0f).apply {
      addUpdateListener { ... }
      }.start()
    2. ObjectAniamtor

      1
      ObjectAnimator.ofFloat(view, View.ALPHA, 1f, 0f).start()

      PropertyValueHolder是ValueAnimator的内部实现

      1
      2
      3
      4
      5
      ObjectAnimator.ofPropertyValueHolder(
      view,
      PropertyValueHolder.ofFloat(View.ALPHA, 1f, 0f),
      PropertyValueHolder.ofFloat(View.SCALE_X, 1f, 0f)
      ).start()
    3. AnimatorSet:属于Aniamtor,管理多个动画

    4. ViewPropertyAnimator:使用了ValueAnimator,但效率更高

      1
      view.animate()....start()
  3. Transitions:在布局间中切换

    用于Shared Element Transition、Window Content Transition、模块化动画。

    TransitionManager.beginDelayedTransition(viewGroup)

    调用后,修改View,自动启动动画。

  4. AnimatedVectorDrawable: VectorDrawable + Animator

    用于Icon Animation、一次性动画、性能要求高的情况。

    1
    2
    3
    val avd = AppCompatResources.getDrawable(context, R.drawable.avd) as AnimatedVectorDrawable
    imageView.drawable = avd
    avd.start()
  5. Phycisc-based Animation:强交互时提供流畅体验

  6. MotionLayout:饼,真香。