Android开发 - 图形化生成的贝塞尔插值器
2024-10-08 11:17:45
基于三次方贝塞尔曲线的插值器
在动画开发过程中,经常需要使用到插值器来满足我们的动画设计需求。然而,官方提供的插值器并不能满足所有的需求,所以我们需要自定义插值器。
下面介绍的三次方贝塞尔曲线的插值器,主要可用于实现连续曲线的动画。
关于贝塞尔曲线的介绍,请移步百度。
绘制满足设计的动画曲线
1.先使用贝塞尔曲线数值生成工具来获取想要的曲线数值
工具网站:cubic-bezier.com
使用教程:
- 拉拽左边图像的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;
}
}
最新文章
- C#/ASP.NET完善的DBHelper,配套Model生成器
- bzoj2141排队(辣鸡但是好写的方法)
- jquery插件-表单验证插件
- toad 常用快捷键与配置
- HDU 1078 FatMouse and Cheese(记忆化搜索)
- 用python做自己主动化測试--对server端的自己主动化測试(3)-很多其它http client实例
- [SOJ] Ordering Tasks
- 《JAVA与模式》之简单工厂模式
- 201521123063 JAVA程序设计 第二周学习总结
- JVM 自动内存管理:对象判定和回收算法
- antlr v4 使用指南连载3——g4文件概览
- Parcelable encountered IOException writing serializable object
- wxPython 的简单框架实例
- ajax多级菜单栏
- 测试覆盖率工具:EclEmma
- 一个小栗子聊聊JAVA泛型基础
- 使用CodePush实时更新 React Native 和 Cordova 应用
- WinForm窗体下Excel的导入
- struts2框架之自定义拦截器和配置
- 信安实践——CSRF攻击与防御
热门文章
- vmware虚拟机 C硬盘空间 无损扩容 新测
- Java笔记16:多线程共享数据
- [HTML5] Add an SVG Image to a Webpage and Get a Reference to the Internal Elements in JavaScript
- Navicat for SQL Server创建连接提示错误08001怎么办
- gensim自然语言处理(续)
- 本地化,将cancel替换成";取消";
- LoadRunner测试ajaxweb程序攻略
- vue 仿QQ 开发流程
- TI BSL in python
- Android Exception 13(Can&#39;t create handler inside thread that has not called Looper.prepare())