iOS傳感器:實現一個隨屏幕旋轉的圖片

在寫上一個動畫系列的時候學到了很是多的知識,也認識了不少人。例如受邀進入了某個神祕的動效組織,全是一線的大神啊。有UI的大牛、UED的大神、iOS的大神。加入組織能夠閱讀這裏:加入CRAnimation組織git

真的是發現堅持寫做,其實也是逼迫本身堅持不斷學習的過程。那麼,來來來,星辰大海咱們又開始啓程了。此次這個系列吶,我管它叫《iOS傳感器小兄弟們》。先暫時這麼叫着,等想到什麼好聽的名字再改。 算法

封面佔位圖.jpg
咳咳,下面這個計劃就真的只是計劃,反正如今先這麼計劃着。實在不行就改需求,需求就是用來改的......-_-+++。因此, 如下目錄 隨時修改 僅供參考。

第一篇:加速傳感器bash

第二篇:陀螺儀微信

第三篇:磁力計app

第四篇:距離傳感器框架

第五篇:指紋識別傳感器ide

第六篇:藍牙之MultipeerConnectivity函數

第七篇:藍牙之Core Bluetooth學習

第八篇:想個好玩的例子,把前面的都綜合一下。測試

這個系列的內容模擬器基本上都不支持,須要真機測試才能夠。因此掏出手機,我們一塊兒來搞事情吧。爲了可以錄到手機效果,也是小費了一番周折。

我們經過實現一個隨屏幕旋轉的圖片來看看加速計怎麼玩。下面是完成後的效果視頻截圖,GIF圖片的壓縮效果也是剛剛的。請無視個人小背心:

隨屏幕旋轉效果圖

有一些APP除了絢麗的界面以外,還會有一些特殊的功能。例如微信的搖一搖,各類健康軟件的計步器,指南針等等。這些APP其實都用到了iOS當中一個核心運動框架,叫作CoreMotion

CoreMotion能夠從內置的傳感器中獲取數據,這些傳感器包括陀螺儀、加速器和磁力計。更值得嘚瑟的是,蘋果集成了不少算法,能夠直接輸出剝離重力加速因素的加速度信息。好流弊的樣紙。

1. 加速計介紹

iPhone、iPad、iWatch均可以測量x,y,x三個軸上的加速力。加速力就是當物體在加速過程當中做用在物體上的力。用一張圖說明一下下:

軸向介紹.png

2. 加速計的使用

既然說了加速計是經過CoreMotion這個框架來管理的,並且蘋果繼承了辣麼多算法,因此CoreMotion必定還有一個Manager。官方是這麼介紹CMMotionManager:

A CMMotionManager object is the gateway to the motion services provided by iOS. These services provide an app with accelerometer data, rotation-rate data, magnetometer data, and other device-motion data such as attitude. These types of data originate with a device’s accelerometers and (on some models) its magnetometer and gyroscope.

因此只要使用Motion的服務,我們必定須要使用CMMotionManager。 使用步驟以下:

  1. 初始化CMMotionManager管理對象;
  2. 調用管理對象的對象方法獲取數據;
  3. 處理數據;
  4. 當不須要使用的時候,中止獲取數據。
//初始化全局管理對象
- (CMMotionManager *)manager{
    if (!_manager) {
        _manager = [[CMMotionManager alloc] init];
    }
    return _manager;
}

複製代碼
//中止獲取加速計數據。在中止以前判斷一下是否還處在活動
    if ( self.manager.accelerometerActive) {
        [self.manager stopAccelerometerUpdates];
        NSLog(@"關閉啦");
    }

複製代碼

3. 獲取加速計數據的兩種方式

CoreMotion中有2種獲取數據方式,一種叫作PUSH的方式,一種叫作PULL的方式。 顧名思義,PUSH就是被動的獲取。設定完了以後,線程定時把獲取到的數據推送回來。可想而知,對於資源的消耗是會稍微大一點的。

PULL,就是要去索取。拉一下才會獲取到數據。不要不給。

3.1 PULL的方式

- (void)useAccelerometerPull{

    //判斷加速度計可不可用
    if (self.manager.accelerometerAvailable){
        //設置加速計多久採樣一次
        self.manager.accelerometerUpdateInterval = 0.1;
        //開始更新,後臺線程開始運行。這是Pull方式。
        [self.manager startAccelerometerUpdates];
    }
    //獲取並處理加速度計數據。這裏咱們就只是簡單的作了打印。
    NSLog(@"X = %f,Y = %f,Z = %f",self.manager.accelerometerData.acceleration.x,self.manager.accelerometerData.acceleration.y,self.manager.accelerometerData.acceleration.z);
}

複製代碼

3.2 PUSH的方式

- (void)useAccelerometerPush{
    //判斷加速度計可不可用,判斷加速度計是否開啓
    if (self.manager.accelerometerAvailable){
        //設置加速計多久採樣一次
        self.manager.accelerometerUpdateInterval = 0.1;
        //Push方式獲取和處理數據,這裏咱們同樣只是作了簡單的打印。把採樣的工做放在了主線程中。
        [self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
                                      withHandler:^(CMAccelerometerData *accelerometerData, NSError *error){
       NSLog(@"X = %f,Y = %f,Z = %f",self.manager.accelerometerData.acceleration.x,self.manager.accelerometerData.acceleration.y,self.manager.accelerometerData.acceleration.z);
         }];
    } else{
        NSLog(@"不可用");
    }
}

複製代碼

3.3 打印結果

咱們能夠愉快的看到XYZ軸的數值在瘋狂地變化。這中間個人手機屏幕一直在晃動。

accelerometer.gif

4. 實現圖片永遠水平方向

4.1 思路

STEP1:爲了可以讓圖片不管在設備如何傾斜的狀況下都保持水平,確定首先要獲取到屏幕的旋轉。

STEP2:用很高的頻率獲取到這個數值以後,來旋轉圖片。 STEP 3: 就結束了。神馬?!!!!開玩笑啦。其實在這個過程當中能夠發現,圖片在旋轉的時候會有一些抖動。腫麼辦呢?咱們能夠考對必定時間內獲取的數據取平均值來緩和。在使用了下次文章介紹的陀螺儀以後,抖動效果也會獲得明顯的改善。這一部分的代碼部分宅胖兒就沒有實現了,本身嘗試一下?!啦啦啦啦啦。

4.2 實現

隨屏幕旋轉效果圖

- (void)keepBalance{
        if (self.manager.accelerometerAvailable) {
            //設置加速計採樣頻率
            self.manager.accelerometerUpdateInterval = 0.01f;
            [self.manager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
//                計算圖片的水平傾斜角度。這裏沒有實現Z軸的形變,因此我們只能在XY軸上變換。有興趣的童鞋本身實現Z軸好很差?
                double rotation = atan2(accelerometerData.acceleration.x, accelerometerData.acceleration.y) - M_PI;
                self.imageView.transform = CGAffineTransformMakeRotation(rotation);
            }];
        }
}

複製代碼

4.3 關於形變角度atan2的說明

//計算旋轉角度
double rotation = atan2(accelerometerData.acceleration.x, accelerometerData.acceleration.y) - M_PI;

複製代碼

這個裏面用到了一個C語言的函數。atan2返回的是原點至點(x,y)的方位角,即與 x 軸的夾角。

你可能從未用過atan2這個函數,它和atan相似,但atan返回值範圍是(-PI/2,PI/2),atan2返回值範圍是(-PI,PI),而且他有兩個參數。

atan2這個函數咱們其實能夠在不少地方都看到,Android、JS、PHP等等都能碰見到。若是想進一步深刻了解,能夠移步百度百科,感受講的還算挺清楚的。百度百科關於atan2的連接;   維基百科關於atan2的連接

好啦~手工~~~下次我們用陀螺儀作一個水平滾動的小球的遊戲玩玩~

多謝各位大爺評論、點贊、打賞。


源代碼下載地址:OC+Swift兩版。下載地址

相關文章
相關標籤/搜索