深度的Android感測器:近距離和陀螺儀 (有原始碼)

世界美景發表於2017-11-03

為什麼總是期望使用者點選觸控式螢幕上的按鈕?透過使用中端Android手機上可用的一些硬體感測器,您可以建立提供更加吸引人的使用者體驗的應用程式。

感測器框架是Android SDK的一部分,它允許您以簡單和一致的方式從大多數感測器(無論是硬體還是軟體)讀取原始資料。在本教程中,我將向您展示如何使用框架從兩個非常常見的感測器讀取資料:接近和陀螺儀。我還將向您介紹旋轉向量感測器,一種複合感測器,在大多數情況下,它可以作為陀螺儀更簡單,更準確的替代方案。

您可以閱讀以下教程,瞭解Android的硬體感測器:

  • ANDROID SDK
    Android從頭開始:硬體感測器
    保羅Trebilcox-Ruiz

要跟隨,您將需要以下內容:

  • 具有接近感測器和陀螺儀的Android裝置
  • 最新版本的Android Studio

如果您的應用程式在不需要所有硬體感測器的裝置上無法使用,則不能在此類裝置上安裝。您可以透過在<uses-feature>Android Studio專案的清單檔案中新增一個或多個標籤來讓Google Play和其他應用程式市場瞭解應用程式的硬體要求

我們將在本教程中建立的應用程式將不適用於缺少接近感測器和陀螺儀的裝置。因此,將以下行新增到清單檔案中:

但是請注意,<uses-feature>如果使用者使用其APK檔案手動安裝應用程式,則該標籤無法幫助,則在使用感測器之前,仍必須以程式設計方式檢查感測器是否可用。

為了避免意外的觸控事件,您的手機的觸控式螢幕在通話期間會變黑,當它非常接近您的耳朵時。曾經想過你的手機如何確定它是否接近你的耳朵?那麼它使用接近感測器,這是一個硬體感測器,可以判斷物體是否接近它。一些接近感測器也可以告訴物體有多遠,儘管它們的最大範圍通常只有約5釐米。

現在讓我們建立一個活動,其背景顏色在每次將您的手懸停在裝置的接近感測器上時變為紅色。

要訪問任何硬體感測器,您需要一個SensorManager物件。要建立它,請使用getSystemService()您的Activity方法並將SENSOR_SERVICE常量傳遞給它。

您現在可以Sensor透過呼叫該getDefaultSensor()方法並將TYPE_PROXIMITY常量傳遞給它來為接近感測器建立一個物件

在繼續之前,始終確保Sensor物件不是null如果是,則表示接近感測器不可用。

為了能夠讀取感測器生成的原始資料,您必須SensorEventListener透過呼叫物件registerListener()方法來與它相關聯SensorManager在執行此操作時,您還必須指定從感測器讀取資料的頻率。

以下程式碼註冊一個監聽器,您可以每兩秒讀取一次接近感測器的資料:

我建議您始終在onResume()活動方法內註冊該監聽器,並在方法內取消註冊onPause()以下是登出偵聽器的方法:

SensorEvent方法中可用物件onSensorChanged()具有包含values相關感測器生成的所有原始資料陣列。在接近感測器的情況下,陣列包含指定感測器和附近物體之間距離(​​釐米)的單個值。

如果該值等於感測器的最大範圍,則可以安全地假定附近沒有。相反,如果它小於最大範圍,則意味著附近有些東西。您可以使用getMaximumRange()相關Sensor物件方法確定任何硬體感測器的最大範圍

要根據接近感測器的資料實際更改活動的背景顏色,可以使用setBackgroundColor()頂級視窗的裝飾檢視的方法。

因此,onSensorChanged()在上一步中建立方法中新增以下程式碼

如果您現在執行該應用程式並將手懸停在手機的頂部邊緣,則應該會看到螢幕變紅。

當附近檢測到物體時,背景顏色會發生變化

陀螺儀允許您在任何給定時刻確定Android裝置的角速度。簡單來說,它告訴您裝置繞X,Y和Z軸旋轉的速度有多快。最近,即使是預算手機正在製造,陀螺儀內建,擴增實境和虛擬現實應用程式變得如此受歡迎。

透過使用陀螺儀,您可以開發可以響應裝置方向的微小更改的應用程式。要了解如何,現在讓我們建立一個活動,其背景顏色每次沿Z軸沿逆時針方向旋轉手機時,藍色變為藍色,否則為黃色。

要建立Sensor陀螺儀物件,所有您需要做的是將TYPE_GYROSCOPE常量傳遞物件getDefaultSensor()方法SensorManager

建立陀螺儀感測器的監聽器與為接近感測器建立偵聽器沒有什麼不同。但是,註冊時,您必須確保其取樣頻率非常高。因此,我建議您使用SENSOR_DELAY_NORMAL常量,而不是以微秒為單位指定輪詢間隔

陀螺感測器的原始資料由三個float組成  ,指定器件沿X,Y和Z軸的角速度。每個值的單位是每秒弧度。在沿著任何軸的逆時針旋轉的情況下,與該軸相關聯的值將為正。在順時針旋轉的情況下,它將為負。

因為我們目前只對沿著Z軸的旋轉感興趣,所以我們將只使用物件values陣列中的第三個元素SensorEvent如果超過0.5f,我們可以在很大程度上確保旋轉是逆時針旋轉的,並將背景顏色設定為藍色。類似地,如果它小於-0.5f,我們可以將背景顏色設定為黃色。

如果您現在執行該應用程式,請將手機置於縱向模式,然後將其向左傾斜,您應該看到活動變為藍色。如果傾斜方向相反,則應變黃。

基於角速度的背景顏色變化

但是,如果您將手機轉到太多,螢幕方向將變為橫向,您的活動將重新啟動。為了避免這種情況,我建議您在清單檔案中設定screenOrientation活動portrait

大多數開發者今天都喜歡軟體,複合感測器超過硬體感測器 軟體感測器結合了來自多個硬體感測器的低階原始資料,生成不僅易於使用的新資料,而且更準確。接近感測器沒有替代軟體。然而,陀螺儀具有兩個:遊戲旋轉向量感測器和旋轉向量感測器。在本教程中,我們將僅關注後者。

在上一步的例子中,我們每次沿著Z軸的角速度順時針或逆時針方向大於0.5rad / s時,改變了活動的背景顏色。然而,使用角速度並不直觀。此外,我們不知道裝置在旋轉之前或之後的實際角度。

透過使用旋轉向量感測器,讓我們現在建立一個活動,其背景顏色只有在旋轉了特定角度時才會改變。例如,我們可以將其沿著Z軸的旋轉度大於45°時變為黃色,當其旋轉在-10°和10°之間時為白色,當旋轉小於-45°時,它們為藍色。

要獲取旋轉向量感測器,必須將TYPE_ROTATION_VECTOR常量傳遞物件getDefaultSensor()方法SensorManager

使用軟體感測器與使用硬體感測器沒有什麼不同。因此,您必須將偵聽器與旋轉向量感測器相關聯才能讀取其資料。您可以再次使用SENSOR_DELAY_NORMAL常量進行輪詢間隔。


步驟2:使用資料

旋轉向量感測器組合由陀螺儀,加速度計和磁力計產生的原始資料,以產生四元數因此,valuesSensorEvent物件陣列有以下五個元素:

  • 四元數的X,Y,Z和W分量
  • 標題精度

您可以透過使用該類getRotationMatrixFromVector()方法將四元數轉換為旋轉矩陣,即4x4矩陣SensorManager

如果您正在開發OpenGL應用程式,則可以直接使用旋轉矩陣來轉換3D場景中的物件。然而,現在,我們將旋轉矩陣轉換成方向陣列,指定器件沿著Z,X和Y軸的旋轉。為此,我們可以使用該類getOrientation()方法SensorManager

在呼叫該getOrientation()方法之前,必須重新對映旋轉矩陣的座標系。更準確地說,您必須旋轉旋轉矩陣,使新座標系的Z軸與原始座標系的Y軸重合。

預設情況下,orientations陣列包含弧度而不是度數的角度。如果您習慣於弧度,請直接使用它。否則,使用以下程式碼將其所有角度轉換為度數:

您現在可以根據orientations陣列的第三個元素更改活動的背景顏色

如果您現在執行該應用程式,請將手機置於肖像模式,並順時針或逆時針傾斜45度以上,您應該會看到背景顏色的變化。

基於角度的背景顏色變化

在本教程中,您學習瞭如何使用Android的感測器框架來建立可以響應接近感測器和陀螺儀生成的資料的應用程式。您還學習瞭如何使用旋轉向量感測器,這是陀螺儀更受歡迎的替代品。隨意使用感測器的創意方式。請注意,使用低效感測器的應用程式可能會很快耗盡裝置的電池。

要了解有關硬體感測器及其生成的資料的更多資訊,可參考官方感測器API指南並在Envato Tuts +上檢視我們的其他硬體和感測器內容!


原文地址   傳送門

無意中看到這篇文章 感覺很有意思 就學習了下   三種感測器我都整合在了一起 測試的時候最好註釋掉其他兩個 要不會混亂 整個螢幕 五顏六色跳動個不停 原始碼我註釋掉了其他兩個 只留下了距離感測器   其他兩個自行放開

原始碼




相關文章