Interpolator 是被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等。
      Interpolator中文意思是插补器(百度翻译),而用在Android动画中,可以理解为是用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化。

插补器分为:

AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速

AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速

AnticipateInterpolator 开始的时候向后然后向前甩

AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值

BounceInterpolator 动画结束的时候弹起

CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线

DecelerateInterpolator 在动画开始的地方快然后慢

LinearInterpolator 以常量速率改变

OvershootInterpolator 向前甩一定值后再回到原来位置

我们如果要实现一个动画效果,可以继承Animation,然后在applyTransformation(float interpolatedTime, Transformation t)这个方法内去实现具体效果,而这个方法的第一个参数interpolatedTime就是动画时间,Interpolator的作用就是改变这个时间。

我们可以从源码看出,当一个动画调用了setInterpolator(Interpolator i),设置了插补器后,它是在什么时候启作用的呢?查看Animation.java这个动画父类,getTransformation(long currentTime, Transformation outTransformation),

public boolean getTransformation(long currentTime, Transformation outTransformation) {if (mStartTime == -1) {mStartTime = currentTime;}final long startOffset = getStartOffset();final long duration = mDuration;float normalizedTime;if (duration != 0) {normalizedTime = ((float) (currentTime - (mStartTime + startOffset))) /(float) duration;} else {// time is a step-change with a zero durationnormalizedTime = currentTime < mStartTime ? 0.0f : 1.0f;}final boolean expired = normalizedTime >= 1.0f;mMore = !expired;if (!mFillEnabled) normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f);if ((normalizedTime >= 0.0f || mFillBefore) && (normalizedTime <= 1.0f || mFillAfter)) {if (!mStarted) {fireAnimationStart();mStarted = true;if (USE_CLOSEGUARD) {guard.open("cancel or detach or getTransformation");}}if (mFillEnabled) normalizedTime = Math.max(Math.min(normalizedTime, 1.0f), 0.0f);if (mCycleFlip) {normalizedTime = 1.0f - normalizedTime;}final float interpolatedTime = mInterpolator.getInterpolation(normalizedTime);applyTransformation(interpolatedTime, outTransformation);}if (expired) {if (mRepeatCount == mRepeated) {if (!mEnded) {mEnded = true;guard.close();fireAnimationEnd();}} else {if (mRepeatCount > 0) {mRepeated++;}if (mRepeatMode == REVERSE) {mCycleFlip = !mCycleFlip;}mStartTime = -1;mMore = true;fireAnimationRepeat();}}if (!mMore && mOneMoreTime) {mOneMoreTime = false;return true;}return mMore;}

看37、38行那两句,mInterpolator变量就是我们前面调用 setInterpolator设置的插补器对象,然后将mInterpolator.getInterpolation()的返回值当作第一个参数去执行applyTransformation,所以我们可以看出Interpolator对动画变化效果起到辅助作用的。我们就用平移动画效果来讲Interpolator是怎么起辅助作用的。

看下TranslateAnimation的applyTransformation方法

protected void applyTransformation(float interpolatedTime, Transformation t) {float dx = mFromXDelta;float dy = mFromYDelta;if (mFromXDelta != mToXDelta) {dx = mFromXDelta + ((mToXDelta - mFromXDelta) * interpolatedTime);}if (mFromYDelta != mToYDelta) {dy = mFromYDelta + ((mToYDelta - mFromYDelta) * interpolatedTime);}t.getMatrix().setTranslate(dx, dy);}

平移的(dx,dy)是根据参数interpolatedTime变化的,比如,我们给平移动画设置加速插补器AccelerateInterpolator

,这个插补器的变化是怎样的呢?

public float getInterpolation(float input) {if (mFactor == 1.0f) {return input * input;} else {return (float)Math.pow(input, mDoubleFactor);}}

默认的话即mFactor=1.0f,它是一个y=x^2 (0<x<1)的变化曲线,如果你希望这个加速度更快点的话,可以使用这个构造函数

 public AccelerateInterpolator(float factor) {mFactor = factor;mDoubleFactor = 2 * mFactor;}

这时它的变化曲线为y=x^(2*mFactor)(0<x<1),我们都知道这个函数是一个幂函数,是一个递增函数,变化速度越来越快,所以当平移动画设置了该加速插补器,它平移的速度是递增的。其他插补器这里就不多说了,请戳 其他Interpolator说明

接下来我们看下效果

public class InterpolatorAnimationActivity extends Activity implementsAdapterView.OnItemSelectedListener {private static final String[] INTERPOLATORS = { "Accelerate", "Decelerate","Accelerate/Decelerate", "Anticipate", "Overshoot","Anticipate/Overshoot", "Bounce", "LinearInterpolator","CycleInterpolator" };@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_interpolator_animation);Spinner s = (Spinner) findViewById(R.id.spinner);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, INTERPOLATORS);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);s.setAdapter(adapter);s.setOnItemSelectedListener(this);}public void onItemSelected(AdapterView<?> parent, View v, int position,long id) {final View target = findViewById(R.id.target);final View targetParent = (View) target.getParent();Animation a = new TranslateAnimation(// 平移动画0.0f, targetParent.getWidth() - target.getWidth()- targetParent.getPaddingLeft()- targetParent.getPaddingRight(), 0.0f, 0.0f);a.setDuration(1000);a.setStartOffset(300);a.setRepeatMode(Animation.RESTART);a.setRepeatCount(Animation.INFINITE);switch (position) {case 0:// 加速插值器 速度变化公式y=x^2(默认)a.setInterpolator(AnimationUtils.loadInterpolator(this,android.R.anim.accelerate_interpolator));break;case 1:// 减速插值器a.setInterpolator(AnimationUtils.loadInterpolator(this,android.R.anim.decelerate_interpolator));break;case 2:// 加速减速插值器a.setInterpolator(AnimationUtils.loadInterpolator(this,android.R.anim.accelerate_decelerate_interpolator));break;case 3:a.setInterpolator(AnimationUtils.loadInterpolator(this,android.R.anim.anticipate_interpolator));break;case 4:a.setInterpolator(AnimationUtils.loadInterpolator(this,android.R.anim.overshoot_interpolator));break;case 5:a.setInterpolator(AnimationUtils.loadInterpolator(this,android.R.anim.anticipate_overshoot_interpolator));break;case 6:a.setInterpolator(AnimationUtils.loadInterpolator(this,android.R.anim.bounce_interpolator));break;case 7:a.setInterpolator(AnimationUtils.loadInterpolator(this,android.R.anim.linear_interpolator));break;case 8:a.setInterpolator(AnimationUtils.loadInterpolator(this,android.R.anim.cycle_interpolator));break;}target.startAnimation(a);}public void onNothingSelected(AdapterView<?> parent) {}
}

activity_interpolator_animation.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:padding="10dip"android:layout_width="match_parent"android:layout_height="wrap_content"android:clipToPadding="false"><TextViewandroid:id="@+id/target"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="26sp"android:text="Interpolators"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dip"android:layout_marginBottom="5dip"android:text="Select an animation" /><Spinnerandroid:id="@+id/spinner"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

APIDemo动画之Interpolator相关推荐

  1. Andriod anim 补间(Tween)动画与Interpolator以及setCustomAnimations方法

    补间(Tween)动画 Android 使用Animation代抽象的动画类,它包括如下几个子类. AlphaAnimation:透明度改变的动画.创建该动画时要指定动画开始时的透明度.结束时的透明度 ...

  2. Android动画中Interpolator 详解和演示

    遇到一个项目需求,想让动画变得更活泼一点,于是想到了动画属性中的Interpolator,写了基本例子测试一下Android提供给我们现成的加速器的效果: 效果 代码中方法 xml中属性 越来越快 A ...

  3. Android动画之Interpolator(插值器)

    原文: https://blog.csdn.net/pzm1993/article/details/77926373 使用参考:https://github.com/MasayukiSuda/Easi ...

  4. Android动画中Interpolator 加速器的使用

    遇到一个项目需求,想让动画变得更活泼一点,于是想到了动画属性中的Interpolator,写了基本例子测试一下android提供给我们现成的加速器的效果: 效果 代码中方法 xml中属性 越来越快 A ...

  5. Android动画学习笔记(二)——动画插值器Interpolator

    前言:上篇博客我们对补间动画的xml及代码生成做了简单的介绍,今天我们来讲讲动画的一个核心类Interpolator插值器,对于数学好的童鞋来说,学习本节内容就soeasy了!(ps:本人数学很差,都 ...

  6. android自定义动画插值器(Interpolator)

    前言 之前已经讲过动画相关的内容,没有接触过的读者可以看下笔者之前对android动画使用的整理. Android动画总结 (valueAnimator.objectAnimator.Animator ...

  7. android常用窗口动画,android 自定义dialog,窗口动画,

    自定义dialog窗口,根据坐标可随意设置dialog显示位置,实现了窗口弹出动画 Java代码: package com.sunxu.org.IndividualityDialog; import ...

  8. Android动画渲染过程及原理(matrix),matrix动画,动画优化

    -- 矩阵(Matrix), Matrix动画 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵.在物理学中,矩阵于电路学.力学.光学和量子物理中都 ...

  9. Android使用XML做动画UI

    在Android应用程序,使用动画效果,能带给用户更好的感觉.做动画可以通过XML或Android代码. 本教程中,介绍使用XML来做动画.在这里,介绍基本的动画,如淡入,淡出,旋转等. 效果: ht ...

最新文章

  1. MIT最新报告:完全无人驾驶仍需10年,马斯克:特斯拉已经实现
  2. window环境apache服务器在本地添加域名
  3. webrtc 语音流java_通过WebView WebRTC从麦克风传输语音时的语音识别
  4. android ota更新app,企业 OTA 更新  |  Android 开源项目  |  Android Open Source Project
  5. Redis面试 - 如何保证缓存与数据库的双写一致性?
  6. http://syy7.com/a/33.php,CVE-2020-7062
  7. LeetCode--35. 搜索插入位置(遍历,二分法)
  8. 当TIME_WAIT状态的TCP正常挥手,收到SYN后…
  9. Centos7安装JDK8以及环境配置
  10. python入门必备10个坑_python中的基础坑
  11. Nodejs中Mongodb的基本使用
  12. hdu5033 Building 单调队列
  13. python语法学习第十一天--模块
  14. 电脑锁屏按什么键解锁_锁屏键除了锁屏还能干什么?这 6 个 App 带你玩转手机实体键...
  15. 举例说明计算机在现实应用中的作用,【举例说明多媒体技术的应用】_论多媒体技术在日常工作生活中的应用...
  16. 贪心科技机器学习训练营(五)
  17. php盘古分词,百度分词技术_百度输入法分词怎么关_百度分词原理
  18. 北京市车管所及车管分所办公电话
  19. Delphi 和 TMS 控件在 ERP 软件开发领域的 20 年:访谈
  20. 2. UFS2.1 —— Descriptor描述符

热门文章

  1. 红客联盟是什么?红客需要传承!
  2. 如何做一个基于微信家政服务预约小程序系统毕业设计毕设作品
  3. 江西计算机信息科学,张光河 - 江西师范大学 - 计算机信息工程学院
  4. 牛人用计算机word 画画,还要啥设计师?牛人用Word做标志设计
  5. 那些著名网站的90年代
  6. sql plus 查看表结构,oracle dese 查看表结构
  7. k8s实战之手动部署PHP项目和Java项目
  8. 冯某某诉昆明尊园房地产经纪有限公司居间合同纠纷一审民事判决书
  9. Android修行手册-TextView不常用属性篇
  10. H3C 交换机设备维护技术之——异常检查项