(转)Android Property Animation 属性动画

版权声明:本文为博主原创文章,未经博主允许不得转载。

http://blog.csdn.net/jjwwmlp456/article/details/38518657

目录(?)[-]

  1. Property Animation介绍
  2. 3.0以后新增了一些View的属性
  3. ObjectAnimator 对象动画
    1. ObjectAnimator的xml实现
      1. xml定义动画
      2. 代码加载 动画xml
  4. AnimatorSet 动画集
    1. xml定义动画集
    2. 代码加载 动画集的xml
  5. PropertyValuesHolder
  6. ViewPropertyAnimator 多属性动画
  7. ValueAnimator 值动画
    1. xml定义值动画
    2. 代码加载 值动画xml
  8. Animator的监听器
    1. AnimatorListener
    2. AnimatorListenerAdapter 监听器的默认空实现
    3. AnimatorUpdateListener 动画的值更新监听器
  9. 用属性动画换背景色
  10. LayoutTransition

效果图:
 

Property Animation介绍:

出生在sdk3.0,是利用了View所拥有的属性,进行一系列的操作。比如一个View有什么样的setAbc的属性,那么理论上就可以设置它。

它不仅改变View的绘制,也改变了View的属性;而Tween Animation 只改变View的绘制。

Animator为属性动画的基类

其结构:

Animator abstract class

---- AnimatorSet final class 属性动画的集合,可以添加下面的值动画和对象对象在其内,可同时运行或顺序运行

----ValueAnimator 值动画。监听某一值的变化,进行相应的操作

---- ObjectAnimator final class 对象动画

ValueAnimator 值动画,它有一个子类ObjectAnimator。需要Interpolator和TypeEvaluator来计算属性值。

TimeInterpolator 时间插入器 接口,反应动画的运动速率。getInterpolation()根据一定算法,返回时间比率

----Interpolator interface 继承自TimeInterpolator

Interpolator 接口的实现类 见下表:

xml 设置 插入器:android:interpolator="@android:anim/accelerate_decelerate_interpolator"

TypeEvaluator<T> interface 计算类型值 支持泛型

方法:T evaluate(float fraction, T startValue, T endValue)

就是用来计算属性值的,即可计算任意类型的值。

fraction 表示时间的比率。

实现类有: ArgbEvaluator ARGB颜色计算器

FloatEvaluator float型计算器

IntEvaluator int计算器

PropertyValuesHolder 属性值持有者  持有属性名、开始与结束值。

属性设置方法:setIntValues()、setFloatValues()、setObjectValues()、setKeyframes

它的静态的一些of方法,创建 PropertyValuesHolder 对象。 ofInt、ofFloat、ofObject、ofKeyframe

setEvaluator(eval); //设置计算器。

Keyframe  表示 a time/frame-value pair. 即含有 时间比率和帧值 属性

它的静态的一些of方法,创建 Keyframe 对象。  ofInt、ofFloat、ofObject

KeyframeSet 就是一组KeyFrame

它的静态的一些of方法,创建 KeyframeSet 对象。  ofInt、ofFloat、ofObject、ofKeyframe

[plain] view plaincopyprint?

  1. 属性动画的一些说明:
  2. 1. ObjectAnimator 对象动画,当一个view同时拥有某一属性的getter、setter方法时,则可以使用该动画,来操作这一属性。
  3. 2. ValueAnimator 操作的范围比较广,通过Interpolator和TypeEvaluator得到某一时间内的值;再用监听器,监听值的变化,做相应的操作。
  4. 3. ValueAnimator 和ObjectAnimator(它是前者的子类)的静态的一些of方法,创建自身对象。
  5. 也可以new 一个无参的对象,再设置相应的values。
  6. ofInt()、ofFloat()、ofObject()、ofPropertyValuesHolder()。
  7. 这几个方法的实现也就是new 一个无参的对象,再设置相应的values。
  8. 4. ValueAnimator 的调用流程:
  9. a. 初始化ValueAnimator后,设置一个values。这时就有了一个PropertyViewHolder对象pvh。
  10. 可以直接调用setValues设置它PVH对象;或setInt|Float|ObjectValues
  11. 方法内部会生成一个PVH
  12. PVH内部维护一个KeyframeSet和TypeEvaluator。PVH根据不同的values来初始化KeyframeSet和
  13. TypeEvaluator实现方法中的startValue和endValue就从KeyframeSet中的Keyframe中获取
  14. b. 设置TypeEvaluator,传递到pvh中。
  15. c. 设置Interpolator。 ValueAnimator中默认的插入器为AccelerateDecelerateInterpolator
  16. d. ValueAnimator的animationFrame(long currentTime),当有动画应该结束时返回true,否则返回false。
  17. 方法内,算出动画运行的时间比率fraction,再调用animateValue(float fraction)。
  18. e. ValueAnimator的animateValue(float fraction),调用插入器,得到一个按某一规则得到的fraction,
  19. 再调用 pvh.calculateValue(fraction);pvh调用KeyframeSet的getValue(fraction);
  20. KeyframeSet内部再调用TypeEvaluator的evaluate(fraction,T startValue, T endValue)。
  21. startValue、endValue是通过Keyframe的getValue()来获取的。
  22. f. evaluate(),方法内拿到了时间比率fraction,可以自行根据一定规则,返回value T。
  23. g. 给ValueAnimator添加一个AnimatorUpdateListener。监听的回调方法:
  24. onAnimationUpdate(ValueAnimator animation) {
  25. T obj = (T)animation.getAnimatedValue();//取得计算器计算出的某段时间内的T值。
  26. // 操作 obj
  27. }

先来一个使用自定义类型的求值计算器的ValueAnimator的例子

[java] view plaincopyprint?

  1. ValueAnimator backAnim;
  2. ImageView view;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.aa);
  7. view = (ImageView) findViewById(R.id.iv_img);
  8. backAnim = new ValueAnimator();
  9. backAnim.setTarget(view);
  10. backAnim.setDuration(2000);
  11. //类型求值<Drawable>:求出某一时间比值内的Drawable值
  12. TypeEvaluator<Drawable> drawableEvaluator = new TypeEvaluator<Drawable>() {
  13. @Override  //fraction 当前运行的时间比上总持续时间的 比值(中间经过插入器的规则运算)
  14. public Drawable evaluate(float fraction, Drawable startValue,
  15. Drawable endValue) {
  16. System.out.println(fraction);
  17. if (fraction < 0.5) {
  18. return startValue;
  19. } else {
  20. return endValue;
  21. }
  22. }
  23. };
  24. //可以直接设置PVH对象;也可以先设置values,再设置TypeEvaluator
  25. //      PropertyValuesHolder pvh = PropertyValuesHolder.ofObject("imageDrawable", drawableEvaluator,
  26. //               getResources().getDrawable(R.drawable.ic_launcher), getResources().getDrawable(R.drawable.a1));
  27. //      backAnim.setValues(pvh);
  28. backAnim.setObjectValues(getResources().getDrawable(R.drawable.ic_launcher), getResources().getDrawable(R.drawable.a2));
  29. backAnim.setEvaluator(drawableEvaluator);
  30. backAnim.addUpdateListener(new AnimatorUpdateListener() {
  31. @Override
  32. public void onAnimationUpdate(ValueAnimator animation) {
  33. Drawable value = (Drawable) animation.getAnimatedValue();
  34. view.setImageDrawable(value);
  35. }
  36. });
  37. backAnim.setInterpolator(new CycleInterpolator(2));
  38. backAnim.start();
  39. }

3.0以后新增了一些View的属性:

1)translationX 和 translationY:这两个属性控制了View所处的位置,
     它们的值是由layout容器设置的,是相对于坐标原点(0,0左上角)的一个偏移量。

2)rotation, rotationX 和 rotationY:控制View绕着轴点(pivotX和pivotY)旋转。它的表现跟Tween Animation中的RotateAnimation不一致。

RotateAnimation 的旋转,表现为平面的旋转

而rotationX、Y 旋转,是立体的旋转,默认是以View的中心点,做rotation(x,y)过中心点的直线,面向该直线进行翻转
3)scaleX 和 scaleY:控制View基于pivotX和pivotY的缩放。
4)pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点。
5)x 和 y:描述了view在其父容器中的最终位置,是左上角坐标和偏移量(translationX,translationY)的和。
6)aplha:透明度,1是完全不透明,0是完全透明。

以上这些属性与Tween Animation的动画属性值差不多

ObjectAnimator 对象动画

该动画,一次只能表示一个动作属性。

ObjectAnimator的xml实现

xml定义动画

res/animator/scale_object_animator.xml

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:duration="2000"
  4. android:propertyName="scaleX"
  5. android:repeatCount="1"
  6. android:repeatMode="reverse"
  7. android:valueFrom="1.0"
  8. android:valueTo="2.0" >
  9. </objectAnimator>

代码加载 动画xml

[java] view plaincopyprint?

  1. imageview_scale.setBackground(getResources().getDrawable(R.drawable.a11));
  2. ObjectAnimator scaleAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.scale_object_animator);
  3. scaleAnimator.setTarget(imageview_scale);//设置动画作用的目标对象
  4. scaleAnimator.setDuration(1000);
  5. scaleAnimator.setRepeatCount(50);
  6. scaleAnimator.start();

AnimatorSet 动画集

由ObjectAnimator 和 ValueAnimator 组成,对应的xml中的写法 类似为 <set> <objectAnimator /> ... <animator />... </set>

xml定义动画集

res/animator/set_rotate_scale.xml

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:ordering="together">
  4. <!-- android:ordering  together表示同时运行动画,  sequentially 表示按顺序执行以下动画 -->
  5. <set>
  6. <objectAnimator
  7. android:propertyName="rotationX"
  8. android:repeatCount="50"
  9. android:repeatMode="reverse"
  10. android:valueFrom="0"
  11. android:valueTo="20" />
  12. <objectAnimator
  13. android:propertyName="rotationY"
  14. android:repeatCount="50"
  15. android:repeatMode="reverse"
  16. android:valueFrom="0"
  17. android:valueTo="45"
  18. android:valueType="floatType" />
  19. </set>
  20. <set>
  21. <objectAnimator
  22. android:propertyName="scaleX"
  23. android:repeatCount="50"
  24. android:repeatMode="reverse"
  25. android:valueFrom="1.0"
  26. android:valueTo="2.0" >
  27. </objectAnimator>
  28. <objectAnimator
  29. android:propertyName="scaleY"
  30. android:repeatCount="50"
  31. android:repeatMode="reverse"
  32. android:valueFrom="1.0"
  33. android:valueTo="2.0" >
  34. </objectAnimator>
  35. </set>
  36. </set>

代码加载 动画集的xml

[java] view plaincopyprint?

  1. imageview_rotate.setBackground(getResources().getDrawable(R.drawable.a11));
  2. AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.set_rotate_scale);
  3. animatorSet.setTarget(imageview_rotate);
  4. animatorSet.setDuration(1000);
  5. animatorSet.setInterpolator(new BounceInterpolator());//设置end时的弹跳插入器
  6. animatorSet.start();

PropertyValuesHolder

[java] view plaincopyprint?

  1. //使用PropertyValuesHolder 构造 Animator   组合成类似set的效果
  2. PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("scaleX",0f,2.5f);
  3. PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleY",0f,3f);
  4. ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imageview, pvhX,pvhY);
  5. animator.setDuration(2000);
  6. animator.start();

APIDemo中的MultiPropertyAnimation示例:

[java] view plaincopyprint?

  1. // ============================================================
  2. // 第四个小球:利用关键帧实现曲线运动
  3. ball = balls.get(3);
  4. // 属性1:Y坐标运动:下落
  5. pvhY = PropertyValuesHolder.ofFloat("y", ball.getY(),
  6. getHeight() - BALL_SIZE);
  7. float ballX = ball.getX();
  8. // 三个关键帧
  9. Keyframe kf0 = Keyframe.ofFloat(0f, ballX); //参数为 time/value, 即时间点和指定值。还有这些构造ofInt()、ofObject()
  10. Keyframe kf1 = Keyframe.ofFloat(.5f, ballX + 100f);
  11. Keyframe kf2 = Keyframe.ofFloat(1f, ballX + 50f);
  12. // 属性2:X坐标运动:曲折
  13. // 用三个关键帧构造PropertyValuesHolder对象
  14. PropertyValuesHolder pvhX = PropertyValuesHolder.ofKeyframe(
  15. "x", kf0, kf1, kf2);
  16. // 再用两个PropertyValuesHolder对象构造一个ObjectAnimator对象。<span style="color:#ff6666;">一个holder持有一个属性</span>
  17. ObjectAnimator yxBouncer = ObjectAnimator
  18. .ofPropertyValuesHolder(ball, pvhY, pvhX).setDuration(
  19. DURATION / 2);
  20. yxBouncer.setRepeatCount(1);
  21. yxBouncer.setRepeatMode(ValueAnimator.REVERSE);

ViewPropertyAnimator 多属性动画

通过view.animate()来获取ViewPropertyAnimator。该类,能直接操作多个属性的动画。

[java] view plaincopyprint?

  1. imageview.setBackground(getResources().getDrawable(R.drawable.a11));
  2. ViewPropertyAnimator animate = imageview.animate();//该对象没有setRepeat的方法
  3. //通过一些动画属性来设置 组合成类似set的效果
  4. animate.alpha(0);
  5. animate.rotationX(50);
  6. animate.translationXBy(500);
  7. animate.scaleX(1.5f);
  8. animate.scaleY(1.5f);
  9. animate.setInterpolator(new BounceInterpolator());
  10. animate.setDuration(2000);
  11. animate.start();

ValueAnimator 值动画

ValueAnimator代码和xml设置中 没有setPropertyName 因为不是操作对象,只是根据value进行某种动作
需要加监听器,监听值的变化 做相应的处理

xml定义值动画

[html] view plaincopyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <animator xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:interpolator="@android:anim/accelerate_interpolator"
  4. android:duration="10000"
  5. android:startOffset="1000"
  6. android:repeatCount="infinite"
  7. android:repeatMode="restart"
  8. android:valueFrom="1"
  9. android:valueTo="100"
  10. android:valueType="intType">
  11. </animator>

代码加载 值动画xml

[java] view plaincopyprint?

  1. ValueAnimator valueAnimator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.animator);
  2. valueAnimator.setTarget(tv_num);
  3. valueAnimator.setEvaluator(new TypeEvaluator<Integer>() {
  4. @Override
  5. public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
  6. System.out.println("时间比率,fraction:" + fraction);
  7. System.out.println("结果值:" + (int)((startValue + fraction * (endValue - startValue)) / 10 * 10));
  8. return (int)((startValue + fraction * (endValue - startValue)) / 10 * 10);
  9. }
  10. });
  11. valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
  12. @Override
  13. public void onAnimationUpdate(ValueAnimator animation) {
  14. //在onAnimationUpdate中 该值返回第一个动画的 当前帧的evaluate 值
  15. System.out.println("animation.getAnimatedValue()==" + animation.getAnimatedValue());
  16. tv_num.setText(animation.getAnimatedValue() + "");
  17. }
  18. });
  19. //      valueAnimator.setInterpolator(new LinearInterpolator());
  20. valueAnimator.start();

Animator的监听器

AnimatorListener

[java] view plaincopyprint?

  1. new AnimatorListener() {//有以下四个抽象方法
  2. @Override
  3. public void onAnimationStart(Animator animation) {
  4. }
  5. @Override
  6. public void onAnimationRepeat(Animator animation) {
  7. }
  8. @Override
  9. public void onAnimationEnd(Animator animation) {
  10. }
  11. @Override
  12. public void onAnimationCancel(Animator animation) {
  13. }
  14. }

AnimatorListenerAdapter 监听器的默认空实现

[java] view plaincopyprint?

  1. new AnimatorListenerAdapter() {//空实现了AnimatorListener,有以下6个方法(4个必须实现的方法和2个重写的方法)
  2. @Override
  3. public void onAnimationCancel(Animator animation) {
  4. super.onAnimationCancel(animation);
  5. }
  6. @Override
  7. public void onAnimationEnd(Animator animation) {
  8. super.onAnimationEnd(animation);
  9. }
  10. @Override
  11. public void onAnimationRepeat(Animator animation) {
  12. super.onAnimationRepeat(animation);
  13. }
  14. @Override
  15. public void onAnimationStart(Animator animation) {
  16. super.onAnimationStart(animation);
  17. }
  18. @Override
  19. public void onAnimationPause(Animator animation) {
  20. super.onAnimationPause(animation);
  21. }
  22. @Override
  23. public void onAnimationResume(Animator animation) {
  24. super.onAnimationResume(animation);
  25. }
  26. }

AnimatorUpdateListener 动画的值更新监听器

[java] view plaincopyprint?

  1. new AnimatorUpdateListener() {
  2. @Override
  3. public void onAnimationUpdate(ValueAnimator animation) {
  4. //在onAnimationUpdate中 该值返回第一个动画的 当前帧的evaluate 值
  5. System.out.println("animation.getAnimatedValue()==" + animation.getAnimatedValue());
  6. }
  7. }

一些操作函数:

animator.pause();  animator.resume(); animator.reverse(); animator.end(); animator.cancel();

animator.start(); animator.isStarted(); animator.isPaused(); animator.isRunning();

用属性动画换背景色

详见ApiDemo要下的 BouncingBalls.java

[java] view plaincopyprint?

  1. private static final int RED = 0xffFF8080;
  2. private static final int BLUE = 0xff8080FF;
  3. private static final int CYAN = 0xff80ffff;
  4. private static final int GREEN = 0xff80ff80;
  5. {
  6. //动画 变色
  7. ObjectAnimator colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", CYAN, BLUE, RED);
  8. colorAnim.setTarget(ll_animation);
  9. colorAnim.setEvaluator(new ArgbEvaluator());
  10. colorAnim.setRepeatCount(ValueAnimator.INFINITE);
  11. colorAnim.setRepeatMode(ValueAnimator.REVERSE);
  12. colorAnim.setDuration(3000);
  13. colorAnim.start();
  14. }

LayoutTransition

[java] view plaincopyprint?

  1. /*
  2. * ViewGroup中使用LayoutTransition 进行 监听布局的改变,而创建动画
  3. * LayoutTransition.APPEARING 新增出现时
  4. *                  CHANGE_APPEARING
  5. *                  CHANGE_DISAPPEARING 子view消失时
  6. *                  CHANGING
  7. * ViewGroup布局中:android:animateLayoutChanges="true"  使用的默认的LayoutTransition制作动画
  8. */
  9. LayoutTransition layoutTransition = new LayoutTransition();
  10. layoutTransition.setDuration(5000);
  11. layoutTransition.setAnimator(LayoutTransition.APPEARING, scaleAnimator);
  12. ll_animation.setLayoutTransition(layoutTransition);
  13. final TextView tv = new TextView(this);
  14. tv.setWidth(100);
  15. tv.setHeight(100);
  16. tv.setText("中华人民共和国");
  17. ll_animation.addView(tv);//对应type = APPEARING
  18. ll_animation.postDelayed(new Runnable() {
  19. @Override
  20. public void run() {
  21. ll_animation.removeView(tv);
  22. }
  23. }, 2000);
时间: 2024-10-12 23:36:32

(转)Android Property Animation 属性动画的相关文章

Android研究之属性动画(Property Animation)完全解析详解下

 上一篇Android研究之属性动画(Property Animation)完全解析详解上已经基本展示了属性动画的核心用法: ObjectAnimator实现动画,ValueAnimator实现动画,AnimatorSet的使用等~ 当然了属性动画还有一部分的知识点,也能做出很不错的效果,将在本篇博客为您展示~ 1.如何使用xml文件来创建属性动画 大家肯定都清楚,View Animator .Drawable Animator都可以在anim文件夹下创建动画,然后在程序中使用,甚至在The

Android Property Animation

Property Animation介绍: 出生在3.0,是利用了View所拥有的属性,进行一系列的操作.比如一个View有什么样的setAbc的属性,那么理论上就可以设置它. 它不仅改变View的绘制,也改变了View的属性:而Tween Animation 只改变View的绘制. ValueAnimator 为动画的基类,它有一个子类ObjectAnimator.需要Interpolator和TypeEvaluator来计算属性值. Interpolator 时间插入器,动画的运动速率,参见

【Property Animator 属性动画】

1.  为什么要使用属性动画? Google在3.0以后推出了属性动画,之所以会出属性动画,是因为传统动画在对象交互方面存在缺陷. 可以通过一个很经典的例子来发现属性动画和传统动画的区别. 先来看一个现象: 可以观察到: 传统动画播放完毕后,点击显示的view是没有响应产生的.说明view的属性并没有因为动画的变化而变化. 属性动画播放完毕后,点击显示的view是有响应产生的.说明view的属性跟随动画的变化改变了. 上述效果的实现的实现关键代码: //传统动画 TranslateAnimati

Android笔记之属性动画

前言.动画分类 如下图所示,Android的动画主要分为三种: 下面首先说说 属性动画 所谓属性动画-- 就是指对象的属性值发生了变化,如控件位置和透明度等. 举例,现在要实现一个按键先下移,再右移的动画. (1)编写动画xml 由于新建android工程的时候,在res下面并没有专门放置动画xml的文件夹,因此,我们新建一个animator名称的文件夹.建议不要起别的名字,因为ADT对res的文件夹命名有检索功能,如起animator这个名字的时候,ADT就能根据名称识别出这个是动画xml文件

Android ListView Animation 布局动画

AnimationSet set = new AnimationSet(false); Animation animation = new AlphaAnimation(0,1); //AlphaAnimation 控制渐变透明的动画效果 animation.setDuration(500); //动画时间毫秒数 set.addAnimation(animation); //加入动画集合 animation = new TranslateAnimation(1, 13, 10, 50); //S

Android学习之 属性动画&lt;Property Animation&gt;

property 动画系统是相当健壮的框架,它几乎可以动画显示任何对象. 你可以定义一个动画来定时改变任何对象的属性值,不论该对象是否在屏幕上显示. property 动画将以一定的时间间隔修改属性值(对象中的字段值). 要实现动画显示,你须指定对象的相应属性(比如对象的屏幕位置),以及动画时长.动画时间间隔. property 动画系统能让你设定以下动画要素: 1.持续时间:指定动画的持续显示时间.默认的时长是300毫秒. 2.插值因子:指定属性值的变化方式,表示为关于动画已显示时间的函数.

Android(java)学习笔记263:Android下的属性动画(Property Animation)

1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(tweened animation). 逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理. 补间动画则是可以对View进行一系列的动画操作,包括淡入淡出.缩放.平移.

Android(java)学习笔记264:Android下的属性动画高级用法(Property Animation)

1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了很大幅度的改进,之前补间动画可以做到的属性动画也能做到,补间动画做不到的现在属性动画也可以做到了.因此,今天我们就来学习一下属性动画的高级用法,看看如何实现一些补间动画所无法实现的功能. 2. ValueAnimator的高级用法: 在上篇文章中介绍补间动画缺点的时候有提到过,补间动画是只能对

Android Property Animation动画

3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三种动画模式在SDK中被称为property animation,view animation,drawable animation. 可通过NineOldAndroids项目在3.0之前的系统中使用Property Animation 1. View Animation(Tween Animatio