如何计算用户拖动图像的速度?

时间:2013-07-22 16:17:47

标签: ios objective-c uiimage

我有一个用户可以向右拖动的图像,当用户释放它时它会弹回。我希望在用户快速拖动并释放它时执行一些代码。现在我有一个非常尴尬的要求,用户可以拖动图像,然后保持静止任何时间长度(例如5秒),然后快速拖动并释放它。只要图像在释放时移动到特定速度以上,它就会执行代码。如果它低于最低速度,它会执行一些不同的代码。这意味着我无法计算手势开始和结束之间的时间长度,并根据时间长度执行代码。我能做什么?我想我在某种程度上需要知道图像在手势结束前的最后500毫秒内移动的速度。然而,我已经找到了如何做到这一点的砖墙。任何帮助将不胜感激。

请您在答案中加入解释和可能的示例代码,因为这将是一个很好的帮助。

3 个答案:

答案 0 :(得分:1)

如果你得到拖动图像的起始X,Y坐标,以及释放鼠标时的X,Y坐标,你可以使用毕达哥拉斯的theorm来计算两点之间的距离:{{3 }}

此外,如果您在移动鼠标时启动计时器(并且鼠标按钮已关闭),并在鼠标按钮事件中停止计时器,则可以使用时间和距离(速度=距离/时间)计算速度

编辑以下评论:

point delayedMousePos;
point previousMousePos;

bool secondDrag = false;
bool isStopped = false;

var timeFirstStopped;
var positionCount = 0;

array previousMousePositions[3];

// timer which monitors mouse position (set to an interval of say, 10ms)
function timerMonitorMousePos_Elapsed() {
    point currentMousePos = getMousePos();

    if (isStopped == false) {
        if (positionCount >= 2) {
            array_shift(previousMousePositions); // remove the first element of the array and move everything down to reindex numerical array to start counting from zero 
            positionCount = 2; // keep positionCount within array bounds
        }

        previousMousePositions[positionCount] = currentMousePos; // add the new position to the end of the 'stack'
        positionCount++;
    }

    if (currentMousePos == previousMousePos) { // start check for stationary
        isStopped = true;
        if (timeFirstStopped == null) {
            timeFirstStopped = NOW();
        } else {
            if (NOW() - timeFirstStopped >= 500) { // we have been stopped for at least 500ms (assumes time is counted in milliseconds)
                secondDrag = true;
                // previousMousePositions[0] = the mouse position 30ms before the mouse stopped
            }
        }
    } else {
        isStopped = false;
        timeFirstStopped = null;
    }

    previousMousePos = currentMousePos;
}

答案 1 :(得分:0)

我不会使用计时器。我会在拖动开始时保存开始日期/时间以及x,y位置。

拖动结束后,保存结束日期/时间和位置。根据这些信息,我可以用毫秒计算像素距离和持续时间。

答案 2 :(得分:0)

在互联网上搜索了一些后,我终于回答了我自己的问题。

我找到了我需要做的事情:

我的UIPanGestureRecognizer:

- (IBAction)handlePan3:(UIPanGestureRecognizer *)recognizer3

获取用户手指在屏幕上移动的速度:

CGPoint vel = [recognizer velocityInView:self.myView];

然后:

if (vel.x > /*value*/) {
// Your code
}

我正要放弃,但不是!我最终到了那里。感谢大家的帮助。我推荐了一两个答案,因为它们很有帮助。 bobnoble实际上给出了使用velocityInView的建议,我发现了另一个堆栈溢出问题,它给了我所需的信息:iOS - Making sense of velocityInView on UIPanGesture