【问题标题】:smooth scroll/inertial scrolling/momentum scroll平滑滚动/惯性滚动/动量滚动
【发布时间】:2010-12-28 19:25:01
【问题描述】:

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

【问题讨论】:

    标签: iphone android opengl-es matrix-multiplication


    【解决方案1】:

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

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

      acceleration.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)。甚至在触摸后的每个新帧上,加速度都应该设置为某个值。它应该工作得很好:)

    【讨论】:

    • 正在查看您的答案,并且想知道当您的速度公式需要加速时,您如何获得用于加速的速度......一个取决于并需要另一个?
    • 不是直接计算速度,使用加速度可能会得到更好的结果。初始速度和加速度为 0。因此您必须在某处保存速度以将其添加到下一帧。加速度只不过是每一帧之间的变化。加速度可以是deltaX、deltaY。实际速度将是 deltaX * elapsedTime + lastSpeed。这样,即使一帧花费大量时间或少量时间,也能正确计算速度。其他参数假装一点物理来增加惯性和摩擦力。你真的不希望它永远滚动。
    【解决方案2】:
    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;
    }
    

    【讨论】:

    • 谢谢,你知道我如何控制用户滚动的速度吗?现在它只是计算用户手指的起始位置和结束位置之间的增量,然后将其放入矩阵中。
    • 抱歉,我对 Android 的了解不够,无法帮助解决触摸位置等细节问题。
    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多