Android Interpolators详解

相关概念:
动画的基本原理是从开始时间到结束时间一帧一帧地播放静态图像,如果我们用0.0表示动画的开始时间点,用1.0表示动画的结束时间点,则动画时间轴上的每个点都可以转换成0.0到1.0之间的一个浮点数,本文中我们称为Time Index。比如,动画中间的时间点可以用0.5来表示。对于使用了LinearInterpolator(线性插值器)的平移动画来讲,在0.3这个时间点视图则刚好移动了整个动画的30%。

我们一般不会将Time Index直接带入到动画计算公式,这也是Interpolator的存在的意义。

创建Interpolator有两种方式

1:在xml文件中进行创建
res/anim/my_accelerate_interpolator.xml
<?xml version="1.0" encoding="utf-8"?>
<accelerateInterpolator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:factor="2" />
在代码中可以这样使用:
 <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@anim/my_accelerate_interpolator"
        android:fromXScale="0.0"
        android:toXScale="1.0"
        android:fromYScale="0.0"
        android:toYScale="1.0"
        android:duration="300" />
2、在代码中动态创建
private static final LinearInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator();

targetView.animate().translationX(toTranslationX).setInterpolator(LINEAR_INTERPOLATOR)
                        .translationY(toTranslationY)
                        .setDuration(MOVING_DURATION);

常用的Interpolators:

Accelerate Interpolator / 加速度插值器

类名: AccelerateInterpolator
资源ID: @android:anim/accelerate_interpolator
XML标记: accelerateInterpolator
公式: y=t^(2f)
构造函数: public AccelerateInterpolator(float factor)
参数:
名称: f
XML属性: android:factor
描述: 加速度参数. f越大,起始速度越慢,但是速度越来越快

Decelerate Interpolator / 减速插值器

类名: DecelerateInterpolator
资源ID: @android:anim/decelerate_interpolator
XML标记: decelerateInterpolator
公式: y=1-(1-t)^(2f)
构造函数: public DecelerateInterpolator(float factor)
参数:
名称: f
XML属性: android:factor
描述: 加速度参数. f越大,起始速度越快,但是速度越来越慢

Accelerate Decelerate Interpolator / 先加速后减速插值器

类名: AccelerateDecelerateInterpolator
资源ID: @android:anim/accelerate_decelerate_interpolator
XML标记: accelerateDecelerateInterpolator
公式: y=cos((t+1)π)/2+0.5
构造函数: public AccelerateDecelerateInterpolator()
参数: 无

Overshoot Interpolator

类名: OvershootInterpolator
资源ID: @android:anim/overshoot_interpolator
XML标记: overshootInterpolator
公式: y=(T+1)x(t1)^3+T×(t1)^2 +1
构造函数: public OvershootInterpolator (float tension)
参数:
名称: T
XML属性: android:tension
描述: 张力值,默认为2,T越大,结束时的偏移越大,而且速度越快

还有一些插值器诸如:
Anticipate Overshoot Interpolator
Bounce Interpolator / 弹跳插值器
Cycle Interpolator / 周期插值器

自定义插值器:
需要实现Interpolator接口,然后实现其中的float getInterpolation(float t)接口即可,代码示例如下:

public class myInterpolator implements Interpolator {
    public myInterpolator() {}
    public float getInterpolation(float t) {
      float x=2.0f*t-1.0f;
      return 0.5f*(x*x*x + 1.0f);
    }
}

Interpolators配合AnimationSet:

ObjectAnimator mSolidViewTranX = ObjectAnimator.ofFloat(mSolidView, "translationX", mSolidView.getTranslationX(), 0f);
        ObjectAnimator mSolidViewTranY = ObjectAnimator.ofFloat(mSolidView, "translationY", mSolidView.getTranslationY(), 0f);
        ObjectAnimator mTransViewTranX = ObjectAnimator.ofFloat(mTransView, "translationX", mTransView.getTranslationX(), 0f);
        ObjectAnimator mTransViewTranY = ObjectAnimator.ofFloat(mTransView, "translationY", mTransView.getTranslationY(), 0f);
    ObjectAnimator mSolidViewScaleX = ObjectAnimator.ofFloat(mSolidView, "scaleX", mSolidView.getScaleX(), 1f);
    ObjectAnimator mSolidViewScaleY = ObjectAnimator.ofFloat(mSolidView, "scaleY", mSolidView.getScaleY(), 1f);
    ObjectAnimator mTransViewScaleX = ObjectAnimator.ofFloat(mTransView, "scaleX", mTransView.getScaleX(), 1f);
    ObjectAnimator mTransViewScaleY = ObjectAnimator.ofFloat(mTransView, "scaleY", mTransView.getScaleY(), 1f); 

    //添加四种Animator
    mTransAnimatorSet.playTogether(mSolidViewTranX, mSolidViewTranY, mTransViewTranX, mTransViewTranY, mSolidViewScaleX, mSolidViewScaleY,mTransViewScaleX, mTransViewScaleY, mAlphaIn, mAlphaOut);
    mTransAnimatorSet.setDuration(duration);
    mTransAnimatorSet.addListener(new   AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                mSolidView.setVisibility(INVISIBLE);
            }
        });

        //为AnimatorSet设置插值器                    mTransAnimatorSet.setInterpolator(OVERSHOOT_INTERPOLATOR);
    mTransAnimatorSet.start();

小Tips:
1、使用ViewCompat解决动画兼容性问题,ViewCompat是v4包中专门用于解决动画兼容性的类。

这个类中的方法大多需要获取targetView作为参数
这个类中有很多很有用的方法,例如
dispatchNestedFling()用于分发Fling事件
getScrollIndicators()用于获取相关view的Indicators
postOnAnimation(View view, Runnable action)用于在ui线程中执行动画。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值