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

作者:lqh 时间:2023-04-12 19:05:33 

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

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

来源:http://blog.csdn.net/happyheng/article/details/51756043

标签:Android,ValueAnimator,插值器
0
投稿

猜你喜欢

  • Springboot使用@Valid 和AOP做参数校验及日志输出问题

    2023-12-05 04:39:12
  • 基于使用BeginInvoke,EndInvoke异步调用委托的实现代码

    2023-04-29 09:46:49
  • Springboot jar主清单属性丢失解决方案

    2022-04-06 05:30:26
  • Java使用excel工具类导出对象功能示例

    2022-07-04 23:06:50
  • 消息队列-kafka消费异常问题

    2023-02-02 07:08:05
  • 总结C#网络编程中对于Cookie的设定要点

    2021-12-28 20:16:43
  • java垃圾回收原理之GC算法基础

    2023-10-05 16:10:09
  • 浅试仿 mapstruct实现微服务编排框架详解

    2022-07-12 13:20:44
  • Android中用onSaveInstanceState保存Fragment状态的方法

    2022-05-16 00:39:44
  • java简易小游戏制作代码

    2023-11-23 19:49:38
  • java过滤器中Filter的ChainFilter过滤链

    2021-09-29 00:03:42
  • Java中实现双数组Trie树实例

    2023-03-19 15:12:38
  • Android自定义View实现星星评分效果

    2023-10-27 23:10:42
  • mybatisplus中EntityWrapper的常用方法

    2022-11-09 21:52:00
  • Android编程简单设置ListView分割线的方法

    2021-07-21 20:24:33
  • Android 中使用RadioGroup和Fragment实现底部导航栏的功能

    2022-07-17 16:11:04
  • java.lang.Runtime.exec() Payload知识点详解

    2023-11-30 09:56:10
  • Spring Security自定义登录原理及实现详解

    2022-11-20 21:57:39
  • java多线程编程学习(线程间通信)

    2023-04-02 05:25:34
  • Java中死锁与活锁的具体实现

    2023-10-29 01:48:02
  • asp之家 软件编程 m.aspxhome.com