public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView= (TextView) findViewById(R.id.tv);
/**
* valueAnimator 动画类
* ValueAnimator是整个属性动画机制当中最核心的一个类,
* 属性动画的运行机制是通过不断地对值进行操作来实现的,
* 而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。
* 它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,
* 我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,
* 那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果
*/
ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,1);
valueAnimator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//显示出:0-1之间值的,每个值代表一个动画的一帧
System.out.println("============="+animation.getAnimatedValue());
}
});
// valueAnimator.setStartDelay(1000);//动画播放延迟的时间
// valueAnimator.setRepeatCount(3);//动画模式播放的次数
//循环模式包括RESTART和REVERSE两种,分别表示重新播放和倒序播放的意思
// valueAnimator.setRepeatMode(ValueAnimator.RESTART);
valueAnimator.start();
注:ValueAnimator.ofFloat(0,1),为什么就是返回的(0,1)之间的数据呢?那,我要怎么才能返回自己需要的数据呢?这个就是涉及到TypeEvaluator类了,后续会着重讲到这个接口。这是个重点,切记切记。
/**
* ObjectAnimator 动画类
* 继承于valueAnimator 类
* ofFloat( Object target, String propertyName, float... values)的3个参数
* target:目标,例如:控件
* propertyName:属性,目标所具有的属性
* values:该属性对应的一系列值
*/
//该textView 先淡出,在显示。因为设置的是:alpha属性。
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f);
objectAnimator.setDuration(6000);
objectAnimator.start();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//该textView旋转,先旋转360后,在旋转回来
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"rotation",0f,360f,0f);
objectAnimator.setDuration(6000);
objectAnimator.start();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//获取当前控件的水平位置
float currentX=textView.getTranslationX();
//该textView从当前位置,先向左平移500个单位,在平移回到当前位置。
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"translationX",currentX,-500,currentX);
objectAnimator.setDuration(5000);
objectAnimator.start();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 该textView横向或者纵向拉伸
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"scaleY",1f,3f,1f);
objectAnimator.setDuration(3000);
objectAnimator.start();
/**
* 组合动画
*
* 实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,
* 如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,
* AnimatorSet.Builder中包括以下四个方法:
* after(Animator anim) 将现有动画插入到传入的动画之前执行
* after(long delay) 将现有动画延迟指定毫秒后执行
* before(Animator anim) 将现有动画插入到传入的动画之后执行
* with(Animator anim) 将现有动画和传入的动画同时执行
*/
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f);
ObjectAnimator objectAnimator1=ObjectAnimator.ofFloat(textView,"rotation",0f,360f,0f);
float currentX=textView.getTranslationX();
ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(textView,"translationX",currentX,-500,currentX);
ObjectAnimator objectAnimator3=ObjectAnimator.ofFloat(textView,"scaleY",1f,3f,1f);
ObjectAnimator objectAnimator4=ObjectAnimator.ofFloat(textView,"scaleX",1f,3f,1f);
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.play(objectAnimator)
.after(objectAnimator2)
.with(objectAnimator1)
.with(objectAnimator3)
.with(objectAnimator4);
animatorSet.setDuration(5000);
animatorSet.start();
/**
* Animator监听器
* Animator类当中提供了一个addListener()方法,这个方法接收一个AnimatorListener,我们只需要去实现这个AnimatorListener就可以监听动画的各种事件了。
*/
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f);
objectAnimator.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) {
//动画重复
}
});
/**
* 是也许很多时候我们并不想要监听那么多个事件,可能我只想要监听动画结束这一个事件,
* 那么每次都要将四个接口全部实现一遍就显得非常繁琐。没关系,为此Android提供了一个适配器类,
* 叫作AnimatorListenerAdapter,使用这个类就可以解决掉实现接口繁琐的问题了.
*/
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
}
}