Android动画系统包括View animation和Property animation,也就是视图动画和属性动画,属性动画有API限制,必须在API 11以上使用,不过有个开源项目NineOldAndroids,实现了对API 11之前版本的支持。
  视图动画相对于属性动画来说简单一些,只能对view做移动、旋转、缩放等处理。举例来说做View移动的效果,视图发生时改变View在屏幕上的绘制位置,但与这个View相关的属性值却不会改变,所以会发现响应点击事件还在原来的位置上,也就是看上去变了,实际上根还在原来的地方;而属性动画改变的是实际的属性值,也就是View位置发生变化了,他的相关属性值也确实发生了改变。而且属性动画可以改变已有的属性类型,还可以改变自定义的类型,也就是说属性动画是一种广义的动画系统,用于表现一种连续变化的过程,而不仅仅是视图上的物理变化。

属性动画

  属性动画主要涉及Animator、TimeInterpolator、TypeEvaluaor这三个概念。如果把属性动画看作一台机器,那么Animator就是其中的发动机。它定义了属性动画最基本的操作,ValueAnimator是它的子类,实现了动画发生的具体计算过程。值得注意的是,ValueAnimator只负责动画过程中属性值得计算,具体得到这个变化的值如何处理ValueAnimator并不关心,所以需要使用者主动去获取计算好的属性值。
ValueAnimator提供了三种默认支持的值类型,int、float和表示颜色的argb型。例如:
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);animation.setDuration(1000);animation.start();

要得到动画发生过程中的值需要给ValueAnimator设置一个监听器ValueAnimator.AnimatorUpdateListener。
animation.addUpdateListener(new AnimatorUpdateListener() {public void onAnimationUpdate(ValueAnimator animator) {Float value = (Float) animator.getAnimatedValue();}})

这样就可以得到整个动画过程产生的中间值。
  中间值的计算涉及到两个方面,一个是插值器函数,也就是对应的Interpolator,表示程度随时间的变化情况,比如匀速、加速,或者先加速后减速等;另一个是中间值的计算函数,对应到TypeEvaluator,这是一个接口,里面有evaluate(float fraction, T startValue, T endValue)方法需要实现,对一般的值计算方法都是startValue + fraction * (endValue - startValue),也有特殊的比如颜色值,用一个int表示了argb,计算的时候就要先分解计算再合成,但对于每个分量的计算任然遵守上面的规则,具体可以看ArgbEvaluator的源文件。
  ValueAnimator除了上面的默认值类型,还支持自定义类型Object,对于自定义类型,使用者需要实现该类型对应的TypeEvaluator,如下
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);animation.setDuration(1000);animation.start();

属性动画要对View起作用需要将每次改变的属性值设置到相应的View上,上面提到ValuAnimator只负责中间值的计算,而没有后面这个值的设置过程,为了更方便地运用,ObjectAnimator这个类诞生了,它继承了ValueAnimator,并在内部实现了设置到View属性上的逻辑。
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);anim.setDuration(1000);anim.start();

其中foo是属性值所属的一个具体对象,比如一个view,alpha是属性名称,ObjectAnimator要求必须有属性名称对应到set和get方法,如上面例子要求foo对应到类必须有setAlpha()和getAlpha()这两个方法。对于View来说设置view的alpha值会触发invalidate而重绘,因此就看到了连续的动画效果。

更多相关文章

  1. Android:可复制内容的TextView、EditText
  2. Android(安卓)之 API级别
  3. Android样式研究
  4. android 实现微信摇一摇效果
  5. 【Android源码】Android(安卓)UI 之一步步教你自定义控件
  6. 新浪微博Android客户端学习记录一:完成Logo界面
  7. android:windowSoftInputMode 属性介绍
  8. 2018-03-10—Android六大布局之LinearLayout和RelativeLayout
  9. 由Android(安卓)65K方法数限制引发的思考

随机推荐

  1. android跳转到微信app
  2. Nuance - Dragon Mobile SDK - Speech Ki
  3. Android(安卓)ormlite 简介中文版
  4. Android——ProgressDialog
  5. android的Services生命周期和使用方法
  6. Android(安卓)方法数超过64k限制的解决办
  7. Android(安卓)3.2 Platform 发布
  8. Android(安卓)ScrollView嵌套listview或E
  9. Android(安卓)Wifi模块相关常量定义.
  10. android书