正文
在写上一个动画系列的时候学到了非常多的知识,也认识了很多人。例如受邀进入了某个神秘的动效组织,全是一线的大神啊。有UI的大牛、UED的大神、iOS的大神。加入组织可以阅读这里:
加入CRAnimation组织
。
真的是发现坚持写作,其实也是逼迫自己坚持不断学习的过程。那么,来来来,星辰大海我们又开始启程了。这次这个系列呐,我管它叫《iOS传感器小兄弟们》。先暂时这么叫着,等想到什么好听的名字再改。
咳咳,下面这个计划就真的只是计划,反正现在先这么计划着。实在不行就改需求,需求就是用来改的......-_-+++。所以,
以下目录
随时修改
仅供参考。
第一篇:加速传感器
第二篇:陀螺仪
第三篇:磁力计
第四篇:距离传感器
第五篇:指纹识别传感器
第六篇:蓝牙之MultipeerConnectivity
第七篇:蓝牙之Core Bluetooth
第八篇:想个好玩的例子,把前面的都综合一下。
这个系列的内容模拟器基本上都不支持,需要真机测试才可以。所以掏出手机,咱们一起来搞事情吧。为了能够录到手机效果,也是小费了一番周折。
咱们通过实现一个随屏幕旋转的图片来看看加速计怎么玩。下面是完成后的效果视频截图,GIF图片的压缩效果也是刚刚的。请无视我的小背心:
有一些APP除了绚丽的界面之外,还会有一些特殊的功能。例如微信的摇一摇,各种健康软件的计步器,指南针等等。这些APP其实都用到了iOS当中一个核心运动框架,叫做
CoreMotion
。
CoreMotion可以从内置的传感器中获取数据,这些传感器包括陀螺仪、加速器和磁力计。更值得嘚瑟的是,苹果集成了很多算法,可以直接输出剥离重力加速因素的加速度信息。好流弊的样纸。
1. 加速计介绍
iPhone、iPad、iWatch都可以测量x,y,x三个轴上的加速力。加速力就是当物体在加速过程中作用在物体上的力。用一张图说明一下下:
2. 加速计的使用
既然说了加速计是通过
CoreMotion
这个框架来管理的,而且苹果继承了辣么多算法,所以CoreMotion一定还有一个Manager。官方是这么介绍CMMotionManager:
A CMMotionManager object is the gateway to the motion services provided by iOS. These services provide an app with accelerometer data, rotation-rate data, magnetometer data, and other device-motion data such as attitude. These types of data originate with a device’s accelerometers and (on some models) its magnetometer and gyroscope.
所以只要使用Motion的服务,咱们一定需要使用CMMotionManager。
使用步骤如下:
初始化CMMotionManager管理对象;
调用管理对象的对象方法获取数据;
处理数据;
当不需要使用的时候,停止获取数据。
//初始化全局管理对象
- (CMMotionManager *)manager{
if (!_manager) {
_manager = [[CMMotionManager alloc] init];
}
return _manager;
}
//停止获取加速计数据。在停止之前判断一下是否还处在活动
if ( self.manager.accelerometerActive) {
[self.manager stopAccelerometerUpdates];
NSLog(@"关闭啦" );
}
3. 获取加速计数据的两种方式
CoreMotion中有2种获取数据方式,一种叫做PUSH的方式,一种叫做PULL的方式。
顾名思义,PUSH就是被动的获取。设定完了之后,线程定时把获取到的数据推送回来。可想而知,对于资源的消耗是会稍微大一点的。
PULL,就是要去索取。拉一下才会获取到数据。不要不给。
3.1 PULL的方式
- (void)useAccelerometerPull{
//判断加速度计可不可用
if (self.manager.accelerometerAvailable){
//设置加速计多久采样一次
self.manager.accelerometerUpdateInterval = 0.1;
//开始更新,后台线程开始运行。这是Pull方式。
[self.manager startAccelerometerUpdates];
}
//获取并处理加速度计数据。这里我们就只是简单的做了打印。
NSLog(@"X = %f,Y = %f,Z = %f" ,self.manager.accelerometerData.acceleration.x,self.manager.accelerometerData.acceleration.y,self.manager.accelerometerData.acceleration.z);
}
3.2 PUSH的方式
- (void)useAccelerometerPush{
//判断加速度计可不可用,判断加速度计是否开启
if (self.manager.accelerometerAvailable){
//设置加速计多久采样一次
self.manager.accelerometerUpdateInterval = 0.1;
//Push方式获取和处理数据,这里我们一样只是做了简单的打印。把采样的工作放在了主线程中。
[self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMAccelerometerData *accelerometerData, NSError *error){
NSLog(@"X = %f,Y = %f,Z = %f" ,self.manager.accelerometerData.acceleration.x,self.manager.accelerometerData.acceleration.y,self.manager.accelerometerData.acceleration.z);
}];
} else {
NSLog(@"不可用" );
}
}
3.3 打印结果
我们可以愉快的看到XYZ轴的数值在疯狂地变化。这中间我的手机屏幕一直在晃动。
4. 实现图片永远水平方向
4.1 思路
STEP1:为了能够让图片无论在设备如何倾斜的情况下都保持水平,肯定首先要获取到屏幕的旋转。
STEP2:用很高的频率获取到这个数值之后,来旋转图片。
STEP 3: 就结束了。神马?!!!!开玩笑啦。其实在这个过程中可以发现,图片在旋转的时候会有一些抖动。肿么办呢?我们可以考对一定时间内获取的数据取平均值来缓和。在使用了下次文章介绍的陀螺仪之后,抖动效果也会得到明显的改善。这一部分的代码部分宅胖儿就没有实现了,自己尝试一下?!啦啦啦啦啦。
4.2 实现