9

我在 Android 中有一个 OpenGL ES 视图,它由一个用于翻译的矩阵控制。我试图找出一种方法来获得在谷歌地图应用程序或 iPhone 中看到的动量滚动提示。谢谢。

4

2 回答 2

11

如果你的问题是二维的,那很简单

  1. 您需要获取每一帧的经过时间
  2. 你的 onTouch 函数会找到你手指的加速度。我忘记了如何从远处获得加速度的公式。它应该是具有时间变量的位置的二阶导数。但是您应该始终将您的 deltaX、deltaY 转换为加速度。为方便起见,您实际上并不需要在此处放置准确的内容。编辑:我不知道为什么我没有看到它,但功能都在那里......

    加速度.x = 2(newposition.x - position.x - speed.x * elapsedTime) / (elapsedTime * elapsedTime);

  3. 获得加速度后,您可以使用该代码设置新位置。这是二维中的简单物理动力学。用你的加速度你可以找到你的速度,用你的速度你可以找到你的下一个位置。

    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
  1. 测量视图滚动的速度。
  2. 检测用户何时停止滚动。
  3. 逐渐降低滚动视图的滚动速度。

像这样的东西:

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 回答