Swift - CoreMotion

1.加速傳感器能夠監聽到x,y,z三個方向的加速度,步驟以下:
(1)實例化CMMotionManager類
(2)向CMMotionManager的accelerometerUpdateInterval屬性中設置通知間隔時間值
(3)使用PerationQueeu.current創建一個監聽隊列
(4)使用startAccelerometerUpfates方法更新監聽隊列,並設置回調函數用於接受加速度通知。在回調函數中使用accelerometerData.acceleration相關屬性能夠獲取x,y,z各個方向的加速度swift

2.通知頻率設置建議
accelerometerUpdateInterval表示通知頻率,表示間隔多少bn秒通知一次。iPhone開發檔案中推薦使用的通知間隔以下:
(1)檢測設備朝向:1/10 ~ 1/20
(2)在遊戲中須要實時使用加速傳感器時:1/30 ~ 1/60
(3)檢測敲擊設備或劇烈搖動設備的狀況下:1/70 ~ 1/100ide

3.x,y,z軸
(1)對於iPhone手機來講,畫面上下爲y軸,左右爲x軸,k貫穿屏幕爲z軸
(2)向上,向右,手機的前面分別是各軸的正方向函數

4.加速度(原始加速度)
加速度不只受震動手機時施加的做用力的印象,還會持續受到重力的影響,所以iPhone手機若是垂直拿在手上的話,y軸負方向將受到重力做用,加速度y屬性將一直爲負值(最小值爲-1.0)測試

5.Gravity和UserAcceleration
motionManager.deviceMotion.userAcceleration.x和motionManager.accelerometerData!.acceleration.x兩個獲取的acceleration的區別:上面提到的原始的加速度(即經過startAccelerometerUpdates獲取的那個值)其實是由兩種加速度合成而來的,一個是重力加速度(Gravity),一個是用戶對手機是假的加速度(UserAcceleration)(固然咱們也能夠分別獲取這兩種加速度)。因此當手機垂直靜止時,雖然UserAcceleration是0,但因爲有重力加速度,因此兩個合成後加速度y屬性即是負值code

6.測試樣式
該應用運行後,將在畫面中央顯示一個球體,傾斜手機時,球體將向着親些的方向運動,碰撞到四壁後反彈回來
*/隊列

import UIKit
import CoreMotion
class ViewController: UIViewController{
    var ball:UIImageView!
    var speedX:UIAccelerationValue = 0
    var speedY:UIAccelerationValue = 0
    var motionManager = CMMotionManager()
    override func viewDidLoad() {
        super.viewDidLoad()
        //放一個球在中央
        ball = UIImageView(image: UIImage(named: "Ball"))
        ball.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        ball.center = self.view.center
        self.view.addSubview(ball)
        
        motionManager.accelerometerUpdateInterval = 1/60
        
        if motionManager.isAccelerometerAvailable{
            let queue = OperationQueue.current
            motionManager.startAccelerometerUpdates(to: queue!) { (accelerometerData, error) in
                if error != nil{
                    self.motionManager.stopAccelerometerUpdates()
                }else{
                    //動態設置小球位置
                    self.speedX += accelerometerData!.acceleration.x
                    self.speedY += accelerometerData!.acceleration.y
                    var posX = self.ball.center.x + CGFloat(self.speedX)
                    var posY = self.ball.center.y + CGFloat(self.speedY)
                    //碰到邊框後的反彈處理
                    if posX<0{
                        posX = 0
                        //碰到左邊的邊框以0.4倍的速度反彈
                        self.speedX *= -0.4
                    }else if posX > self.view.bounds.size.width{
                        posX = self.view.bounds.size.width
                        //碰到右邊的邊框以0.4倍的速度反彈
                        self.speedX *= -0.4
                    }
                    if posY < 0{
                        posY = 0
                        //碰到上面的邊框不反彈
                        self.speedY = 0
                    }else if posY > self.view.bounds.size.height{
                        posY = self.view.bounds.size.height
                        //碰到下面的邊框以1.5倍的速度反彈
                        self.speedY *= -1.5
                    }
                    self.ball.center = CGPoint(x: posX, y: posY)
                }
               
            }
        }else{
            print("你的設備不支持加速計")
        }
    }
}
相關文章
相關標籤/搜索