【发布时间】:2010-12-28 19:25:01
【问题描述】:
我在 Android 中有一个 OpenGL ES 视图,它由一个用于翻译的矩阵控制。我试图找出一种方法来获得在谷歌地图应用程序或 iPhone 中看到的动量滚动提示。谢谢。
【问题讨论】:
标签: iphone android opengl-es matrix-multiplication
我在 Android 中有一个 OpenGL ES 视图,它由一个用于翻译的矩阵控制。我试图找出一种方法来获得在谷歌地图应用程序或 iPhone 中看到的动量滚动提示。谢谢。
【问题讨论】:
标签: iphone android opengl-es matrix-multiplication
如果你的问题是二维的,那很简单
您的 onTouch 函数会找到您手指的加速度。我忘记了如何从远处获得加速度的公式。它应该是具有时间变量的位置的二阶导数。但是您应该始终将您的 deltaX、deltaY 转换为加速度。为方便起见,您实际上并不需要在此处放置准确的内容。编辑:我不知道为什么我没有看到它,但功能都在那里......
acceleration.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)。甚至在触摸后的每个新帧上,加速度都应该设置为某个值。它应该工作得很好:)
【讨论】:
类似这样的:
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;
}
【讨论】: