加速计的作用:用于检测设备的运动,比如摇晃等动作。加速计运用的于摇一摇、计步器以及各类游戏中使用。
加速计的原理就是检测设备在X、Y、Z轴上的加速度,判断在哪个方向有力的作用。
在iOS中加速计的开发有两种方式:
在iOS4之前使用的是UIAccelerometer类,用法简单,iOS5时就已经过期,但由于UIAccelerometer用法及其简单,很多程序里面种都还有残留。
使用UIAccelerometer分为4步:
// 1.获得单例对象
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
// 2.设置代理
accelerometer.delegate = self;
// 3.设置采样间隔(每隔多少秒采样一次数据)
accelerometer.updateInterval = 1 / 30.0;
//4.实现代理方法
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
// acceleration中的x、y、z三个属性分别代表每个轴上的加速度
随着iPhone4的推出
加速度计全面升级,并引入了陀螺仪,与Motion(运动)相关的编程成为重头戏,苹果特地在iOS4中增加了专门处理Motion的框架-CoreMotion.framework,Core Motion不仅能够提供实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多奇妙的算法。
Core Motion获取加速度的值有两种方式:1、push:实时的采集所有数据(采集频率高,有耗电大的缺点)2、pull:有需要的时候再去主动的采集数据
Core Motion用法:
// 1.创建motion管理者
self.mgr = [[CMMotionManager alloc] init];
// 2.判断加速计是否可用
if (self.mgr.isAccelerometerAvailable) {
[self pull];
} else {
NSLog(@"---加速计不可用-----");
}
/**
* ******* pull *******
*/
- (void)pull
{
[self.mgr startAccelerometerUpdates];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;
NSLog(@"%f %f %f", acceleration.x, acceleration.y, acceleration.z);
}
/**
* ******* push *******
*/
- (void)push
{
// 3.设置采样间隔
self.mgr.accelerometerUpdateInterval = 1 / 30.0;
// 4.开始采样(采集加速度数据)
[self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
// 如果在block中执行较好时的操作,queue最好不是主队列
// 如果在block中要刷新UI界面,queue最好是主队列
NSLog(@"%f %f %f", accelerometerData.acceleration.x, accelerometerData.acceleration.y, accelerometerData.acceleration.z);
}];
}
摇一摇功能:
方法1:通过分析加速计数据来判断是否进行了摇一摇操作(比较复杂)
方法2:iOS自带的Shake监控API(非常简单)
判断摇一摇的步骤:实现3个摇一摇监听方法,这三个方法是由UIResponder提供的,由于控制器本省就继承自该类,所以控制器就有这几个方法:
pragma mark - 实现相应的响应者方法
/** 开始摇一摇 */
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"motionBegan");
}
/** 摇一摇结束(需要在这里处理结束后的代码) */
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
// 不是摇一摇运动事件
if (motion != UIEventSubtypeMotionShake) return;
NSLog(@"motionEnded");
}
/** 摇一摇取消(被中断,比如突然来电) */
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"motionCancelled");
}