属性动画ObjectAnimator

来源:互联网 发布:网络虚拟技术 编辑:程序博客网 时间:2024/05/23 16:05
在项目中,我做动画做的比较少。最近看些开源项目,里面
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
原创粉丝点击