HelloAnimations icon indicating copy to clipboard operation
HelloAnimations copied to clipboard

Sample project for Android Animations.

HelloAnimations

Sample project for Android Animations.

Property Animation

Property Animation

Property Animation相关的类:

对应的xml中元素:

  • ValueAnimator -> <animator>
  • ObjectAnimator -> <objectAnimator>
  • AnimatorSet -> <set>

Property Animation相关的类都处在包android.animation中, 除了用到的Interpolater都在android.view.animation包中. Property Animation的xml文件在res/animator文件夹中.

Listeners

Animator.AnimatorListener 动画的开始, 结束, 重复, 和取消事件. (常用).

ValueAnimator.AnimatorUpdateListenerValueAnimator配合使用, 接收每一帧的回调和计算出来的值. (因为通常只配合ValueAnimator, 不常用).

  • onAnimationUpdate()动画的每一帧都调用, 可以通过getAnimatedValue()得到当前动画值.

根据你当前动画的对象和属性, 你可能需要自己调用invalidate()方法来强制View重绘. 不过所有View的set方法都已经自己做了invalidate()的工作, 所以在调用这些方法的时候不需要手动invalidate.

Layout Animation

ViewGroup默认的layout动画可以在xml中通过android:animateLayoutChanges="true"开启. 当ViewGroup中的成员发生增加/减少, 显示/隐藏, 就会出现该动画效果.

如果需要指定自定义的layout动画, 可以通过setLayoutTransition()给ViewGroup指定一个LayoutTransition. LayoutTransition.setAnimator(int transitionType, Animator animator)方法可用于指定五种具体类型的动画:

  • CHANGE_APPEARING
  • CHANGE_DISAPPEARING
  • APPEARING
  • DISAPPEARING
  • CHANGING

Interpolators

整个动画过程中, 涉及的计算分三步:

  • 1.ValueAnimator对象根据动画的总时间和已经流逝的时间计算出一个0到1之间的elapsed fraction值. 这个elapsed fraction值就代表了时间完成的程度.
  • 2.计算出elapsed fraction之后, ValueAnimator对象会调用TimeInterpolator来计算一个interpolated fraction, 即, 根据所设置的时间插值方法将elapsed fraction映射到interpolated fraction. (如果是线性插值的话elapsed fraction和interpolated fraction会是一直相等的, 但是非线性变换就不是了).
  • 3.interpolated fraction计算出来后, ValueAnimator会调用TypeEvaluator, 计算动画属性值. 这时候用的输入参数就是interpolated fraction的值, 以及属性值的起始值和终止值.

整个过程如下图所示: how property animation works

所有的Interpolater都是整个接口的子类: Interpolator

View Animation

View Animation View Animation相关的类都在android.view.animation包中. View Animation相关的xml文件在res/anim文件夹中.

对应的xml中元素:

  • AlphaAnimation -> <alpha>
  • RotateAnimation -> <rotate>
  • ScaleAnimation -> <scale>
  • TranslateAnimation -> <translate>
  • AnimationSet -> <set>

View Animation有一个缺点就是当View被移动到另一个位置以后, 其真实的位置仍在原来的位置. 即: 点击当前所看到的View并不会触发点击事件, 但点击它初始的位置会触发.

Transitions

在Android 5.0 (API 21)之前, Activity的转场动画是靠overridePendingTransition()指定(指定anim), Fragment是setCustomAnimations()指定(v4指定anim, 非v4指定animator). 它们只能把整个屏幕作为整体做转换.

从Android 5.0开始, Lollipop APIs让我们可以独立地动画场景中的View元素, 并且可以在两个Activity/Fragment转换的过程中移动共享元素.

Shared Element Transition

注意实际进行动画的元素是第二屏的View, 所以如果shared view中的内容并不一致, 动画效果并不理想.

Reference Demos

References

Transitions:

早年的博客系列文章: Android Animation