android 动画之 属性动画propertyAnimator(一)
2015-12-17 18:32
549 查看
ValueAnimator
ValueAnimator是整个属性动画机制当中最核心的一个类,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。但是ValueAnimator的用法却一点都不复杂,我们先从最简单的功能看起吧,比如说想要将一个值从0平滑过渡到1,时长300毫秒,就可以这样写:
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.start();
这样就能从0耗时300毫秒后平滑过渡到了1,这是很简单的例子,当然我们还可以传入多个参数,那么,除了第一个是起始位置,最后一个是结束位置外,中间的其他数据都是过渡数据,例如
ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 0f);
anim.setDuration(5000);
anim.start();
这样就是先从0过渡到5,再从5过渡到3,然后在从3过渡到0;耗时5000ms;
还可以对ValueAnimator添加监听器:
<span style="color:#333333;"></span><pre name="code" class="java"><pre name="code" class="java">backGroundColorAutoChangeAnimator.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { // TODO Auto-generated method stub
//动画开始时执行 } @Override public void onAnimationRepeat(Animator animation) { // TODO Auto-generated method stub //重复动画时执行 } @Override public void onAnimationEnd(Animator animation) { // TODO Auto-generated method stub //动画结束执行 } @Override public void onAnimationCancel(Animator animation) { // TODO Auto-generated method stub //取消动画时执行 } }); backGroundColorAutoChangeAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { // TODO Auto-generated method stub ///动画更新时执行 } });
当然也许你并不需要小数位数的动画过渡,可能你只是希望将一个整数值从0平滑地过渡到100,那么也很简单,只需要调用ValueAnimator的ofInt()方法就可以了,如下所示:
ValueAnimator anim = ValueAnimator.ofInt(0, 100);
alueAnimator当中最常用的应该就是ofFloat()和ofInt()这两个方法了,另外还有一个ofObject()方法,
除此之外,我们还可以调用setStartDelay()方法来设置动画延迟播放的时间,调用setRepeatCount()和setRepeatMode()方法来设置动画循环播放的次数以及循环播放的模式,循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思。
ObjectAnimator
相比于ValueAnimator,ObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。不过虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似,这里如果我们想要将一个TextView在5秒中内从常规变换成全透明,再从全透明变换成常规,就可以这样写:
ValueAnimator backGroundColorAutoChangeAnimator = ObjectAnimator.ofInt(mPaint, "color", Color.WHITE, Color.BLACK);第一个参数是执行动画的对象,通常是View
第二个参数是动画变化的属性,如:textSize,textColor,alpha...通常她的取值是由第一个参数决定,只有当第一个参数中有对应的getter和setter方法后才可以
第三四参数是属性的取值范围,可以不止两个值
动画集合 set
独立的动画能够实现的视觉效果毕竟是相当有限的,因此4000
将多个动画组合到一起播放就显得尤为重要。幸运的是,Android团队在设计属性动画的时候也充分考虑到了组合动画的功能,因此提供了一套非常丰富的API来让我们将多个动画组合到一起。
实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行
可以这样写:
ValueAnimator backGroundColorAutoChangeAnimator = ObjectAnimator.ofInt(mPaint, "color", Color.WHITE, Color.BLACK);playTogether();和给定的动画同事执行,可以是一组动画。对应的还有一个顺序执行的方法:
// backGroundColorAutoChangeAnimator.setDuration(10000);
backGroundColorAutoChangeAnimator.setEvaluator(new ArgbEvaluator());
backGroundColorAutoChangeAnimator.setRepeatCount(ValueAnimator.INFINITE);
backGroundColorAutoChangeAnimator.setRepeatMode(ValueAnimator.REVERSE);
// backGroundColorAutoChangeAnimator.start();
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(s1, backGroundColorAutoChangeAnimator);// 并行
animatorSet.setDuration(5000);
// animatorSet.play(animator).with(backGroundColorAutoChangeAnimator);
animatorSet.start();
animatorSet.playSequentially();于给定的动画一次执行。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories