Android动画(二),属性动画

来源:互联网 发布:软件项目关键技术指标 编辑:程序博客网 时间:2024/04/30 09:12
属性动画:

ValueAnimator 是整个属性动画机制当中最核心的一个类,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator 这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给 ValueAnimator,并且告诉它动画所需运行的时长,那么 ValueAnimator 就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator 还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f,5f,3f,10f);
valueAnimator.setDuration(5000);
valueAnimator.start();

上面的代码意思是将一个值在5秒内从0过渡到5,再过渡到3,再过渡到10.

相比于ValueAnimator,ObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。不过虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似,这里如果我们想要将一个TextView在5秒中内从常规变换成全透明,再从全透明变换成常规,就可以这样写:

/**
* create by Dashy
* on 2017/4/29 10:41
*/
public classMainActivityextendsAppCompatActivity {
TextViewtextView;

@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView= (TextView) findViewById(R.id.main_tv);
ObjectAnimator fadein =ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f);
fadein .setDuration(3000);
fadein .setRepeatCount(10);
fadein .setRepeatMode(ValueAnimator.RESTART);
fadein .start();
}
}

ObjectAnimator 可以直接对任意对象的任意属性进行动画操作的,比如说 TextView 的 rotation 属性 alpha、rotation、translationX 和 scaleY 这几个值,分别可以完成淡入淡出、旋转、水平移动、垂直缩放这几种动画.
其实 ObjectAnimator 内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的 get和 set 方法

组合动画:

实现组合动画功能主要需要借助 AnimatorSet 这个类,这个类提供了一个 play() 方法,如果我们向这个方法中传入一个 Animator 对象( ValueAnimator 或 ObjectAnimator )将会返回一个 AnimatorSet.Builder 的实例,AnimatorSet.Builder 中包括以下四个方法:
after(Animator anim)   将现有动画插入到传入的动画之后执行
after(long delay)   将现有动画延迟指定毫秒后执行
before(Animator anim)   将现有动画插入到传入的动画之前执行
with(Animator anim)   将现有动画和传入的动画同时执行
有了这四个方法,我们就可以完成组合动画的逻辑了,那么比如说我们想要让 TextView 先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作,就可以这样写:
ObjectAnimator rotate = ObjectAnimator.ofFloat(textView,"rotation",0f,360f);
ObjectAnimator fadein = ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f);
ObjectAnimator animator = ObjectAnimator.ofFloat(textView,"translationX", -500f,0f);
AnimatorSet set =newAnimatorSet();
set.play(rotate).with(fadein).after(animator);
set.setDuration(5000);
set.start();

这里我们先是把三个动画的对象全部创建出来,然后new出一个 AnimatorSet 对象之后将这三个动画对象进行播放排序,让旋转和淡入淡出动画同时进行,并把它们插入到了平移动画的后面,最后是设置动画时长以及启动动画.

Animator监听器:
ObjectAnimator rotate = ObjectAnimator.ofFloat(textView,"rotation",0f,360f);
rotate.addListener(newAnimator.AnimatorListener() {
@Override
public voidonAnimationStart(Animator animation) {
Log.d(TAG,"onAnimationStart");
}

@Override
public voidonAnimationEnd(Animator animation) {
Log.d(TAG,"onAnimationEnd");
}

@Override
public voidonAnimationCancel(Animator animation) {
Log.d(TAG,"onAnimationCancel");
}

@Override
public voidonAnimationRepeat(Animator animation) {
Log.d(TAG,"onAnimationRepeat");
}
});
onAnimationStart() 方法会在动画开始的时候调用,onAnimationRepeat() 方法会在动画重复执行的时候调用,onAnimationEnd() 方法会在动画结束的时候调用,onAnimationCancel() 方法会在动画被取消的时候调用。
由于 addListener 必须要实现四个方法,很多时候我们并不想要监听那么多个事件,可能我只想要监听动画结束这一个事件,那么每次都要将四个接口全部实现一遍就显得非常繁琐。为此 Android 提供了一个适配器类,叫作 AnimatorListenerAdapter,使用这个类就可以解决掉实现接口繁琐的问题了,如下所示:
rotate.addListener(newAnimatorListenerAdapter() {
@Override
public voidonAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
0 0
原创粉丝点击