0

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

您能否在答案中包含解释和可能的示例代码,因为这将是一个很大的帮助。

4

3 回答 3

1

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

此外,如果您在鼠标移动(并且鼠标按钮按下)时启动计时器,并在 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;
}
于 2013-07-22T16:20:57.030 回答
0

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

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

于 2013-07-22T21:32:35.043 回答
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

于 2013-07-23T11:08:14.307 回答