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

posted @ 2015-02-10 13:05  董文博  阅读(3292)  评论(0编辑  收藏  举报