传感器(加速计的应用)

传感器的定义:是一种感应/检测装置,目前已经广泛应用于智能手机上。 

作用:用于感应检测周边的信息。

比如检测声音, 光线,地图手机的朝向,贴近耳朵屏幕自动锁屏,关灯自动降低亮度不会那么亮眼, 等等。 



常见的:

环境光传感器:犹豫环境变化,调节屏幕亮度; 或者拍照,闪光灯在夜晚会 自动开启;mac的背光键盘,当周围光线弱到一定条件自动开启键盘背光。       没有api.   (自动调节屏幕亮度)

1.  距离传感器:打电话关闭屏幕,省电和防止意外操作;  语音,在耳边是话筒, 不在耳边是扩音。  (打电话自动所屏)

磁力计传感器: 电子罗盘, 导航应用; ipad的smart cover盒盖锁屏。  讲过了。   (合盖锁屏)

内部温度传感器:安全和稳定性。  没有api.   (提醒用户降温,防止损伤设备)

湿度传感器:是一个简单的 物理传感器, 遇水变红。  没有api.   (方便维修人员)

内部陀螺仪:iphone4以上,用于检测设备的握方式。 x,y,z所旋转的角速度。 模拟汽车方向盘的旋转动作。   (赛车类游戏)

2. 运动传感器/加速度传感器/加速计:(摇一摇, 计步器。 )


1.  距离传感器:打电话关闭屏幕,省电和防止意外操作;  语音,在耳边是话筒, 不在耳边是扩音。  (打电话自动所屏)

1. 开启功能。 

2.监听通知。 

3.实现监听方法。 


2.加速计: 就是检测x,y.z轴的加速度。  看哪个方向受力。 

可以看一下效果。 

原理: ios4以前, ios4之后 (包括ios4)

1.获取单例对象

2.设置代理

3设置采样间隔

4实现代理方法


     ios4以前:

    // 1.获取单例对象

    UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];

    // 2.设置代理

    accelerometer.delegate=self;

    // 3.设置采样间隔

    [accelerometersetUpdateInterval:0.3];

- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration

{

    NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);

}


ios4之后(包括ios4):

coremotion.framework框架。 (加速度升级 加入了陀螺仪)

core motion 不仅能够提供实时的加速度值 和旋转速度值, 更重要的是, 苹果在其中集成了 很多牛逼的算法。 

core motion 获取数据的两种方式:push(实时采集所有数据,采集频率高),  

                                                        pull模式()。 

push:   有个对象可以获取当前加速度的值,  一旦值发生变化, 通过block,代理,通知, 向外界推数据。  内部向外的数据。不会错过任何一个数据。  

pull:    外界想拿数据, 外界可以从这里主动去拉数据。 别人主动来拿的数据。  需要的时候拉, 错过一些数据。 

push:1.  创建一个运动管理者对象。 

         2.  判断加速计是否可以用。 (最好判断, 以防止加速计不好用的时候,客户不知道)。

    if (!self.mgr.isMagnetometerAvailable) {

        return;

    }

         3. 设置采样间隔。 

        4.  开始采样。采样到数据就会调用handler, handler会在queue中执行。 

        push :

 把数据告诉外界:

        if(error)return;

        CMMagneticFieldfield = magnetometerData.magneticField;

        NSLog(@"x:%f y:%f z:%f", field.x, field.y, field.z);


         pull :

开始采集数据。

只获取数据, 但不推送给外界, 外界想要数据, 自己来拿。 

直接读取数据就可以。 不需要代理什么的。 

accelerometerData--->   acceleration-->

  {

    // 1.获取加速计信息

    CMAcceleration acceleration = self.mgr.accelerometerData.acceleration;

    NSLog(@"x:%f y:%f z:%f", acceleration.x, acceleration.y, acceleration.z);

    // 2.获取陀螺仪信息

    CMRotationRate rate = self.mgr.gyroData.rotationRate;

    NSLog(@"x:%f y:%f z:%f", rate.x, rate.y, rate.z);

  }


摇一摇功能。例如摇一摇加好友。

方法1:  摇一摇, 可以判断, 一个x.y.x方向的值 。是一个方法。但是值太大或者太小都不好。  (复杂)

方法2:ios自带的shake api监控的方法 来实现摇一摇。 (简单)

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent*)event

{

    NSLog(@"开始摇一摇");

}

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent*)event

{

    NSLog(@"摇一摇被取消");

}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent*)event

{

    NSLog(@"摇一摇停止");

}

使用过程就是在开始motionBegan做一些动画, 结束motionEnded就结束动画然后搜索周边的好友 或者下一首等等。 


计步器:

作用:判断当前的楼层, 当前走了多少步。 

一受力一停止受力。  结合定位。 

你只要摇的话, 是没有位置变动的。 所以没用。 

ios8以前

和ios8以后(包括ios 8)


ios8以前

#import <CoreMotion/CoreMotion.h>

CMStepCounter


和ios8以后(包括ios 8)

CMPedometer

// 0.判断计步器是否可用

    if (![CMPedometer isStepCountingAvailable]) {

        NSLog(@"计步器不可用");

        return;

    }

// 1.创建计步器对象

 // 2.开始计步


UIDynamic

UIDynamics隶属于uikit框架, ios7开始引入的,物理引擎,可以模仿一些重力,弹性碰撞等物理现象。 

价值:广泛应用于游戏开发, 经典的案例是“愤怒的小鸟”。

 由于有了这个框架, 很好的解决了简单的物理计算。 

知名的2D物理引擎。 Box2d, Chipmunk。 如果你具体做这个物理现象的话, 就是要自学相关的物理引擎。

实现步骤:

创建一个物理仿真器(设置仿真范围);

创建物理仿真行为(添加仿真元素);

将物理仿真行为添加到物理仿真器中;开始仿真。

三个概念:1. 物理仿真元素:谁来执行。

2.物理仿真行为:执行什么。 仿真行为?仿真动画?

3.物理仿真器:让元素执行行为。 

哪些对象可以做物理仿真元素:任何遵守了UIDynamicItem协议的对象。

UIView, UICollectionViewLayoutAttributes等默认都遵守了协议。

所有的行为都可以组合和单独运行。

 // 根据仿真元素创建推动行为

    UIPushBehavior


 // 创建捕捉行为(快速的移动到这个位置,就是捕捉这个点)

    UISnapBehavior

    // 注意, 如果想多次执行捕捉行为, 需要在之前移除之前添加的捕捉行为

    [self.animator removeAllBehaviors];

    // 创建捕捉行为

    UISnapBehavior *snapBehavior = [[UISnapBehavior alloc] initWithItem:self.boxView snapToPoint:point];

    // 设置振幅

    snapBehavior.damping=0.0;(设置量级,代表震动,范围是0.0到1.0之间,0.0弹性最大,1.0的动作最生硬,没有弹性)

    // 添加捕捉行为到仿真器

    [self.animatoraddBehavior:snapBehavior];



  // 创建碰撞行为(根据仿真元素)

    UICollisionBehavior 

//    UICollisionBehaviorModeItems        = 1 << 0, // 只碰撞物体, 不碰撞边界(两个掉出边界)

//    UICollisionBehaviorModeBoundaries  = 1 << 1, // 只碰撞边界, 不碰撞物体(不碰撞,一个到边界拦住)

//    UICollisionBehaviorModeEverything  = NSUIntegerMax // 什么玩意都碰撞(两个都到边界拦住)


三种办法设置边界:

//其中一种是:

  碰撞的边界就是 最右边的延长线。 

  // 添加碰撞检测边界

 //@“line”是标识

    [collisionBehavoraddBoundaryWithIdentifier:@"line" fromPoint:CGPointMake(0, 600) toPoint:CGPointMake(self.view.bounds.size.width, 200)];


//代理:

设置碰撞代理来 监听碰撞事件。

如果你想知道碰撞的时间,边界, 两个碰撞的 元素是什么。可以设置一个代理。

  // 重力行为

    UIGravityBehavior

   属性:gravityDirection(重力方向,重力速度), angle(角度), magnitude(量级)。setAngle(角度和量级一起修改)




推荐阅读更多精彩内容