我在 Android 中有一个 OpenGL ES 视图,它由一个用于翻译的矩阵控制。我试图找出一种方法来获得在谷歌地图应用程序或 iPhone 中看到的动量滚动提示。谢谢。
问问题
5375 次
2 回答
11
如果你的问题是二维的,那很简单
- 您需要获取每一帧的经过时间
你的 onTouch 函数会找到你手指的加速度。我忘记了如何从远处获得加速度的公式。它应该是具有时间变量的位置的二阶导数。但是您应该始终将您的 deltaX、deltaY 转换为加速度。为方便起见,您实际上并不需要在此处放置准确的内容。编辑:我不知道为什么我没有看到它,但功能都在那里......
加速度.x = 2(newposition.x - position.x - speed.x * elapsedTime) / (elapsedTime * elapsedTime);
获得加速度后,您可以使用该代码设置新位置。这是二维中的简单物理动力学。用你的加速度你可以找到你的速度,用你的速度你可以找到你的下一个位置。
speed.x = (float) (mass * acceleration.x * elapsed + speed.x); speed.y = (float) (mass * acceleration.y * elapsed + speed.y); position.x += mass * acceleration.x / 2 * elapsed * elapsed + speed.x * elapsed; position.y += mass * acceleration.y / 2 * elapsed * elapsed + speed.y * elapsed; speed.x *= friction; speed.y *= friction;
质量和摩擦力将让您定义它的速度以及它自身减速的速度。您可能必须调整代码,因为如果您必须向后滚动以减慢速度,这种动态效果并不好。
在每一帧结束时,您必须将加速度重置为 (0,0)。甚至在触摸后的每个新帧上,加速度都应该设置为某个值。它应该工作得很好:)
于 2011-01-06T16:34:56.610 回答
1
- 测量视图滚动的速度。
- 检测用户何时停止滚动。
- 逐渐降低滚动视图的滚动速度。
像这样的东西:
public void redraw() {
myScrollView.ySpeed = myScrollView.lastY-myScrollView.y;
myScrollView.xSpeed = myScrollView.lastX-myScrollView.x;
if (!userIsScrolling && ySpeed > 0) {
ySpeed--;
}
if (!userIsScrolling && xSpeed > 0) {
xSpeed--;
}
myScrollView.lastY = myScrollView.y;
myScrollView.y += ySpeed;
myScrollView.lastX = myScrollView.x;
myScrollView.x += xSpeed;
}
public void userStoppedScrolling() {
userIsScrolling = false;
}
于 2010-12-28T19:51:33.277 回答