Android 属性动画详解 一、属性动画与属性动画组

来源:互联网 发布:淘宝店换行业有影响吗 编辑:程序博客网 时间:2024/05/07 04:30
 一、属性动画详解:

 1、首先明确一个概念,属性动画是通过不停的改变View的属性然后产生动画效果。所以,不像基础动画,属性动画可以真实的改变View的位置。

 2、简单介绍一下translationX,translationY与 X,Y属性:
  translationX : 指的是View距离其原始位置的距离

  X : View距离父View最左边的距离


 3、属性动画的使用;

  在弄懂了属性动画是通过改变View的属性来显示动画的原理后,即ObjectAnimator是不停的set View的一个属性,即是使用java的反射机制来实现,所以,拿下面的例子:

  view . setTranslationX(float);

  这个View如果想改变translationX的值的话,要往里面传入一个float类型的参数。
  即,首先这个属性要有get和set方法,get方法是用来得到当前的属性值,set是用来在动画过程中设置对应属性值。其次,要知道set这个属性传入的类型。
  所以,上面的如果想改变translationX来实现动画效果的话,应该这么写:
 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(animationBt, "translationY”,100.0); objectAnimator.setDuration(500); objectAnimator.start();

 4、一些常用的可以直接用于属性动画的:
  translationX:指的是View距离其原始位置的距离
  X:View距离父View最左边的距离
  rotation,rotationX,rotationY:这三个属性控制View对象围绕支点进行2D和3D旋转
  scaleX:控制着View对象围绕它的指点进行2D缩放
  pivotX:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理,默认情况下,该支点的位置就是View对象的中心点

  alpha:表示View的透明度。默认值是1(不透明),0代表完全透明(不可见)。


 5、对于一个没有直接set还有get的属性来说,想实现相应的属性动画,有两种方法:
  1.通过自定义一个属性类或者包装类,来间接的给这个属性增加get,set方法。
  2.通过ValueAnimator来实现,这个会在下一节讲解。

二、属性动画组详解:

1、PropertyValuesHolder:
  如果针对同一View的多个属性要做出属性动画,可以使用PropertyValuesHolder来实现;
  eg:

  PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("translationX", 300);  PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.1f);  PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.1f);  ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(animationBt, holder1, holder2, holder3);  animator.setDuration(1000);  animator.start();

 二、AnimatorSet与AnimatorSet.Builder:
  PropertyValuesHolder的缺点是不能实现精确的顺序控制,而AnimatorSet可以。AnimatorSet可以通过playTogether,playSequentially,AnimatorSet.Builderd的with(),before(),after()来实现动画组合。
  eg:
 

  ObjectAnimator animator1 = ObjectAnimator.ofFloat(animationBt,"translationX",300);  animator1.setDuration(500);  ObjectAnimator animator2 = ObjectAnimator.ofFloat(animationBt,"scaleX",0.5f);  animator2.setDuration(500);  ObjectAnimator animator3 = ObjectAnimator.ofFloat(animationBt,"scaleY",0.5f);  animator3.setDuration(500);    AnimatorSet set = new AnimatorSet();  //1.按先后顺序执行动画  set.setDuration(1500);  set.playSequentially(animator1,animator2,animator3);  set.start();  //2.一起执行动画  set.setDuration(500);  set.playTogether(animator1,animator2,animator3);  set.start();  //3.先在500ms完成第一个,在一起完成第2个和第3个  set.setDuration(1000);  set.play(animator2).with(animator3);  set.play(animator1).before(animator2);     set.start();  

1 0
原创粉丝点击