持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
前面我们已经介绍了属性动画的2种动画分类,ValueAnimator和ObjectAnimator,都说属性动画比帧动画和补间动画更高级,那么它高级在哪里呢,有什么优势和特点呢,那么下面我们就来介绍ValueAnimator的使用以及一些简单的动画效果。
ValueAnimator的定义及属性
ValueAnimator前面已经介绍了,它是通过改变对象的属性值进而实现动画效果的,举个栗子:比如我们想实现一个平移动画,让一个view从0位移到50,那么对于帧动画或者补间动画来说,就是设置开始和起始的view位置,通过视觉效果来表现这种动画效果,那么属性动画是怎么实现的呢,对于ValueAnimator来说,我们可以设置这个动画的表现时间,比如是2秒,那么ValueAnimator会根据这个2秒的时间,生成一个0-2的时间颗粒,根据这个颗粒,把位移的动画表现出来,同时,可以设置插值器(后面会说到),我们可以进一步的控制这个平移动画的表现形式,比如是线性的或者是指数级的,它可以表现出不同的形式。
public class MainActivity extends Activity {
private ValueAnimator valueAnimator;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//ImageView对象
iv_anim = (ImageView) findViewById(R.id.image_anim);
valueAnimator = ValueAnimator.ofInt(0,50);
}
private void translation(){
valueAnimator = ValueAnimator.ofInt(0, 100);
valueAnimator.setDuration(2000);
//设置属性插值器,这里用的是默认的线性
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
valueAnimator.setRepeatCount(0);
valueAnimator.setStartDelay(0);
valueAnimator.setEvaluator(new IntEvaluator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.i(TAG, animation.getAnimatedValue() + "");
/* 通过这样一个监听事件,我们就可以获取
* 到ValueAnimator每一步所产生的值
* 通过调用getAnimatedValue()获取到每个时间因子所产生的Value。
* */
int x = (int) animation.getAnimatedValue();
iv_anim.setTranslationX(x);
}
});
valueAnimator.start();
}
}
这里列举的是平移动画,当然它还有类似帧动画和补间动画的其他动画效果
1)translationX\translationY 水平和垂直方向偏移;
2)rotation、rotationX\rotationY:rotation指3D翻转,rotationX\rotationY指水平和竖直方向的一个旋转动画;
3)scaleX\scaleY:X轴方向和Y轴方向缩放的一个动画;
4)alpha 透明度动画
这里还用到了一个监听AnimatorUpdateListener,它是简单属性动画在一定时间内的所产生的值,然后回调回来,这样就可以根据这个区间的值实现不同的动画效果,另外这里提到了插值器,其实在帧动画和补间动画也有类似的属性,没有太多提及到,因为实际过程用的不是特别多,但是在属性动画中,可以很好的把这个属性值表现处理,它可以更加突出的表现动画的效果,几种常用的插值器有以下几类:
1、AccelerateInterpolator:动画从开始到结束,变化率是一个加速的过程。
2、DecelerateInterpolator:动画从开始到结束,变化率是一个减速的过程。
3、CycleInterpolator:动画从开始到结束,变化率是循环给定次数的正弦曲线。
4、AccelerateDecelerateInterpolator:动画从开始到结束,变化率是先加速后减速的过程。
5、LinearInterpolator:动画从开始到结束,变化率是线性变化。
除了系统提供的几种插值器,我们也可以自定义插值器,需要继承BaseInterpolator抽象类,然后实现里面的抽象方法,这里不多赘述,大家可以根据业务需求自己实现。