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