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

 一、属性动画详解:

 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();  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值