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

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

  • SurfaceTexture的onFrameAvailable()方法总是调用得太晚
  • 错误1 libavcodec.so文件格式无法识别Android GL Live Wallpaper
  • 在Libgdx中实现简单运动模糊的意外结果
  • 如何使用Android摄像头与OpenGL ES工作?
  • Android版OpenGL ES的着色器
  • Android上的OpenGL是电池杀手?
  • Android - 从计时器线程更新位图
  • 如何find不同手机的最大纹理尺寸?
  • 如果你的问题在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; }