属性动画----Property Animation

浪子不回头ぞ 提交于 2020-01-01 13:30:55

一、Property  Animation介绍   

       属性动画可以对任何对象的属性进行动画(包括view),动画默认时间为300ms,默认帧率10ms/帧。在一个时间间隔内完成从一个属性值到另一个属性值得改变。

      属性动画是API11才有,之前的版本无法直接使用,可以采用开源动画库nineoldandroids来兼容以前的版本。

2、属相动画相关的类

类名 用途
ValueAnimator 属性动画主要的计时器,也计算动画后的属性的值,动画的执行类
ObjectAnimation ValueAnimation的一个子类,动画的执行类
AnimatorSet 动画集合
AnimatorInflater 用户加载属性动画的xml
Evaluators 属性动画计算器,告诉了属性动画系统如何计算给出属性的值
Interpolators 动画插值器

       关系图:

                          

3、相关属性介绍

名称 解析
propertyName 属性名 alpha;scaleX;scaleY;rotate;translationX;translationY
duration 时长  
valueFrom 属性的起始值  
valueTo

属性的结束值

 
startOffset 动画延迟时间  
repeatCount 动画重复次数  
repeatMode 重复模式  
valueType 属性的类型 floatType,colorType,intType,pathType
ordering 顺序(集合中使用) together,sequentially

 

二、属性动画

1、ObjectAnimator

        ObjectAnimator是ValueAnimator的子类。

(1)xml实现方式

//定义
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:propertyName="alpha"
    android:repeatCount="1"
    android:repeatMode="reverse"
    android:startOffset="200"
    android:valueFrom="0.0"   
    android:valueTo="1.0"      
    android:valueType="floatType" />

//使用
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.anim);
anim.setTarget(imageView);
anim.start();
  • xml文件在res/animator/文件夹下,根节点是objectAnimatior

(2)ObjectAnimatior类实现

ObjectAnimator scaleXAnimator = ObjectAnimator.ofInt(img, "backgroundColor", 
Color.parseColor("#ffffff"), Color.parseColor("#000000"));
scaleXAnimator.setDuration(5000);
scaleXAnimator.setEvaluator(new ArgbEvaluator());
scaleXAnimator.start();

2、ValueAnimator

(1)xml实现方式

<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
      android:duration="5000"
      android:fillAfter="true"
      android:propertyName="scaleY"
      android:valueFrom="1"
      android:valueTo="5"
      android:valueType="floatType"/>

//使用
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.set);
anim.setTarget(imageView);
anim.start();
  • xml文件在res/animator/文件夹下,根节点是animatior

 

3、AnimatorSet

(1)xml实现方式

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">
    <objectAnimator
        android:duration="5000"
        android:fillAfter="true"
        android:propertyName="scaleX"
        android:valueFrom="1"
        android:valueTo="5"
        android:valueType="floatType" />
    
    <animator
        android:duration="5000"
        android:fillAfter="true"
        android:propertyName="scaleY"
        android:valueFrom="1"
        android:valueTo="5"
        android:valueType="floatType" />
</set>

//使用
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.set);
anim.setTarget(imageView);
anim.start();
  • xml文件在res/animator/文件夹下,根节点是set

(2)AnimatorSet类实现

AnimatorSet animatorSet = new AnimatorSet();

ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 1.5f);
scaleXAnimator.setDuration(500);
scaleXAnimator.setRepeatCount(1);
scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);

ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 1.5f);
scaleYAnimator.setDuration(500);
scaleYAnimator.setRepeatCount(1);
scaleYAnimator.setRepeatMode(ValueAnimator.REVERSE);

animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
animatorSet.start();

(3)动画集合的播放方式

  • playTogether  同时执行
animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
animatorSet.start();
  • 通过play函数返回Animator.Builder的实例,设置播放方式
AnimatorSet animatorSet = new AnimatorSet();
AnimatorSet.Builder play = animatorSet.play(animator1);
play.after(animator2);//将现有动画插入到传入的动画之后执行
play.with(animator2);//将现有动画和传入的动画同时执行
play.before(animator2);//将现有动画插入到传入的动画之前执行
animatorSet.start();
  • 依次播放方式
animatorSet.playSequentially(animator1,animator2);//依次执行
animatorSet.start();

 

4、添加动画监听

new  ObjectAnimator().addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
        //TODO 动画开始前的操作
    }

    @Override
    public void onAnimationEnd(Animator animation) {
        //TODO 动画结束的操作
    }

    @Override
    public void onAnimationCancel(Animator animation) {
        //TODO 动画取消的操作
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
        //TODO 动画重复的操作
    }
});

 

5、监听简单动画执行过程中的变化

new ObjectAnimator().addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float value = (float) animation.getAnimatedValue();
      
    }
});

 

三、属性动画的原理

 

 

直通车之------Frame  Animation

直通车之------Tween Animation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!