相关概念:
动画的基本原理是从开始时间到结束时间一帧一帧地播放静态图像,如果我们用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线程中执行动画。