• iOS开发之加速计(一)UIAccelerometer


    UIAccelerometer在iOS5已经被标记为过期方法,但由于它非常简单,并不影响我们学习使用。在iOS5之后我们可以使用Core Motion framework

    加速计有什么用?

    • 检测设备的运动

    应用场景

    • 摇一摇
    • 计步器

    加速计的原理

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

    加速计的加速度范围为-1到1,因为设备正常情况下会受到重力影响,所以在上述几种情况中会有向下的为1的加速度

    新建工程,我们在ViewDidLoad中加入以下代码

    1     //获得单例对象
    2     UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
    3     //设置代理
    4     accelerometer.delegate = self;
    5     //设置采样间隔 1/60.0 就是 1秒采集60次
    6     accelerometer.updateInterval = 1 / 60.0;

    实现代理方法

    1 -(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
    2 {
    3     NSLog(@"x加速度%f--y加速度%f--z加速度%f",acceleration.x,acceleration.y,acceleration.z);
    4 }

    代理方法给我们返回了加速计对象和结果对象,运行程序结果如下

    1 2015-02-10 11:11:06.168 UIAccelerometer[1147:60b] x加速度-0.060181--y加速度0.094147--z加速度-0.988922
    2 2015-02-10 11:11:06.186 UIAccelerometer[1147:60b] x加速度-0.059189--y加速度0.093430--z加速度-0.987961
    3 2015-02-10 11:11:06.204 UIAccelerometer[1147:60b] x加速度-0.059387--y加速度0.092224--z加速度-0.987488
    4 2015-02-10 11:11:06.221 UIAccelerometer[1147:60b] x加速度-0.061752--y加速度0.092514--z加速度-0.987228
    5 2015-02-10 11:11:06.239 UIAccelerometer[1147:60b] x加速度-0.057999--y加速度0.092453--z加速度-0.988937
    6 2015-02-10 11:11:06.257 UIAccelerometer[1147:60b] x加速度-0.060883--y加速度0.095367--z加速度-0.985062
    7 2015-02-10 11:11:06.275 UIAccelerometer[1147:60b] x加速度-0.058121--y加速度0.095779--z加速度-0.988708
    8 2015-02-10 11:11:06.292 UIAccelerometer[1147:60b] x加速度-0.060349--y加速度0.093201--z加速度-0.986755
    9 2015-02-10 11:11:06.310 UIAccelerometer[1147:60b] x加速度-0.054764--y加速度0.093338--z加速度-0.990158

    我们看到设备平放,在Z轴负方向受到大约为-1的加速度

    初步了解了加速计的用法,接下来我们做一个程序,屏幕上有一个小球,可以随着重力上下左右移动,我们先在屏幕上画一个小球,并在控制器中连线

    1 @property (weak, nonatomic) IBOutlet UIImageView *ball;

    让小球运动就是修改小球的x,y,我们怎么让x,y和加速度发生关系呢

    初中物理我们学过,位移=速度*时间=加速度*时间*时间,因为我们设置了采样率为1/60,所以每次调用代理方法的时间为1/60秒,所以每个时刻的瞬时速度为加速度的累加,而每个时刻的位移为速度的累加,所以代理方法中我们这样写

    1 -(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
    2 {
    3     _volecity.x += acceleration.x;
    4     _volecity.y += acceleration.y;
    5     
    6     self.ball.x += _volecity.x;
    7     self.ball.y -= _volecity.y;
    8 }

    我们设置了一个属性来记录速度

    1 @property (assign, nonatomic) CGPoint volecity;

    运行程序,我们发现小球确实可以做运动,而且具有加速度,但是小球会超出边界,在代理方法中继续加入如下代码

     1     if(self.ball.x<=0){
     2         self.ball.x = 0;
     3     }
     4     if (self.ball.y<=0) {
     5         self.ball.y = 0;
     6     }
     7     if (self.ball.maxX>=self.view.width) {
     8         self.ball.maxX = self.view.width;
     9     }
    10     if (self.ball.maxY>=self.view.height) {
    11         self.ball.maxY = self.view.height;
    12     }

    小球被囚禁在框框中了,我们再添加一些代码,让小球碰到边界时可以反弹

     1     //边界检测
     2     if(self.ball.x<=0){
     3         self.ball.x = 0;
     4         //加入反弹,削弱速度
     5         _volecity.x *= -0.5;
     6     }
     7     if (self.ball.y<=0) {
     8         self.ball.y = 0;
     9         _volecity.y *= -0.5;
    10     }
    11     if (self.ball.maxX>=self.view.width) {
    12         self.ball.maxX = self.view.width;
    13         _volecity.x *= -0.5;
    14     }
    15     if (self.ball.maxY>=self.view.height) {
    16         self.ball.maxY = self.view.height;
    17         _volecity.y *= -0.5;
    18     }

    运行程序我们发现小球可以反弹了,效果还不错,示例代码:https://github.com/dongbobo1992/iOSExamples

  • 相关阅读:
    .NET数据库编程求索之路6.使用ADO.NET实现(三层架构篇使用List传递数据基于存储过程)(1)
    【转】模板化的单例模式
    .NET数据库编程求索之路7.使用ADO.NET实现(工厂模式实现多数据库切换)(1)
    【转】VC++项目中stdafx.h的作用
    【转】用oledb读取dbf文件报错--“外部表不是预期的格式” [
    【转】ADO.Net连接DBF文件
    【转】可能继承的C++ Singleton基类
    .NET数据库编程求索之路6.使用ADO.NET实现(三层架构篇使用List传递数据基于存储过程)(2)
    .NET数据库编程求索之路4.使用ADO.NET实现(三层架构篇使用Table传递数据)(3)
    RMAN>干掉热备份#OCP试验1#
  • 原文地址:https://www.cnblogs.com/dongwenbo/p/4283458.html
Copyright © 2020-2023  润新知