分享是每个优秀的程序员所必备的品质
加速计 : 检测力在某个方向上有作用,它是三维全方向感知的,手机平面左右两侧对应加速计x轴负正,手机上下对应y轴正负,垂直手机平面朝里朝外对应z轴正负。当 iPhone静止时,受到的重力加速度为1g,根据摆放位置分摊在三个轴上,比如z轴g = -1说明手机正面朝上平放,而不管怎么放置,三轴方向的加速度都不会超过1g。但当运动状态时,就可能出现特别的数值,正是根据这些数值我们可以判断出运动方向和速度并用于应用中。
陀螺仪 : 检测转动的角速度 ,也叫角加速度传感器!是用来测量角速度或维持方向的设备基于角动量守恒原理。陀螺仪都是三轴定位。iPhone内置的陀螺仪可以在6个方向上感知运动,采用了微型的、电子化的振动陀螺仪。简而言之吧,这玩意就是你去哪儿和在哪儿都靠他。包括世面上的一些游戏大作都是基于这个东西的,还有一些运动系列的app也不得不用到他!
磁力计 : 检测磁场变化, 测试磁场强度和方向,一般用于定位设备的方位。可以测量出当前设备与东南西北四个方向上的夹角。
加速计分为push和pull两种方式:
首先创建一个管理类的对象
/** 运动管理器对象*/
@property (nonatomic, strong) CMMotionManager *motionMgr;
/**
加速计push 方式:根据设置的采样间隔定时输出结果
*/
- (void)accelerometerPush{
// 1. 创建CMMotionManager对象
self.motionMgr = [[CMMotionManager alloc]init];
// 2. 判断加速计是否可用(基本上涉及到硬件的都需要判断一下是否可用)
if(![self.motionMgr isAccelerometerAvailable]){
NSLog(@"加速计不可用");
return;
}
// 3. 设置采样间隔
self.motionMgr.accelerometerUpdateInterval = 1 ;
// 4.开始采样
[self.motionMgr startAccelerometerUpdatesToQueue:[NSOperationQueue new] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
// 5. 获取data中的值
// 正值负值: 轴的方向, 哪个指向地面, 就会打印出打个方向的值
// 只要在某个轴上, 进行快速移动, 那么值就会发生变化
CMAcceleration acceleration = accelerometerData.acceleration;
NSLog(@"x : %f, y : %f, z : %f", acceleration.x, acceleration.y, acceleration.z);
}];
}
/**
加速计Pull方式 : 在需要的时候来获取值(如点击屏幕获取)
*/
- (void)accelerometerPull{
// 1. 创建CMMotionManager对象
self.motionMgr = [CMMotionManager new];
// 2. 判断加速计是否可用
if (![self.motionMgr isAccelerometerAvailable]) {
return;
}
// 3. 开始采样
[self.motionMgr startAccelerometerUpdates];
}
/**
点击屏幕获取值
*/
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesBegan:touches withEvent:event];
// 4. 点击时获取加速计的值,运动管理器会记录所有的值, 在自己的属性中
CMAcceleration acceleration = self.motionMgr.accelerometerData.acceleration;
NSLog(@"x : %f, y : %f, z : %f", acceleration.x, acceleration.y, acceleration.z);
}
陀螺仪分为push和pull两种方式:
/**
陀螺仪Push方式
*/
- (void)gyroPush
{
// 1. 创建CMMotionManager对象
self.motionMgr = [CMMotionManager new];
// 2. 判断陀螺仪是否可用
if (![self.motionMgr isGyroAvailable]) {
return;
}
// 3. 设置采样间隔 单位是秒 --> 只有push方式需要采样间隔
self.motionMgr.gyroUpdateInterval = 1;
//4. 开始采样
[self.motionMgr startGyroUpdatesToQueue:[NSOperationQueue new] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
//5 获取data中的数据值
// 正值负值: 轴的方向, 哪个指向地面, 就会打印出打个方向的值
// 只要在某个轴上, 进行快速移动, 那么值就会发生变化
CMRotationRate rotationRate = gyroData.rotationRate;
NSLog(@"x : %f, y : %f, z : %f", rotationRate.x, rotationRate.y, rotationRate.z);
}];
}
/**
加速计Pull方式 :在需要的时候来获取值(点击屏幕获取值)
*/
- (void)gyroPull
{
// 1. 创建CMMotionManager对象
self.motionMgr = [CMMotionManager new];
// 2. 判断加速计是否可用
if (![self.motionMgr isGyroAvailable]) {
return;
}
// 3. 开始采样
[self.motionMgr startGyroUpdates];
}
/**
点击屏幕获取值
*/
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesBegan:touches withEvent:event];
// 4 点击时获取陀螺仪的值
CMRotationRate rotationRate = self.motionMgr.gyroData.rotationRate;
NSLog(@"x : %f, y : %f, z : %f", rotationRate.x, rotationRate.y, rotationRate.z);
}
磁力计分为push和pull两种方式:
/**
磁力计Push方式
*/
- (void)magnetometerPush
{
// 1. 创建CMMotionManager对象
self.motionMgr = [CMMotionManager new];
// 2. 判断磁力计是否可用
if (![self.motionMgr isMagnetometerAvailable]) {
return;
}
// 3. 设置采样间隔 单位是秒 --> 只有push方式需要采样间隔
self.motionMgr.magnetometerUpdateInterval = 1;
// 4. 开始采样
[self.motionMgr startMagnetometerUpdatesToQueue:[NSOperationQueue new] withHandler:^(CMMagnetometerData * _Nullable gyroData, NSError * _Nullable error) {
// 5 获取data中的数据 单位:特斯拉,
CMMagneticField magneticField = self.motionMgr.magnetometerData.magneticField;
NSLog(@"x : %f, y : %f, z : %f", magneticField.x, magneticField.y, magneticField.z);
}];
}
/**
磁力计Pull方式 --> 在需要的时候来获取值
*/
- (void)magnetometerPull{
// 1. 创建CMMotionManager对象
self.motionMgr = [CMMotionManager new];
// 2. 判断磁力计是否可用
if (![self.motionMgr isMagnetometerAvailable]) {
return;
}
// 3. 开始采样
[self.motionMgr startMagnetometerUpdates];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 4. 点击时获取磁力计的值
CMMagneticField magneticField = self.motionMgr.magnetometerData.magneticField;
NSLog(@"x : %f, y : %f, z : %f", magneticField.x, magneticField.y, magneticField.z);
}