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

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

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

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

绘制满足设计的动画曲线

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

工具网站:cubic-bezier.com

使用教程:

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

2.代码运用


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

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


  1. /**
  2. * 缓动三次方曲线插值器.(基于三次方贝塞尔曲线)
  3. */
  4. public class EaseCubicInterpolator implements Interpolator {
  5. private final static int ACCURACY = 4096;
  6. private int mLastI = 0;
  7. private final PointF mControlPoint1 = new PointF();
  8. private final PointF mControlPoint2 = new PointF();
  9. /**
  10. * 设置中间两个控制点.<br>
  11. * 在线工具: http://cubic-bezier.com/<br>
  12. *
  13. * @param x1
  14. * @param y1
  15. * @param x2
  16. * @param y2
  17. */
  18. public EaseCubicInterpolator(float x1, float y1, float x2, float y2) {
  19. mControlPoint1.x = x1;
  20. mControlPoint1.y = y1;
  21. mControlPoint2.x = x2;
  22. mControlPoint2.y = y2;
  23. }
  24. @Override
  25. public float getInterpolation(float input) {
  26. float t = input;
  27. // 近似求解t的值[0,1]
  28. for (int i = mLastI; i < ACCURACY; i++) {
  29. t = 1.0f * i / ACCURACY;
  30. double x = cubicCurves(t, 0, mControlPoint1.x, mControlPoint2.x, 1);
  31. if (x >= input) {
  32. mLastI = i;
  33. break;
  34. }
  35. }
  36. double value = cubicCurves(t, 0, mControlPoint1.y, mControlPoint2.y, 1);
  37. if (value > 0.999d) {
  38. value = 1;
  39. mLastI = 0;
  40. }
  41. return (float) value;
  42. }
  43. /**
  44. * 求三次贝塞尔曲线(四个控制点)一个点某个维度的值.<br>
  45. * 参考资料: <em> http://devmag.org.za/2011/04/05/bzier-curves-a-tutorial/ </em>
  46. *
  47. * @param t
  48. * 取值[0, 1]
  49. * @param value0
  50. * @param value1
  51. * @param value2
  52. * @param value3
  53. * @return
  54. */
  55. public static double cubicCurves(double t, double value0, double value1,
  56. double value2, double value3) {
  57. double value;
  58. double u = 1 - t;
  59. double tt = t * t;
  60. double uu = u * u;
  61. double uuu = uu * u;
  62. double ttt = tt * t;
  63. value = uuu * value0;
  64. value += 3 * uu * t * value1;
  65. value += 3 * u * tt * value2;
  66. value += ttt * value3;
  67. return value;
  68. }
  69. }

Android开发 - 图形化生成的贝塞尔插值器的更多相关文章

  1. Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...

  2. Android开发之画图的实现

    Android开发之画图的实现    四天前上完安卓的第一节课,真的是一脸懵逼,尽管熊哥说和java是差不多的,然而这个包和那个包之间的那些转换都是些什么鬼呀!!!但是四天的学习和操作下来,我觉得安卓 ...

  3. (转) Android开发性能优化简介

    作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ...

  4. Android开发:程序目录结构详解

    HelloWorld程序的目录结构概述 我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹.gen文件夹.Android文件夹.assets.res文件夹. AndroidM ...

  5. [素材资源] Android开发性能优化简介(非常不错的)

    转自(http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost& ...

  6. Android开发中常见的设计模式

    对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...

  7. 用Android-X86和VirtualBox打造高性能Android开发环境

    不知道有多少Android开发着对Android虚拟机的那悲剧的性能有意见,反正我的看法是:那速度实在是太坑爹了! 为什么Android虚拟机比iOS和WP7的虚拟机要慢很多呢?原因如下: 1. An ...

  8. 【转】android开发中关于模拟器emulation的常见问题

    [转]android开发中关于模拟器emulation的常见问题 Trouble: 无法启动android模拟器,提示 XDM authorization key matches an existin ...

  9. Android开发技巧——高亮的用户操作指南

    Android开发技巧--高亮的用户操作指南 2015-12-15补记: 发现使用PopupWindow进行遮罩层的显示,在华为P7上会有问题.具体表现为:画出来的高亮部分会偏下.原因为:通过view ...

随机推荐

  1. 【转】Go maps in action

    原文: https://blog.golang.org/go-maps-in-action ------------------------------------------------------ ...

  2. 转:用十条命令在一分钟内检查Linux服务器性能

    转自:http://www.infoq.com/cn/news/2015/12/linux-performance?utm_campaign=rightbar_v2&utm_source=in ...

  3. Spring整合JMS——三种connectionFactory

    1.SingleConnectionFactory:对于建立JMS服务器链接的请求会一直返回同一个链接,并且会忽略Connection的close方法调用.(org.springframework.j ...

  4. tomcat在ubuntu中设置开机启动

    #!/bin/bash export JAVA_HOME=/usr/lib/jdk/jdk1.7.0_72 WEBROOT_PATH=/home/zhengze/workspace WEBSERVER ...

  5. Android Studio 项目中集成百度地图SDK报Native method not found: com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create:()I错误

    Android Studio 项目中集成百度地图SDK报以下错误: java.lang.UnsatisfiedLinkError: Native method not found: com.baidu ...

  6. java中的Annotation

    java中包含5个基本的Annotation: @Override @Deprecated @SuppressWarnings @SafeVarargs @FunctionalInterface …… ...

  7. Activity生命周期以及启动模式对生命周期的影响(二)

    前面一篇文章概述了Android四大组件之一的Activity生命周期方法的调用先后顺序,但对于非标准启动模式下Activity被多次调用时的一些生命周期方法并未详细阐述,现在针对该情况着重记录. 现 ...

  8. Android so文件生成

    http://blog.csdn.net/laczff21/article/details/7542236 http://blog.csdn.net/yhm2046/article/details/8 ...

  9. MYSQL AND OR的联用

    MYSQL中"AND"和"OR"都是条件控制符."AND"是求交集,而"OR"则是求并集,非常多情况下,须要联用它们两个 ...

  10. iOS 扫雷游戏

    代码地址如下:http://www.demodashi.com/demo/11254.html 1.项目结构图 Viewcontroller:扫雷逻辑代码 LevelModel:扫雷难度选择代码 2. ...