声明:下载源码,根据我的步骤一步一步来。
依据继承关系,我们先介绍ValueAnimator。
看简单的代码,在从上一点一点加代码。
ValueAnimator value1 = ValueAnimator.ofFloat(0, 195, 0); //设置变化范围
value1.setDuration(3000); //设置动画时间
value1.start(); // 开启动画
value1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { //从时间轴上获得变化值
@Override
public void onAnimationUpdate(ValueAnimator animation) {
imageView.setRotationX((Float) animation.getAnimatedValue()); //设置图片的透明度,需api11以上
}
});
ofFloat(float... values),可传多个参数,动画的更新值从第一个参数值变化到第二个参数值,第二个变化到第三个,以此类推。
你只需在onAnimationUpdate()方法中设置某个对象的属性,animation.getAnimatedValue()得到的是时间轴上变化范围中的值。对于android中的控件和自定义view,你的设置属性方法中要调用重绘方法,或者在onAnimationUpdate()方法中手动调用view的postInvalidate()方法使其重绘。
该代码是简单的x轴旋转动画。
接下来加变化率,也就是设置Interpolator,看代码:
ValueAnimator value1 = ValueAnimator.ofFloat(0, 180); //设置变化范围
value1.setDuration(15000); //设置动画时间
value1.setInterpolator(new OvershootInterpolator()); //设置变化速率
value1.start(); // 开启动画
value1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { //从时间轴上获得变化值
@Override
public void onAnimationUpdate(ValueAnimator animation) {
imageView.setRotationX((Float) animation.getAnimatedValue()); //设置图片的透明度,需api11以上
}
});
value1.setInterpolator(new OvershootInterpolator());也就是多了这一句。 OvershootInterpolator 向前甩一定值后再回到原来位置。效果如下:
关于Interpolator的一些知识:
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
3.设置求值规则
调用setEvaluator()方法,里面可传FloatEvaluator,IntEvaluator等,或者自定义TypeEvaluator,看代码:
value1.setEvaluator(new TypeEvaluator() { //求值器
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) { //求值方法,依据自定义的求值规则来返回值
Log.e("fraction+startValue+endValue",fraction+"=="+startValue+"=="+endValue);
return 1;
}
});
第一个参数是在动画执行的时间点上依据变化率得到的分数,以这个分数来生成一个值,返回的这个值可以被AnimatorUpdateListener监听到,这也就有了我们监听器里面依据更新值来做一些操作。上面的返回个固定的值1,所以没有动画过程。
4.自定义TypeEvaluator,ValueAnimator.ofObject用法
ValueAnimator value1 = new ValueAnimator(); //设置变化范围
value1.setObjectValues(new PointF(0,0));
value1.setDuration(3000); //设置动画时间
value1.setEvaluator(new TypeEvaluator() { //求值器
@Override
public PointF evaluate(float fraction, Object startValue, Object endValue) { //求值方法,依据自定义的求值规则来返回值
Log.e("fraction+startValue+endValue",fraction+"=="+startValue+"=="+endValue);
float x = 0 + fraction*(150 - 0);
float y = 0 + fraction*(300 - 0);
return new PointF(x,y);
}
});
value1.setInterpolator(new OvershootInterpolator()); //设置变化速率
value1.start(); // 开启动画
value1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { //从时间轴上获得变化值
@Override
public void onAnimationUpdate(ValueAnimator animation) {
PointF pf = (PointF) animation.getAnimatedValue(); //得到求值器中返回的值
imageView.setTranslationX(pf.x);
imageView.setTranslationY(pf.y);
}
});
效果:
你可以setObjectValues(多个值),在evaluate(float fraction, Object startValue, Object endValue)就可以得到startValue和endValue,看代码:
ValueAnimator value1 = new ValueAnimator(); //设置变化范围
value1.setObjectValues(new PointF(0,0),new PointF(150,300));
value1.setDuration(3000); //设置动画时间
value1.setEvaluator(new TypeEvaluator<PointF>() { //求值器
@Override
public PointF evaluate(float fraction, PointF startValue, PointF endValue) { //求值方法,依据自定义的求值规则来返回值
Log.e("fraction+startValue+endValue",fraction+"=="+startValue+"=="+endValue);
float x = startValue.x + fraction*(endValue.x - startValue.x);
float y = startValue.y + fraction*(endValue.y - startValue.y);
return new PointF(x,y);
}
});
效果跟上面一样,对于对象都这么使用。
对于ValueAnimator其他的一些用法:
源码http://yunpan.cn/cwebQmG9jhNPh (提取码:9408)