Android-Property Animation-ObjectAnimator
Property Animation(属性动画)是Android 3.0引进的(introduced in Android 3.0),API Level 11,可以让对象的任何属性进行动画变换。可以根据时间的推移来改变任何对象的属性来定义一个动画,而不用关心该对象是否要绘制在屏幕上。
属性动画系统可以定义以下动画特性:
1. Duration(持续时间):指定动画的持续时间。默认长度是300毫秒。
2.Animator sets (动画集合):把动画组织到一个逻辑集合中,然后或者同时、或者顺序的、或者延迟播放它们。
3. Repeat count and behavior(重复次数和行为):指定在动画结束时是否重新播放动画,以及重复播放的次数。还可以指定动画是否能够反向回播,如果设置了反向回播,那么动画就会先向前再向后,重复播放,直到达到播放的次数。
4. Time interpolation(时间插值):能够做为计算当前动画运行时间的函数的属性值来指定,它决定动画的变化频率。
5.Frame refresh delay( 帧刷新延迟):指定动画帧的刷新频率。默认是每10秒中刷新一次,但是应用程序最终的刷新帧的速度依赖与系统的繁忙程度以及系统能够提供的底层定时器的反应速度。
1.ObjectAnimator实现简单的动画
ObjectAnimator是ValueAnimator的子类,在构造函数中传入了目标对象和对应属性值的名字(要求对象类有相应的get/set方法),会自动进行属性值的设置。
首先需要实例化一个ObjectAnimator对象,ObjectAnimator提供了ofInt、ofFloat、ofObject,这几个方法都是设置动画作用的元素、作用的属性、动画开始、结束、以及中间的任意个属性值。指定该方法的参数:动画的对象(如下为imageView)、对象的动画属性(如"rotationX"、"translationY"等)。
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView,"rotationX",0F,360F);
objectAnimator.setDuration(3000);
objectAnimator.start();
以上就可以实现一个简单的动画。
2.Animator sets 动画集合
当有多个动画的时候,可以使用动画集合Animator sets把动画组织到一个逻辑集合中,然后或者同时、或者顺序的、或者延迟播放它们(调用相应的方法实现所要的功能,如playTogether多个动画同时执行、playSequentially多个动画依次执行)。
)。
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(objectAnimator1,objectAnimator2,objectAnimator3); //playTogether多个动画同时执行,playSequentially多个动画依次执行
animatorSet.setDuration(3000);
animatorSet.start();
也可以这样:animatorSet.play
(objectAnimator1).
with(objectAnimator2);
animatorSet.play(objectAnimator2).with(objectAnimator3);
animatorSet.play(objectAnimator3).after(objectAnimator2);等。
我们可以添加某个动画的监听,监听动画的开始、结束、被取消、重复等事件
objectAnimator3.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
Toast.makeText(MainActivity.this,"animation end",Toast.LENGTH_SHORT).show();
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
如果我们仅需要知道动画的结束,那么就不必重写以上的开始、结束、被取消等每个方法,这时可以使用AnimatorListenerAdapter。This adapter class provides empty implementations of the methods from Animator.AnimatorListener. Any custom listener that cares only about a subset of the methods of this listener can simply subclass this adapter class instead of implementing the interface directly.
objectAnimator3.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
Toast.makeText(MainActivity.this,"end Animation",Toast.LENGTH_SHORT).show();
}
});
4.运用以上知识点实现动画
public class MainActivity extends Activity implements View.OnClickListener{
ImageView imageView;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image1);
button = (Button) findViewById(R.id.bt_move);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.bt_move :
StartAnimation();
break;
}
}
public void StartAnimation(){
ObjectAnimator objectAnimator00 = ObjectAnimator.ofFloat(imageView,"rotationX",0F,360F);
ObjectAnimator objectAnimator0 = ObjectAnimator.ofFloat(imageView,"translationY",0F,150F);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView,"alpha",0F,1F);
ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(imageView,"scaleX",0F,1F);
ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(imageView,"scaleY",0F,1F);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(objectAnimator1,objectAnimator2,objectAnimator3); //playTogether多个动画同时执行,playSequentially多个动画依次执行
animatorSet.play(objectAnimator00).after(objectAnimator0);
animatorSet.setDuration(3000);
animatorSet.start();
// objectAnimator1.setDuration(5000);
// objectAnimator1.start();
objectAnimator3.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
Toast.makeText(MainActivity.this,"animation end",Toast.LENGTH_SHORT).show();
}
});
// objectAnimator3.addListener(new Animator.AnimatorListener() {
// @Override
// public void onAnimationStart(Animator animator) {
//
// }
//
// @Override
// public void onAnimationEnd(Animator animator) {
// Toast.makeText(MainActivity.this,"animation end",Toast.LENGTH_SHORT).show();
// }
//
// @Override
// public void onAnimationCancel(Animator animator) {
//
// }
//
// @Override
// public void onAnimationRepeat(Animator animator) {
//
// }
// });
}
}