iOS传感器:实现一个随屏幕旋转的图片1. 加速计介绍2. 加速计的使用3. 获取加速计数据的两种方式4. 实现图片永远水平方向

在写上一个动画系列的时候学到了非常多的知识,也认识了很多人。例如受邀进入了某个神秘的动效组织,全是一线的大神啊。有UI的大牛、UED的大神、iOS的大神。加入组织可以阅读这里:加入CRAnimation组织

真的是发现坚持写作,其实也是逼迫自己坚持不断学习的过程。那么,来来来,星辰大海我们又开始启程了。这次这个系列呐,我管它叫《蓝牙和传感器小兄弟们》。先暂时这么叫着,等想到什么好听的名字再改。计划是八篇文章。

简书封面占位图.jpg

咳咳,至于最终是不是八篇就不知道了。反正现在先这么计划着,没有计划就没有办法实施嘛。实在不行就改需求,需求就是用来改的......-_-+++。所以,以下目录 随时修改 仅供参考。

第一篇:加速传感器 第二篇:陀螺仪 第三篇:磁力计 第四篇:距离传感器 第五篇:指纹识别传感器 第六篇:蓝牙之MultipeerConnectivity 第七篇:蓝牙之Core Bluetooth 第八篇:想个好玩的例子,把前面的都综合一下。

这个系列的内容模拟器基本上都不支持,需要真机测试才可以。所以掏出手机,咱们一起来搞事情吧。为了能够录到手机效果,也是小费了一番周折。

咱们通过实现一个随屏幕旋转的图片来看看加速计怎么玩。下面是完成后的效果视频截图。请无视我的小背心:

随屏幕旋转效果图

有一些APP除了绚丽的界面之外,还会有一些特殊的功能。例如微信的摇一摇,各种健康软件的计步器,指南针等等。这些APP其实都用到了iOS当中一个核心运动框架,叫做CoreMotion

CoreMotion可以从内置的传感器中获取数据,这些传感器包括陀螺仪、加速器和磁力计。更值得嘚瑟的是,苹果集成了很多算法,可以直接输出剥离重力加速因素的加速度信息。好流弊的样纸。

1. 加速计介绍

iPhone、iPad、iWatch都可以测量x,y,x三个轴上的加速力。加速力就是当物体在加速过程中作用在物体上的力。用一张图说明一下下:

轴向介绍.png

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。 使用步骤如下:

  1. 初始化CMMotionManager管理对象;
  2. 调用管理对象的对象方法获取数据;
  3. 处理数据;
  4. 当不需要使用的时候,停止获取数据。
//初始化全局管理对象
- (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轴的数值在疯狂地变化。这中间我的手机屏幕一直在晃动。

accelerometer.gif

4. 实现图片永远水平方向

4.1 思路

STEP1:为了能够让图片无论在设备如何倾斜的情况下都保持水平,肯定首先要获取到屏幕的旋转。

STEP2:用很高的频率获取到这个数值之后,来旋转图片。 STEP 3: 就结束了。神马?!!!!开玩笑啦。其实在这个过程中可以发现,图片在旋转的时候会有一些抖动。肿么办呢?我们可以考对一定时间内获取的数据取平均值来缓和。在使用了下次文章介绍的陀螺仪之后,抖动效果也会得到明显的改善。这一部分的代码部分宅胖儿就没有实现了,自己尝试一下?!啦啦啦啦啦。

4.2 实现

随屏幕旋转效果图

- (void)keepBalance{
        if (self.manager.accelerometerAvailable) {
            //设置加速计采样频率
            self.manager.accelerometerUpdateInterval = 0.01f;
            [self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
//                计算图片的水平倾斜角度。这里没有实现Z轴的形变,所以咱们只能在XY轴上变换。有兴趣的童鞋自己实现Z轴好不好?
                double rotation = atan2(accelerometerData.acceleration.x, accelerometerData.acceleration.y) - M_PI;
                self.imageView.transform = CGAffineTransformMakeRotation(rotation);
            }];
        }
}

4.3 关于形变角度atan2的说明

//计算旋转角度
double rotation = atan2(accelerometerData.acceleration.x, accelerometerData.acceleration.y) - M_PI;

这个里面用到了一个C语言的函数。atan2返回的是原点至点(x,y)的方位角,即与 x 轴的夹角。

你可能从未用过atan2这个函数,它和atan类似,但atan返回值范围是(-PI/2,PI/2),atan2返回值范围是(-PI,PI),并且他有两个参数。

atan2这个函数我们其实可以在很多地方都看到,Android、JS、PHP等等都能遇见到。如果想进一步深入了解,可以移步百度百科,感觉讲的还算挺清楚的。百度百科关于atan2的链接; 维基百科关于atan2的链接

个人感觉还是有必要好好了解一下的。

好啦手工~下次咱们用陀螺仪做一个水平滚动的小球的游戏玩玩

多谢各位大爷评论、点赞、打赏。


源代码下载地址:OC+Swift两版。下载地址

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

聊天机器人还能这么玩!教你用 Tensorflow 搭建能理解语境的客服小二!

掌握对话沟通,语境为王。 我们将使用Tensorflow构建一个聊天机器人框架,向大家示范如何实现上下文的语境处理。 ? 有没有想过为什么大多数聊天机器人缺乏会...

4575
来自专栏IT派

算法应用实践:如何用Python写一个贪吃蛇AI

这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过。但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了。 问题的关键在...

1160
来自专栏数据小魔方

R语言数据清洗实战——世界濒危遗产地数据爬取案例

最近重复新翻阅R语言领域唯一一本关于网络数据采集的参考书——《基于R语言的自动数据收集》,开篇就是一个数据爬取的案例。 尽管之前已经粗略的看过一遍,但是仍感书中...

4116
来自专栏CSDN技术头条

使用TCP时序图解释BBR拥塞控制算法的几个细节

周六,由于要赶一个月底的Deadline,因此选择了在家VPN加班,大半夜就爬起来跑用例,抓数据……自然也就没有时间写文章和外出耍了,不过利用周日的午夜时间(不...

32610
来自专栏大数据挖掘DT机器学习

如何用R语言从网上读取多样格式数据

第一部分:数据信息 生活中,我们面临着各种各样的数据:比如你的成绩单,比如公司的财务报表,比如朋友圈的一些状态,比如微信里的一段语音……我们生活的大数据时代的一...

3397
来自专栏数据小魔方

R语言可视化——图表嵌套(母子图)

之前在学习ggplot的时候,一直存在着一个困惑。 就是这个函数是否允许两个做出来的两个相关图表重叠嵌套(也就是在一个大图(主图)的边缘位置,放置另一个缩小版的...

1934
来自专栏Crossin的编程教室

【每周一坑】图像的指纹:数字水印 + 【解答】鸡兔同笼

曾经有过这样的新闻:某公司的员工将内网论坛上的言论截屏发布到互联网上,引发了热议。于是公司通过截图定位到了员工的身份,将其开除。

632
来自专栏Python与爬虫

[资源分享]计算机科学速成课

推荐 程序员的你一定要看,不是程序员的也可以看看,我已经安利刚中考完的我妹妹看了(培养程序媛...)

953
来自专栏PPV课数据科学社区

数据分析系列剧第五集:用户满意度研究(二)

本文续数据分析系列剧第五集:用户满意度研究(一)。 经过一周的调研,小蔡回收了问卷,并将问卷数据录入到SPSS中,在老刘的帮助下制作四分图,具体操作步骤如下: ...

3477
来自专栏非典型技术宅

iOS传感器:利用磁力计完成一个AR场景应用1. 磁力计的介绍2. 磁力计的使用3. 开始我们的小案例

1054

扫码关注云+社区