• iOS加速计、陀螺仪(CoreMotion.framework)


    https://www.jianshu.com/p/c4fff00b50ff?open_source=weibo_search

    CoreMotion.framework框架介绍

    CoreMotion.framework是iOS中的一个核心运动框架,它能够满足我们手机许多应用的一些需求,比如:

    • 指南针
    • 加速计:微信摇一摇
    • 游戏中根据重力感应的操作
    • 计步器:知道我们每天走了多少步

    一、加速计

    检测设备在X、Y、Z轴上的加速度 (哪个方向有力的作用,哪个方向运动了)
    根据加速度数值,就可以判断出在各个方向上的作用力度


     
     

    注:重力不可忽略!!

    在iOS5之前我们用UIAccelerometer来获取加速度,用法非常简单,不过iOS5之后就过期了,就用CoreMotion.framework了。
    注:必须真机测试,不适用于模拟器


    使用方法

    加速计的数据获取方式有两种:push和pull

    push
    提供一个线程管理器NSOperationQueue和一个回调Block,CoreMotion自动在每一个采样数据到来的时候回调这个Block,进行处理。在这种情况下,Block中的操作会在你自己的主线程内执行。
    pull
    你必须主动去向CMMotionManager要数据,这个数据就是最近一次的采样数据。你不去要,CMMotionManager就不会给你。

    首先引入CoreMotion.framework框架框架

    #import <CoreMotion/CoreMotion.h>
    

    创建一个管理类的对象

    @property (nonatomic, strong) CMMotionManager *motionManager;
    
    1、使用push方式获取加速计数据:
    - (void)accelerometerPush
    {
        // 1.初始化运动管理对象
        self.motionManager = [[CMMotionManager alloc] init];
        // 2.判断加速计是否可用
        if (![self.motionManager isAccelerometerAvailable]) {
            NSLog(@"加速计不可用");
            return;
        }
        // 3.设置加速计更新频率,以秒为单位
        self.motionManager.accelerometerUpdateInterval = 0.1;
        // 4.开始实时获取
        [self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            //获取加速度
            CMAcceleration acceleration = accelerometerData.acceleration;
            NSLog(@"加速度 == x:%f, y:%f, z:%f", acceleration.x, acceleration.y, acceleration.z);
        }];
    }
    
    2、使用pull方式获取加速计数据:
    - (void)accelerometerPull
    {
        // 1.初始化运动管理对象
        self.motionManager = [[CMMotionManager alloc] init];
        // 2.判断加速计是否可用
        if (![self.motionManager isAccelerometerAvailable]) {
            NSLog(@"加速计不可用");
            return;
        }
        // 3.开始更新
        [self.motionManager startAccelerometerUpdates];
    }
    
    //在需要的时候获取值
    - (void)getAccelerometerData
    {
        CMAcceleration acceleration = self.motionManager.accelerometerData.acceleration;
        NSLog(@"加速度 == x:%f, y:%f, z:%f", acceleration.x, acceleration.y, acceleration.z);
    }
    

    二、陀螺仪

    陀螺仪的主要作用,是基于角动量守恒的原理,沿着某个特定的坐标轴测量旋转速率。在使用中,陀螺仪的转子在高速旋转时,始终指向一个固定的方向,当运动物体的运动方向偏离预定方向时,陀螺仪就可以感受出来。


     
     

    注:必须真机测试,不适用于模拟器

    使用方法

    陀螺仪的数据获取方式同样也有两种:push和pull,跟加速计的方式一样!

    首先引入CoreMotion.framework框架框架

    #import <CoreMotion/CoreMotion.h>
    

    创建一个管理类的对象

    @property (nonatomic, strong) CMMotionManager *motionManager;
    
    1、使用push方式获取陀螺仪数据:
    - (void)gyroPush
    {
        // 1.初始化运动管理对象
        self.motionManager = [[CMMotionManager alloc] init];
        // 2.判断陀螺仪是否可用
        if (![self.motionManager isGyroAvailable]) {
            NSLog(@"陀螺仪不可用");
            return;
        }
        // 3.设置陀螺仪更新频率,以秒为单位
        self.motionManager.gyroUpdateInterval = 0.1;
        // 4.开始实时获取
        [self.motionManager startGyroUpdatesToQueue:[[NSOperationQueue alloc] init] withHandler:^(CMGyroData * _Nullable gyroData, NSError * _Nullable error) {
            //获取陀螺仪数据
            CMRotationRate rotationRate = gyroData.rotationRate;
            NSLog(@"加速度 == x:%f, y:%f, z:%f", rotationRate.x, rotationRate.y, rotationRate.z);
        }];
    }
    
    2、使用pull方式获取陀螺仪数据:
    - (void)gyroPull
    {
        // 1.初始化运动管理对象
        self.motionManager = [[CMMotionManager alloc] init];
        // 2.判断陀螺仪是否可用
        if (![self.motionManager isGyroAvailable]) {
            NSLog(@"陀螺仪不可用");
            return;
        }
        // 3.开始更新
        [self.motionManager startGyroUpdates];
    }
    
    //在需要的时候获取值
    - (void)getGyroData
    {
        CMRotationRate rotationRate = self.motionManager.gyroData.rotationRate;
        NSLog(@"加速度 == x:%f, y:%f, z:%f", rotationRate.x, rotationRate.y, rotationRate.z);
    }
    

    三、demo

    这里有我一个封装好可以直接使用摇一摇的demo,欢迎参考!!!

     
     
    5人点赞
     
     


    作者:my_杨哥
    链接:https://www.jianshu.com/p/c4fff00b50ff
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    SharedPreferences(转)
    android操作XML的几种方式(转)
    adb 卸载APP命令和杀死APP命令
    Android判断App是否在前台运行(转)
    Java中的Timer和TimerTask在Android中的用法(转)
    Android: 启动另外的APP及传递参数(转)
    BroadcastReceiver应用详解(转)
    Android---让你的APK程序开机自动运行(转)
    adb shell 命令详解(转)
    C#串口介绍以及简单串口通信程序设计实现
  • 原文地址:https://www.cnblogs.com/itlover2013/p/14235490.html
Copyright © 2020-2023  润新知