属性动画的基本用法

Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。

补间动画的缺陷:
1、补间动画只能够作用在View上;
2、补间动画只能够实现移动、缩放、旋转和淡入淡出这四种动画操作;
3、补间动画只是改变了View的显示效果而已,而不会真正去改变View的属性。

属性动画机制实际上是一种不断地对值进行操作的机制,并将值赋值到指定对象的指定属性上,可以是任意对象的任意属性。

使用Java代码定义属性动画

ValueAnimator

属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。

示例演示

// 获取ValueAnimator实例
// 0f, 5f, 3f, 10f为给定的值
ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);
// 设置动画持续时间
anim.setDuration(300);
// 添加监听器
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
                // 获取当前值
        float currentValue = (float) animation.getAnimatedValue();
        Log.d(TAG, "currentValue: " + currentValue);
    }
});
anim.start();       

运行结果

D/MainActivity: currentValue: 0.0
D/MainActivity: currentValue: 0.11853263
D/MainActivity: currentValue: 1.7715302
D/MainActivity: currentValue: 2.659067
D/MainActivity: currentValue: 3.818223
D/MainActivity: currentValue: 4.9866004
D/MainActivity: currentValue: 4.469303
D/MainActivity: currentValue: 3.9685845
D/MainActivity: currentValue: 3.365308
D/MainActivity: currentValue: 10.0

ValueAnimator的常用方法:
  1)ValueAnimator.ofFloat()方法:添入float类型的值
  2)ValueAnimator.ofInt()方法:添入int类型的值
  3)ValueAnimator.ofObject()方法:添入Object对象
  4)anim.setStartDelay()方法:设置动画延迟播放的时间
  5)anim.setRepeatCount()方法:设置动画循环播放的次数
  6)anim.setRepeatMode()方法:设置动画循环播放的模式,循环模式(RESTART:重新播放、REVERSE:倒序播放)

ObjectAnimator

ObjectAnimator继承自ValueAnimator它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。

1)淡入淡出

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
animator.setDuration(5000);  
animator.start();  

2)旋转

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
animator.setDuration(5000);  
animator.start();  

3)移动

float curTranslationX = textview.getTranslationX();  
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", 
curTranslationX, -500f, curTranslationX);  
animator.setDuration(5000);  
animator.start();  

4)缩放

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);  
animator.setDuration(5000);  
animator.start(); 
AnimatorSet

实现组合动画功能主要需要借助AnimatorSet这个类。
  1)play(Animator anim)方法:播放动画
  2)after(Animator anim)方法:将现有动画插入到传入的动画之后执行
  3)after(long delay)方法:将现有动画延迟指定毫秒后执行
  4)before(Animator anim)方法:将现有动画插入到传入的动画之前执行
  5)with(Animator anim)方法:将现有动画和传入的动画同时执行

ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);  
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
AnimatorSet animSet = new AnimatorSet();  
animSet.play(rotate).with(fadeInOut).after(moveIn);  
animSet.setDuration(5000);  
animSet.start();  
Animator监听器

1)AnimatorListener

anim.addListener(new Animator.AnimatorListener() {
        // 在动画开始的时候调用
    @Override
    public void onAnimationStart(Animator animation) {
                
    }

        // 在动画结束的时候调用
    @Override
    public void onAnimationEnd(Animator animation) {

    }

        // 在动画被取消的时候调用
    @Override
    public void onAnimationCancel(Animator animation) {

    }

        // 在动画重复执行的时候调用
    @Override
    public void onAnimationRepeat(Animator animation) {

    }
});

2)AnimatorListenerAdapter

anim.addListener(new AnimatorListenerAdapter() {  
     // 在动画结束的时候调用
    @Override  
    public void onAnimationEnd(Animator animation) {  
    }  
}); 

使用XML定义属性动画

如果想要使用XML来编写动画,要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中。

在XML文件中一共可以使用如下三种标签:
   对应代码中的ValueAnimator
  对应代码中的ObjectAnimator
  对应代码中的AnimatorSet

编写
res/animator/anim_file

  
  
  
  
      
      
  
      
          
          
  
          
              
              
              
              
          
      
  

使用

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
animator.setTarget(view);  
animator.start();  

参考

Android属性动画完全解析(上),初识属性动画的基本用法

你可能感兴趣的:(属性动画的基本用法)