iOS开发之加速计UIAccelerometer
UIAccelerometer在iOS5已经被标记为过期方法,但由于它非常简单,并不影响我们学习使用。在iOS5之后我们可以使用Core Motion framework
加速计有什么用?
- 检测设备的运动
应用场景
- 摇一摇
- 计步器
加速计的原理
- 检测设备在X、Y、Z轴上的加速度 (哪个方向有力的作用,哪个方向运动了)
- 根据加速度数值,就可以判断出在各个方向上的作用力度
加速计的加速度范围为-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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。