属性动画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中的动画就不写了,大同小异。
- 属性动画ObjectAnimator
- 属性动画之ObjectAnimator
- 属性动画之ObjectAnimator
- 属性动画ObjectAnimator
- Android动画-属性动画-ObjectAnimator
- android 动画 属性动画 ObjectAnimator
- android 属性动画之 ObjectAnimator
- 属性动画ValueAnimator和ObjectAnimator
- android 属性动画之 ObjectAnimator
- Android属性动画之ObjectAnimator
- android 属性动画之 ObjectAnimator
- android 属性动画之 ObjectAnimator
- 属性动画 进阶(ObjectAnimator)
- android 属性动画之 ObjectAnimator
- android 属性动画之 ObjectAnimator
- 【Android动画九章】-属性动画ObjectAnimator
- Android 动画之属性动画ObjectAnimator
- 安卓属性动画PropertyValuesHolder、ObjectAnimator
- web面试题2
- JS 基础概念
- 联想笔记本 切换简体和繁体
- python抓取js加载的数据(phantomjs)
- Android图表库MPAndroidChart(一)——了解他的本质,方能得心应手
- 属性动画ObjectAnimator
- memcache实现消息队列实例
- Java实现HuffmanTree
- JAVA方法参数传递详解
- 在同一台物理机上配置多个ActiveMq主程序
- iOS如何实现录音
- static关键字的用法
- Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务
- openlayer绘图时禁止移动地图的两种方式