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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM