Android 属性动画ValueAnimator与插值器详解
android 属性动画valueanimator与插值器详解
一、valueanimator详解:
valueanimator是整个动画的核心,objectanimator即是继承自valueanimator来实现。
valueanimator更像是一个数值发生器,用来产生具有一定规律的数字,从而让调动者来控制动画的实现过程。
1、valueanimator的使用:
valueanimator valueanimator = valueanimator.offloat(0, 100); valueanimator.setduration(1000).start(); //可以设置插值器来设置动画的类型,比如是“加速”,"减速",还是"先加速后减速"等,下面为使用系统的减速插值器 //参考网址:http://blog.sina.com.cn/s/blog_6e519585010157zt.html valueanimator.setinterpolator(new decelerateinterpolator()); final int basewidth = animatorbt.getwidth(); //valueanimator会在1000毫秒内产生0到100的数值,而我们可以在回调中通过animation.getanimatedvalue()得到此数值,然后进行自定义动画设置 valueanimator.addupdatelistener(new valueanimator.animatorupdatelistener() { @override public void onanimationupdate(valueanimator animation) { float value = (float) animation.getanimatedvalue(); logutils.showlog("value为"+value); //使用这个value //1.改变距离 animatorbt.settranslationx(value * 5); //2.改变透明度 animatorbt.setalpha(1 - (value) / 200); //3.增加button的宽度,这个是在objectanimator中无法直接设置的 viewgroup.layoutparams params = animatorbt.getlayoutparams(); params.width = (int) (basewidth + value); logutils.showlog("宽度为"+params.width); //当这个view的布局属性改变了之后要调用这个方法 animatorbt.requestlayout(); } }); } }, 1000);
2、停止valueanimator动画:
可以调用valueanimator对象的cancel()方法或者end()方法。 首先调用上述两种方法都会停止动画,不过区别就在于
1、调用cancel()后,valueanimator会立即停止,不会再回调了。
2、调用end()后,valueanimator会直接回调此动画结束状态的那个值,即,如果调用了end(),动画会直接停止到最后。
二、android插值器interpolator的使用:
插值器可以实现动画实现衰减效果,比如"逐渐减小",“逐渐增大”,“先加速后减速”
下面是几种常用的插值器:
1、accelerateinterpolator:动画从开始到结束,变化率是一个加速的过程。
2、decelerateinterpolator:动画从开始到结束,变化率是一个减速的过程。
3、cycleinterpolator:动画从开始到结束,变化率是循环给定次数的正弦曲线。
4、acceleratedecelerateinterpolator:动画从开始到结束,变化率是先加速后减速的过程。
5、linearinterpolator:动画从开始到结束,变化率是线性变化。
1、使用方法为:
//设置一个减速的插值器 valueanimator.setinterpolator(new decelerateinterpolator());
valueanimator的原理可以去看看其源码:
void animatevalue(float fraction) { //fraction即为线性的从0-1.0的大小,即假如从200-500,200ms完成,在200ms内,fraction是从0-1.0f来变化更新的,跟具体的要变化的数字没有关系,也可以理解为,fraction为坐标轴上的x值 //下面即为将x值传给自己的插值器 fraction = minterpolator.getinterpolation(fraction); mcurrentfraction = fraction; int numvalues = mvalues.length; for (int i = 0; i < numvalues; ++i) { mvalues[i].calculatevalue(fraction); } //此为将最后的数据回调回去 if (mupdatelisteners != null) { int numlisteners = mupdatelisteners.size(); for (int i = 0; i < numlisteners; ++i) { mupdatelisteners.get(i).onanimationupdate(this); } } }
2、自定义插值器:
//所以,要使用自定义的插值器的话,需要继承baseinterpolator抽象类,然后实现里面的抽象方法: float getinterpolation(float input );//input是传入的从0-1.0f的x值,而我们就是返回0-1.0f的y值。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!