一.概述
在Android动画中,总共有两种类型的动画View Animation(视图动画)和Property Animator(属性动画);
其中
View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画);
Property Animator包括ValueAnimator和ObjectAnimation;
大家都知道逐帧动画主要是用来实现动画的,而补间动画才能实现控件的渐入渐出、移动、旋转和缩放的;而Property Animator是在Android 3.0版本才引入的,之前是没有的。大家可能会觉得补间动画和逐帧动画已经很全了,为什么还要引入Property Animator呢?
1.Property Animator能实现补间动画无法实现的功能(将一个控件的背景色在一分钟内从红色变为绿色)
2.补间动画虽能对控件做动画,但并没有改变控件内部的属性值。而Property Animator则是恰恰相反,Property Animator是通过改变控件内部的属性值来达到动画效果的
这篇文章我们主要讲讲ValueAnimator是如何使用的。
二.使用
ValueAnimator从名字可以看出,这个Animation是针对值的!ValueAnimator不会对控件做任何操作,我们可以给它设定从哪个值运动到哪个值,通过监听这些值的渐变过程来自己操作控件。
1.初步使用ValueAnimator
第一步:创建实例
ValueAnimator animator = ValueAnimator.ofInt(0,400);
animator.setDuration(1000);
在这里我们利用ValueAnimator.ofInt创建了一个值从0到400的动画,动画时长是1s,然后让动画开始。从这段代码中可以看出,ValueAnimator没有跟任何的控件相关联,那也正好说明ValueAnimator只是对值做动画运算,而不是针对控件的,我们需要监听ValueAnimator的动画过程来自己对控件做操作。
第二步:添加监听
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (int) valueAnimator.getAnimatedValue();
System.out.println("==========value: "+value);
}
});
animator.start();
上面我们使用addUpdateListener添加了一个监听,在onAnimationUpdate方法中我们可以通过当前的valueAnimator对象拿到当前的值。
这就是ValueAnimator的功能:ValueAnimator对指定值区间做动画运算,我们通过对运算过程做监听来自己操作控件。
总而言之就是两点:
ValueAnimator只负责对指定的数字区间进行动画运算
我们需要对运算过程进行监听,然后自己对控件做动画操作
2.实例
下面我们用valueAnimator做一个动画
public class MainActivity extends Activity {
private TextView textView;
private ValueAnimator animator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textview);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
}
});
animator = ValueAnimator.ofInt(0,400);
animator.setDuration(1000);
}
public void start(View view){
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (int) valueAnimator.getAnimatedValue();
textView.layout(value,value,value+textView.getWidth(),value+textView.getHeight());
}
});
animator.start();
}
}
在监听过程中,我们通过layout来改变文字的文职,layout方法是用来真实改变组件的位置的,所以我们能看到当文字移动到结束位置时,还是可以点击的,layout中的四个参数分别是按照屏幕坐标来计算的,所以我们的文本从(0,0)移动到(400,400)。