Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(tweened animation)。
逐帧动画实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理;补间动画则是可以对View
进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。补间动画只能对view进行。
对于非View的对象进行动画,我们需要用到属性动画,比如说我们有一个自定义的View,在这个View当中有一个Point对象用于管理坐标,然后在onDraw()方法当中就是根据这个Point对象的坐标值来进行绘制的,我们可以对Point对象进行动画操作,那么整个自定义View的动画效果就有了。
补间动画只是改变了View的显示效果而已,而不会真正去改变View的属性。比如说,现在屏幕的左上角有一个button,然后我们通过补间动画将它移动到了屏幕的右下角,当我们点击一下这个button,点击事件是绝对不会触发的,因为实际上这个按钮还是停留在屏幕的左上角,只不过补间动画将这个按钮绘制到了屏幕的右下角而已。而属性动画是可以正真的将button移动到了右下角,
点击效果可以被触发。
Android在3.0版本引入了属性动画。
主要有两个个类:ValueAnimator,ObjectAnimator。
ValueAnimator是根据时间,动画开始值和结束值来返回在该时间内的值,这样就完成开始值到结束值之间的平滑过渡。
它还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。
ObjectAnimator可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。ObjectAnimator低层的动画实现机制也是基于ValueAnimator来完成的。
ObjectAnimator现实动画常用方法:
ObjectAnimator.ofFloat(Object target,String propertyName,float... values)
ObjectAnimator.ofInt(Object target,String propertyName,float... values)
target目标View或其他对象,propertyName操作属性名称(),values操作值可以是多个。
操作属性值:
1)translationX 和 translationY:这两个属性控制了View所处的位置,它们的值是由layout容器设置的,是相对于坐标原点(0,0左上角)的一个偏移量。
2)rotation, rotationX 和 rotationY:控制View绕着轴点(pivotX和pivotY)旋转。
3)scaleX 和 scaleY:控制View基于pivotX和pivotY的缩放。
4)pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点。
5)x 和 y:描述了view在其父容器中的最终位置,是左上角左标和偏移量(translationX,translationY)的和。
6)aplha:透明度,1是完全不透明,0是完全透明。
2)rotation, rotationX 和 rotationY:控制View绕着轴点(pivotX和pivotY)旋转。
3)scaleX 和 scaleY:控制View基于pivotX和pivotY的缩放。
4)pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点。
5)x 和 y:描述了view在其父容器中的最终位置,是左上角左标和偏移量(translationX,translationY)的和。
6)aplha:透明度,1是完全不透明,0是完全透明。
view.animate().alpha(0.4f).setDuration().setListener().setInterpolater();
动画包含渐变、缩放、位移、旋转。可设置动画时间,过程监听,插值器。
ViewPropertyAnimator源码说明是:对多个动画组合在一起的需求,比较适合该类的使用。如果是一个或者两个动画使用
ObjectAnimator比较好。
If only one or two properties on a View object are being animated, then using an
* {@link android.animation.ObjectAnimator} is fine;
But if several properties are animated simultaneously, or if you just want a
* more convenient syntax to animate a specific property, then ViewPropertyAnimator might be
* more well-suited to the task.