.h文件
@interface ShakeViewController : UIViewController<UIAccelerometerDelegate>
{
UIAccelerationValue myAccelerometer[3];
//是否响应摇一摇的标志
BOOL _canShake;
}
.m文件中
#define kFilteringFactor 0.1
#define kEraseAccelerationThreshold 2.0
@implementation ShakeViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
_canShake = YES;
}
return self;
}
- (void)dealloc
{
[UIAccelerometer sharedAccelerometer].delegate = nil;
[super dealloc];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[UIAccelerometer sharedAccelerometer].delegate = self;
[UIAccelerometer sharedAccelerometer].updateInterval = 1.0f/40.0f;
}
#pragma mark - UIAccelerometerDelegate
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
UIAccelerationValue length, x, y, z;
if (!_canShake)
{
return;
}
//Use a basic high-pass filter to remove the influence of the gravity
myAccelerometer[0] = acceleration.x * kFilteringFactor + myAccelerometer[0] * (1.0 - kFilteringFactor);
myAccelerometer[1] = acceleration.y * kFilteringFactor + myAccelerometer[1] * (1.0 - kFilteringFactor);
myAccelerometer[2] = acceleration.z * kFilteringFactor + myAccelerometer[2] * (1.0 - kFilteringFactor);
// Compute values for the three axes of the acceleromater
x = acceleration.x - myAccelerometer[0];
y = acceleration.y - myAccelerometer[0];
z = acceleration.z - myAccelerometer[0];
//Compute the intensity of the current acceleration
length = sqrt(x * x + y * y + z * z);
// If above a given threshold, play the erase sounds and erase the drawing view
if(length >= kEraseAccelerationThreshold)
{
//是否响应摇一摇的标志
_canShake = NO;
[self shakeEvent];
}
}