android 插值器工具,Android自定义动画插值器Interpolator

本文介绍了如何通过自定义Interpolator来实现Android动画的特殊效果,特别是利用三次方贝塞尔曲线来创建平滑的动画过渡。首先,你可以使用在线工具cubic-bezier.com来设计和获取曲线参数,然后在代码中创建EaseCubicInterpolator类,并传入这些参数,以实现定制的动画行为。这种方法允许开发者创造出更加丰富和个性化的动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Interpolator:定义动画的效果,如加速,减速,回弹,先加速后减速等

现在Android自带的Interpolator有以下几种

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

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

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

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

BounceInterpolator 动画结束的时候弹起

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

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

LinearInterpolator 以常量速率改变

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

但以上效果可能还是无法满足设计师挑剔的要求,那就需要我们自己来定义动画的Interpolator了

基于三次方贝塞尔曲线的插值器

1.先使用贝塞尔曲线数值生成工具来获取想要的曲线数值

工具网站: cubic-bezier.com

使用教程:

拉拽左边图像的2个点,调整出符合效果的图形

点击右上角的Save按钮,将4个参数运用到下面的代码中。

639efa7762a1

如上图调节左方曲线,点击Go按键,可看到红色与蓝色的方块运动状态,调节自己想要的效果

2.代码运用

interpolator = new EaseCubicInterpolator(0.31f, 0.85f,0.77f, 0.14f);

animation.setInterpolator(interpolator)

如上直接调用下面的差值器类,构造方法中的4个参数,即是从第一步的网站获得的数值。

import android.graphics.PointF;

import android.view.animation.Interpolator;

/**

* 缓动三次方曲线插值器.(基于三次方贝塞尔曲线)

*/

public class EaseCubicInterpolator implements Interpolator {

private final static int ACCURACY = 4096;

private int mLastI = 0;

private final PointF mControlPoint1 = new PointF();

private final PointF mControlPoint2 = new PointF();

/**

* 设置中间两个控制点

*

* 在线工具: http://cubic-bezier.com

*

* @param x1

* @param y1

* @param x2

* @param y2

*/

public EaseCubicInterpolator(float x1, float y1, float x2, float y2) {

mControlPoint1.x = x1;

mControlPoint1.y = y1;

mControlPoint2.x = x2;

mControlPoint2.y = y2;

}

@Override

public float getInterpolation(float input) {

float t = input;

// 近似求解t的值[0,1]

for (int i = mLastI; i < ACCURACY; i++) {

t = 1.0f * i / ACCURACY;

double x = cubicCurves(t, 0, mControlPoint1.x, mControlPoint2.x, 1);

if (x >= input) {

mLastI = i;

break;

}

}

double value = cubicCurves(t, 0, mControlPoint1.y, mControlPoint2.y, 1);

if (value > 0.999d) {

value = 1;

mLastI = 0;

}

return (float) value;

}

/**

* 求三次贝塞尔曲线(四个控制点)一个点某个维度的值.

*

* 参考资料: http://devmag.org.za/2011/04/05/bzier-curves-a-tutorial/

*

* @param t 取值[0, 1]

* @param value0

* @param value1

* @param value2

* @param value3

* @return

*/

public static double cubicCurves(double t, double value0, double value1,

double value2, double value3) {

double value;

double u = 1 - t;

double tt = t * t;

double uu = u * u;

double uuu = uu * u;

double ttt = tt * t;

value = uuu * value0;

value += 3 * uu * t * value1;

value += 3 * u * tt * value2;

value += ttt * value3;

return value;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值