iPhone加速度计改变灵敏度 - Cocoa Touch

时间:2011-04-19 20:17:51

标签: iphone objective-c xcode accelerometer

您好 当用户移动设备时,我希望灵敏度发生变化。目前它不是很敏感,我相信它默认。我希望它更敏感,所以当用户摇动手机时会播放一些声音。

这是代码

由于

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self becomeFirstResponder];
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(motion == UIEventSubtypeMotionShake)
    {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"whip" ofType:@"wav"];
        if (theAudio) [theAudio release];
        NSError *error = nil;
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
        if (error)
            NSLog(@"%@",[error localizedDescription]);
        theAudio.delegate = self;
        [theAudio play];    
    }
}

3 个答案:

答案 0 :(得分:4)

首先,确保您的界面采用UIAccelerobeterDelegate协议。

@interface MainViewController : UIViewController <UIAccelerometerDelegate>

现在在您的实施中:

//get the accelerometer
self.accelerometer = [UIAccelerometer sharedAccelerometer];
self.accelerometer.updateInterval = .1;
self.accelerometer.delegate = self;

实施委托方法:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{
  float x = acceleration.x;
  float y = acceleration.y;
  float b = acceleration.z;

  // here you can write simple change threshold logic
  // so you can call trigger your method if you detect the movement you're after
}

加速度计为x,y和z返回的值将始终为介于-1.0和正1.0之间的浮点数。您应该调用NSLog并输出到控制台的x,y和z值,这样您就可以了解它们的含义。然后你可以开发一种检测运动的简单方法。

答案 1 :(得分:0)

您无法更改震动事件的工作方式。如果你需要不同的东西,你必须根据[UIAccelerometer sharedAccelerometer]给你的x / y / z力编写自己的摇动检测代码;如果您将sharedAccelerometer的委托设置为您的类,您可以获取加速度计的加速度计:didAccelerate:委托回调。

答案 2 :(得分:0)

如果您正在尝试重新创建摇晃手势,请记住以下几点:

摇动是指向一个方向的运动,然后是沿大致相反方向的运动。这意味着您必须跟踪以前的加速度矢量,以便了解它们何时发生变化。所以你不要错过它,你必须经常从加速度计中取样。

CGFloat samplesPerSecond = 30;
[[UIAccelerometer sharedAccelerometer] setDelegate: self];
[[UIAccelerometer sharedAccelerometer] setUpdateInterval: 1.0 / samplesPerSecond]; 

然后在你的委托回调中:

- (void) accelerometer: (UIAccelerometer *) accelerometer didAccelerate: (UIAcceleration *) acceleration {
  // TODO add this acceleration to a list of accelerations and keep the most recent (perhaps 30)
  // TODO analyze accelerations and determine if a direction change occurred
  // TODO if it did, then a shake occurred!  Clear the list of accelerations and perform your action
}