平滑滚动/惯性滚动/动量滚动

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

Solutions Collecting From Web of "平滑滚动/惯性滚动/动量滚动"

如果你的问题在2D中,那就很简单了

  1. 你需要在每一帧中获得经过的时间
  2. 你的onTouchfunction将会find手指的加速度。 我忘记了如何从远处获得加速度的公式。 它应该是具有时间variables的位置的二阶导数。 但是你应该总是把你的deltaX,deltaY转换成加速度。 为了简单起见,你并不需要在这里准确地提供一些准确的信息。 编辑:我不知道为什么我没有看到它,但function都在那里…

    acceleration.x = 2(newposition.x – position.x – speed.x * elapsedTime)/(elapsedTime * elapsedTime);

  3. 一旦你有了加速,你可以用这个代码来设置新的位置。 这在2d是简单的物理动力学。 随着你的加速度,你可以find你的速度和速度,你可以find你的下一个位置。

    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; 

质量和摩擦会让你定义它的速度有多快,它会减慢多快。 您可能必须调整代码,因为如果您必须向后滚动才能减慢速度,则此dynamic不太好。

在每帧结束时,您将不得不将您的加速度重置为(0,0)。 而且,在每一个新的框架上,甚至触摸后,加速度应该被设置为某种东西。 它应该工作得很好:)

  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; }