属性动画----Property Animation

一、Property  Animation介绍   

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

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

2、属相动画相关的类

类名用途
ValueAnimator属性动画主要的计时器,也计算动画后的属性的值,动画的执行类
ObjectAnimationValueAnimation的一个子类,动画的执行类
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值