加速度计震动只发出一次声音?

时间:2009-11-11 22:51:06

标签: iphone cocoa-touch

我正在尝试实现一个检测用户摇晃他/她的iPhone的功能,然后该应用程序会发出吠声。到目前为止,我已经在下面附上了代码,并且它有效。但是,如果我更加努力地晃动手机,它会在另一个之后立即制造2个或更多的树皮。我如何确保每次摇晃只发生一次,无论多么努力?

- (void)accelerometer:(UIAccelerometer *)accelerometer 
    didAccelerate:(UIAcceleration *)acceleration {
        if (acceleration.x > kAccelerationThreshold ||
            acceleration.y > kAccelerationThreshold ||
            acceleration.z > kAccelerationThreshold) {
            // BARKING SOUND
        }
    }

3 个答案:

答案 0 :(得分:5)

您可以使用NSTimer - 请查看此处:section "Timer"

播放声音后,将名为“hasBarked”的布尔变量设置为YES,然后调用计时器。两秒钟后,计时器将“hasBarked”设置为NO并禁用自身。 最后,将整个声音播放方法放入if块中,如果“hasBarked”为NO,则只播放声音。

答案 1 :(得分:3)

为什么不在上次播放声音时保持一个值呢?

time_t last_time_played_bark = 0;


#define MINIMUM_TIME_BETWEEN_BARKS 5   // in seconds
time_t now = time(NULL);

if (last_time_played_bark + MINIMUM_TIME_BETWEEN_BARKS < now) {
    // BARKING_SOUND
    last_time_played_bark = now;
}

据推测,你希望MINIMUM_TIME_BETWEEN_BARKS至少与播放声音一样长。

答案 2 :(得分:1)

作为旁注,如果您只想检测摇动手势,您可能会发现使用motion events added in OS 3.0比尝试从原始加速度计数据中滚动自己更容易。

我同意Epsilon Prime的建议,即存储上次播放声音时的时间戳,以此来节制播放频率的方法。