Android 属性动画ValueAnimator与插值器详解

所属分类: 软件编程 / Android 阅读数: 49
收藏 0 赞 0 分享

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值。 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多