抛物线java代码 抛物线快捷公式

android想要画一个抛物线,怎么实现效果图中 , 抛物线的动画即是由SurfaceView实现的 。底部栏中的文字翻转详情相关帖子:
[Android] 文字翻转动画的实现
需求:
1.实现抛物线动画
1.1 设计物理模型,能够根据时间变量计算出某个时刻图片的X/Y坐标 。
1.2 将图片高频率(相比于UI线程的缓慢而言)刷新到界面中 。这儿需要实现将脏界面清屏及刷新操作 。
2.文字翻转动画(已解决,见上面的帖子链接)
下面来逐一解决所提出的问题 。
-----------------------------------------------------------------------------
分隔线内容与Android无关,请慎读 , 勿拍砖 。谢啦
1.1 设计物理模型,如果大家还记得初中物理时,这并不难 。自己写的草稿图见下:
可以有:图片要从高度为H的位置下落,并且第一次与X轴碰撞时会出现能量损失 , 至原来的N% 。并且我们需要图片的最终落点离起始位置在X轴上的位移为L,默认存在重力加速度g 。
详细的物理分析见上图啦,下面只说代码中如何实现 , 相关代码在PhysicalTool.java 。
第一次下落过程所耗时t1与高度height会有如下关系:
[java] view plaincopy
t1 = Math.sqrt(2 * height * 1.0d / GRAVITY);
[java] view plain copy
t1 = Math.sqrt(2 * height * 1.0d / GRAVITY);
第一次与X轴碰撞后上升至最高点的耗时t2与高度 N%*height会有:
[java] view plaincopy
t2 = Math.sqrt((1 - WASTAGE) * 2 * height * 1.0d / GRAVITY);
[java] view plain copy
t2 = Math.sqrt((1 - WASTAGE) * 2 * height * 1.0d / GRAVITY);
那么总的动画时间为(t1 + t2 + t2) , 则水平位移速度有(width为X轴总位移):
[java] view plaincopy
velocity = width * 1.0d / (t1 + 2 * t2);
[java] view plain copy
velocity = width * 1.0d / (t1 + 2 * t2);
则根据时间计算图片的实时坐标有:
PhysicalTool.comput()
[java] view plaincopy
double used = (System.currentTimeMillis() - startTime) * 1.0d / 1000;
x = velocity * used;
if (0 = usedusedt1) {
y = height - 0.5d * GRAVITY * used * used;
} else if (t1 = usedused(t1 + t2)) {
double tmp = t1 + t2 - used;
y = (1 - WASTAGE) * height - 0.5d * GRAVITY * tmp * tmp;
} else if ((t1 + t2) = usedused(t1 + 2 * t2)) {
double tmp = used - t1 - t2;
y = (1 - WASTAGE) * height - 0.5d * GRAVITY * tmp * tmp;
}
[java] view plain copy
double used = (System.currentTimeMillis() - startTime) * 1.0d / 1000;
x = velocity * used;
if (0 = usedusedt1) {
y = height - 0.5d * GRAVITY * used * used;
} else if (t1 = usedused(t1 + t2)) {
double tmp = t1 + t2 - used;
y = (1 - WASTAGE) * height - 0.5d * GRAVITY * tmp * tmp;
} else if ((t1 + t2) = usedused(t1 + 2 * t2)) {
double tmp = used - t1 - t2;
y = (1 - WASTAGE) * height - 0.5d * GRAVITY * tmp * tmp;
}
Android无关内容结束了 。
----------------------------------------------------------------------------------------
1.2 SurfaceView刷新界面
SurfaceView是一个特殊的UI组件 , 特殊在于它能够使用非UI线程刷新界面 。至于为何具有此特殊性,将在另一个帖子"SurfaceView 相关知识笔记"中讨论,该帖子将讲述SurfaceView、Surface、ViewRoot、Window Manager/Window、Canvas等之间的关系 。
使用SurfaceView需要自定义组件继承该类,并实现SurfaceHolder.Callback , 该回调提供了三个方法:
[java] view plaincopy
surfaceCreated()//通知Surface已被创建,可以在此处启动动画线程
surfaceChanged()//通知Surface已改变
surfaceDestroyed()//通知Surface已被销毁,可以在此处终止动画线程

推荐阅读