属性动画ObjectAnimator

在项目中,我做动画做的比较少。最近看些开源项目,里面
ObjectAnimator waveShiftAnim = ObjectAnimator.ofFloat(
        mWaveView, "waveShiftRatio", 0f, 1f);      

对第二个参数不是很了解,以为是tag之类的东西。但是如果这么理解就很神奇了,他是怎么实现动画的。我就开始学习属性动画了。

View Animation只能实现平移缩放旋转等简单的动画,对于颜色变化,位置变化就实现不了, Propterty Animation就能实现这些,他是通过改变对象的属性,设置持续时间,时间差值来实现动画效果的。



来了解下 Propterty Animation相关的属性:

Duration:动画的持续时间,默认300ms。

Time interpolation:时间差值,定义动画的变化率。

Repeat count and behavior:重复次数、以及重复模式;

Animator sets: 动画集合,可以多个动画组合到一起执行。

Frame refresh delay:帧刷新延迟,就是多久刷新一次帧;默认是10ms,但最终依赖系统的当前状态;基本不用管。

以及相关的类

ObjectAnimator  动画的执行类

ValueAnimator 动画的执行类 

AnimatorSet 用于控制一组动画的执行:用with, before,after来表示动画执行的顺序。

AnimatorInflater 用户加载属性动画的xml文件,属性动画师可以写在xml文件中的



来试试怎么用:

ObjectAnimator animator = ObjectAnimator.ofFloat(textView, "translationX", 0.0f, 500f);
animator.setDuration(2000);
animator.setRepeatCount(-1);
animator.setRepeatMode(ValueAnimator.RESTART);
animator.setStartDelay(3000);
animator.start();

这是最简单的用法了,其中ofFloat的参数分别是:动画作用的对象,动画改变的属性,后面动画属性的改变值,这个值可以是很多个。第2到5行是设置持续时间,重复次数重复模式,开始的延迟时间。那么这个动画类实现的就是对textView对象X方向上的平移动画。


我们可以通过设置监听器来监听动画执行期间的动画状态:

animator.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) {

    }
});
这个监听器就是监听动画整个生命周期,开始,结束,取消,重复的。


animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
    }
});

前面的那个监听器必须要实现四个方法,那么现在的这个监听器就好一些了,你可以根据你的需要分别实现其中的方法,还有额外的onAnimationPause  和onAnimationResume方法,是监听动画暂停和启动的。

那么这个动画既然是持续一定时间的,当然能对它在这个持续时间内的状态进行监听了,就是下面这个:

 

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        animation.getAnimatedValue();
        animation.getCurrentPlayTime();
        animation.getDuration();
        animation.getStartDelay();
        //...
    }
});

在方法中可以获取到各个时间的状态。


组合动画:

方式一:

通过AnimationSet:

AnimatorSet set = new AnimatorSet();
ObjectAnimator animator = ObjectAnimator.ofFloat(textView, "translationX", 0.0f, 500f);
ObjectAnimator animator1 = ObjectAnimator.ofFloat(textView, "rotationX", 0f, 45f, 90f, 45f);
set.play(animator).with(animator1);
set.start();
AnimationSet动画集添加多个Animation对象,组合到一起播放。

方式二:

通过PropertyValueholder:

 
PropertyValuesHolder valuesHolder = PropertyValuesHolder.ofFloat("translationX", 0.0f, 300.0f);
PropertyValuesHolder valuesHolder1 = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 1.5f);
PropertyValuesHolder valuesHolder2 = PropertyValuesHolder.ofFloat("rotationX", 0.0f, 90.0f, 0.0F);
PropertyValuesHolder valuesHolder3 = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.3f, 1.0F);
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(textView, valuesHolder, valuesHolder1, valuesHolder2, valuesHolder3);
objectAnimator.setDuration(2000).start();
这个方法是将执行动画的对象和动画本身分开,方便直接对动画本身进行操作,之后再用ObjectAnimator.ofPropertyValuesHolder把 执行动画的对象和动画结合起来。


额外的补充下:由PropertyValueholder引出的,控制动画执行的另一种方式

Keyframe kf1 = Keyframe.ofFloat(0f, 0f);
Keyframe kf2 = Keyframe.ofFloat(0.5f, 200f);
Keyframe kf3 = Keyframe.ofFloat(1f, 600f);

PropertyValuesHolder pvh = PropertyValuesHolder.ofKeyframe("translationX", kf1, kf2, kf3);
ObjectAnimator ob = ObjectAnimator.ofPropertyValuesHolder(textView, pvh);
ob.start();
KeyFrame.ofFloat的两个参数分别是动画执行的相对时间值(当前的动画时间与持续时间百分比的值),属性值。

设置了执行的各个时间段属性的值,然后组合起来形成动画。

这个动画就是对textView对象执行x方向的位移变化,在开始时间位置是0,执行到一半的时间位置是200,执行到最后,位置是600.



在xml中的动画就不写了,大同小异。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值