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

Ios 如何计算用户拖动图像的速度?,ios,objective-c,uiimage,Ios,Objective C,Uiimage,我有一个用户可以向右拖动的图像,当用户释放它时,它会弹回来。我想在用户快速拖动并释放代码时执行一些代码。现在我有一个非常尴尬的要求,用户可以拖动图像,然后保持它静止任何时间(例如5秒),然后快速拖动并释放它。只要图像在释放时以高于一定速度移动,它就会执行代码。如果它低于最低速度,它将执行一些不同的代码。这意味着我无法计算手势开始和结束之间的时间长度,并根据时间长度执行代码。我能做什么?我想我需要知道图像在手势结束前的最后500毫秒内的移动速度。然而,我遇到了一个难题,想知道如何做到这一点。任何帮

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


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

如果您获得拖动图像时的起始X,Y坐标,以及释放鼠标时的X,Y坐标,您可以使用毕达哥拉斯定理计算两点之间的距离:

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

编辑以下评论:

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

我不会用计时器。当拖动开始时,我会将开始日期/时间与x,y位置一起保存


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

在互联网上搜索了更多信息后,我终于回答了自己的问题

我想出了我需要做的事情:

我的UIPangestureRecognitor:

- (IBAction)handlePan3:(UIPanGestureRecognizer *)recognizer3
获取用户手指在屏幕上移动的速度:

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


我正要放弃,但没有!我最终到达了那里。谢谢大家的帮助。我对一两个答案投了赞成票,因为它们很有帮助。bobnoble实际上建议使用VelocityView,我发现了另一个堆栈溢出问题,它提供了我需要的信息:

谢谢你的回答。正如我在问题中提到的,我的尴尬处境意味着我不能这样做,因为用户需要能够在拖动的中途暂停,然后快速移动图像,释放并仍然激活代码。我需要在用户释放图像之前计算最终速度。如果这有道理的话。它不能计算从开始到结束的速度,只计算释放前移动的最后一毫秒。您可以使用另一个计时器监视鼠标位置,查看它是否在仍拖动时停止移动,然后使用布尔开关让mousemove事件知道下次移动时,它将是“第二次拖动”。。你也可以使用这个计时器选择一个不同的鼠标坐标来计算你的距离/速度?我认为这不会像我需要的那样起作用。如果我错了,请纠正我,但我相信这不允许用户非常缓慢地拖动图像,大约需要10秒,然后快速移动图像并让其离开,而不停止任何操作。检查x/y坐标是否在>500毫秒的时间内保持不变?这仍然不完美,但会更好。你能把它写成代码吗?如何检查最近几毫秒内的坐标?请查看
uipangestureerecognizer
velocityInView
方法。是否可以发布一些代码?正如@bobnoble所提到的,如果你使用的是手势识别器,那么获取速度是微不足道的。今天当我到我的电脑前,我会发布一些代码。为什么不需要使用UIPangestureRecognitor获得速度?我认为这不会像我需要的那样起作用,因为它不允许用户在开始时缓慢移动图像,然后在发布之前快速移动图像并发布。我想我所需要做的就是计算图像在最后500毫秒内的速度,这个速度决定了代码是否被执行。
if (vel.x > /*value*/) {
// Your code
}