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

在动画开发过程中,经常需要使用到插值器来满足我们的动画设计需求。然而,官方提供的插值器并不能满足所有的需求,所以我们需要自定义插值器。

下面介绍的三次方贝塞尔曲线的插值器,主要可用于实现连续曲线的动画。

关于贝塞尔曲线的介绍,请移步百度

绘制满足设计的动画曲线

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

工具网站:cubic-bezier.com

使用教程:

  1. 拉拽左边图像的2个点,调整出符合效果的图形
  2. 点击右上角的Save按钮,将4个参数运用到下面的代码中。

2.代码运用


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

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


/** * 缓动三次方曲线插值器.(基于三次方贝塞尔曲线) */ 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(); /** * 设置中间两个控制点.<br> * 在线工具: http://cubic-bezier.com/<br> * * @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; } /** * 求三次贝塞尔曲线(四个控制点)一个点某个维度的值.<br> * 参考资料: <em> http://devmag.org.za/2011/04/05/bzier-curves-a-tutorial/ </em> * * @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; } }

最新文章

  1. C#/ASP.NET完善的DBHelper,配套Model生成器
  2. bzoj2141排队(辣鸡但是好写的方法)
  3. jquery插件-表单验证插件
  4. toad 常用快捷键与配置
  5. HDU 1078 FatMouse and Cheese(记忆化搜索)
  6. 用python做自己主动化測试--对server端的自己主动化測试(3)-很多其它http client实例
  7. [SOJ] Ordering Tasks
  8. 《JAVA与模式》之简单工厂模式
  9. 201521123063 JAVA程序设计 第二周学习总结
  10. JVM 自动内存管理:对象判定和回收算法
  11. antlr v4 使用指南连载3——g4文件概览
  12. Parcelable encountered IOException writing serializable object
  13. wxPython 的简单框架实例
  14. ajax多级菜单栏
  15. 测试覆盖率工具:EclEmma
  16. 一个小栗子聊聊JAVA泛型基础
  17. 使用CodePush实时更新 React Native 和 Cordova 应用
  18. WinForm窗体下Excel的导入
  19. struts2框架之自定义拦截器和配置
  20. 信安实践——CSRF攻击与防御

热门文章

  1. vmware虚拟机 C硬盘空间 无损扩容 新测
  2. Java笔记16:多线程共享数据
  3. [HTML5] Add an SVG Image to a Webpage and Get a Reference to the Internal Elements in JavaScript
  4. Navicat for SQL Server创建连接提示错误08001怎么办
  5. gensim自然语言处理(续)
  6. 本地化,将cancel替换成&quot;取消&quot;
  7. LoadRunner测试ajaxweb程序攻略
  8. vue 仿QQ 开发流程
  9. TI BSL in python
  10. Android Exception 13(Can&#39;t create handler inside thread that has not called Looper.prepare())