爲什麼總是期望用戶點擊觸摸屏上的按鈕?通過使用中端Android手機上可用的一些硬件傳感器,您可以創建提供更加吸引人的用戶體驗的應用程序。
傳感器框架是Android SDK的一部分,它允許您以簡單和一致的方式從大多數傳感器(無論是硬件還是軟件)讀取原始數據。在本教程中,我將向您展示如何使用框架從兩個非常常見的傳感器讀取數據:接近和陀螺儀。我還將向您介紹旋轉矢量傳感器,一種複合傳感器,在大多數情況下,它可以作爲陀螺儀更簡單,更準確的替代方案。
您可以閱讀以下教程,瞭解Android的硬件傳感器:
先決條件
要跟隨,您將需要以下內容:
- 具有接近傳感器和陀螺儀的Android設備
- 最新版本的Android Studio
1.項目設置
如果您的應用程序在不需要所有硬件傳感器的設備上無法使用,則不能在此類設備上安裝。您可以通過在<uses-feature>
Android
Studio項目的清單文件中添加一個或多個標籤來讓Google Play和其他應用程式市場瞭解應用程式的硬體要求。
我們將在本教程中創建的應用程序將不適用於缺少接近傳感器和陀螺儀的設備。因此,將以下行添加到清單文件中:
1
2
3
4
五
6
|
< uses-feature android:name = "android.hardware.sensor.proximity" android:required = "true" /> < uses-feature android:name = "android.hardware.sensor.gyroscope" android:required = "true" /> |
但是請注意,<uses-feature>
如果用戶使用其APK文件手動安裝應用程序,則該標籤無法幫助,則在使用傳感器之前,仍必須以編程方式檢查傳感器是否可用。
2.使用接近傳感器
爲了避免意外的觸摸事件,您的手機的觸摸屏在通話期間會變黑,當它非常接近您的耳朵時。曾經想過你的手機如何確定它是否接近你的耳朵?那麼它使用接近傳感器,這是一個硬件傳感器,可以判斷物體是否接近它。一些接近傳感器也可以告訴物體有多遠,儘管它們的最大範圍通常只有約5釐米。
現在讓我們創建一個活動,其背景顏色在每次將您的手懸停在設備的接近傳感器上時變爲紅色。
步驟1:獲取接近傳感器
要訪問任何硬件傳感器,您需要一個SensorManager
對象。要創建它,請使用getSystemService()
您的Activity
類的方法並將SENSOR_SERVICE
常量傳遞給它。
// 取傳感器 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
|
您現在可以Sensor
通過調用該getDefaultSensor()
方法並將TYPE_PROXIMITY
常量傳遞給它來爲接近傳感器創建一個對象。
1
2
|
proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
|
在繼續之前,始終確保Sensor
對象不是null
。如果是,則表示接近傳感器不可用。
1
2
3
4
|
if (proximitySensor == null) { Toast.makeText(this, "接近傳感器不可用", Toast.LENGTH_LONG).show(); finish(); // Close app }
|
步驟2:註冊聽衆
爲了能夠讀取傳感器生成的原始數據,您必須SensorEventListener
通過調用對象的registerListener()
方法來與它相關聯SensorManager
。在執行此操作時,您還必須指定從傳感器讀取數據的頻率。
以下代碼註冊一個監聽器,您可以每兩秒讀取一次接近傳感器的數據:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
// Create listener 創建監聽器 proximitySensorListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent sensorEvent) { // More code goes here if(sensorEvent.values[0] < proximitySensor.getMaximumRange()) { // Detected something nearby 檢測到附近的東西 getWindow().getDecorView().setBackgroundColor(Color.RED); } else { // Nothing is nearby 附近沒什麼 getWindow().getDecorView().setBackgroundColor(Color.GREEN); } } @Override public void onAccuracyChanged(Sensor sensor, int i) { } }; // Register it, specifying the polling interval in 註冊,指定輪詢間隔 // microseconds 微秒 sensorManager.registerListener(proximitySensorListener, proximitySensor, 2 * 1000 * 1000);
|
我建議您始終在onResume()
活動的方法內註冊該監聽器,並在方法內取消註冊onPause()
。以下是註銷偵聽器的方法:
1
|
sensorManager.unregisterListener(proximitySensorListener); |
步驟3:使用原始數據
該SensorEvent
方法中可用的對象onSensorChanged()
具有包含values
相關傳感器生成的所有原始數據的數組。在接近傳感器的情況下,陣列包含指定傳感器和附近物體之間距離(釐米)的單個值。
如果該值等於傳感器的最大範圍,則可以安全地假定附近沒有。相反,如果它小於最大範圍,則意味着附近有些東西。您可以使用getMaximumRange()
相關Sensor
對象的方法確定任何硬件傳感器的最大範圍。
要根據接近傳感器的數據實際更改活動的背景顏色,可以使用setBackgroundColor()
頂級窗口的裝飾視圖的方法。
因此,onSensorChanged()
在上一步中創建的方法中添加以下代碼:
1
2
3
4
五
6
7
|
// More code goes here if(sensorEvent.values[0] < proximitySensor.getMaximumRange()) { // Detected something nearby 檢測到附近的東西 getWindow().getDecorView().setBackgroundColor(Color.RED); } else { // Nothing is nearby 附近沒什麼 getWindow().getDecorView().setBackgroundColor(Color.GREEN); }
|
如果您現在運行該應用程序並將手懸停在手機的頂部邊緣,則應該會看到屏幕變紅。
3.使用陀螺儀
陀螺儀允許您在任何給定時刻確定Android設備的角速度。簡單來說,它告訴您設備繞X,Y和Z軸旋轉的速度有多快。最近,即使是預算手機正在製造,陀螺儀內置,增強現實和虛擬現實應用程序變得如此受歡迎。
通過使用陀螺儀,您可以開發可以響應設備方向的微小更改的應用程序。要了解如何,現在讓我們創建一個活動,其背景顏色每次沿Z軸沿逆時針方向旋轉手機時,藍色變爲藍色,否則爲黃色。
步驟1:獲取陀螺儀
要創建Sensor
陀螺儀的對象,所有您需要做的是將TYPE_GYROSCOPE
常量傳遞給對象的getDefaultSensor()
方法SensorManager
。
1
2
|
// 獲取陀螺儀 gyroscopeSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
|
步驟2:註冊聽衆
創建陀螺儀傳感器的監聽器與爲接近傳感器創建偵聽器沒有什麼不同。但是,註冊時,您必須確保其採樣頻率非常高。因此,我建議您使用SENSOR_DELAY_NORMAL
常量,而不是以微秒爲單位指定輪詢間隔。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
//
Create a listener gyroscopeSensorListener
= new SensorEventListener()
{ @Override public void onSensorChanged(SensorEvent
sensorEvent) { //
More code goes here } @Override public void onAccuracyChanged(Sensor
sensor, int i)
{ } };
// Register the listener 註冊聽衆 sensorManager.registerListener(gyroscopeSensorListener, gyroscopeSensor, SensorManager.SENSOR_DELAY_NORMAL);
|
步驟3:使用原始數據
陀螺傳感器的原始數據由三個float
值組成 ,指定器件沿X,Y和Z軸的角速度。每個值的單位是每秒弧度。在沿着任何軸的逆時針旋轉的情況下,與該軸相關聯的值將爲正。在順時針旋轉的情況下,它將爲負。
因爲我們目前只對沿着Z軸的旋轉感興趣,所以我們將只使用對象values
數組中的第三個元素SensorEvent
。如果超過0.5f
,我們可以在很大程度上確保旋轉是逆時針旋轉的,並將背景顏色設置爲藍色。類似地,如果它小於-0.5f
,我們可以將背景顏色設置爲黃色。
1
2
3
4
五
|
// More code goes here if (sensorEvent.values[2] > 0.5f) { // anticlockwise getWindow().getDecorView().setBackgroundColor(Color.BLUE); } else if (sensorEvent.values[2] < -0.5f) { // clockwise getWindow().getDecorView().setBackgroundColor(Color.YELLOW); }
|
如果您現在運行該應用程序,請將手機置於縱向模式,然後將其向左傾斜,您應該看到活動變爲藍色。如果傾斜方向相反,則應變黃。
但是,如果您將手機轉到太多,屏幕方向將變爲橫向,您的活動將重新啓動。爲了避免這種情況,我建議您在清單文件中設置screenOrientation
活動portrait
。
1
2
3
4
|
<activity android:name= ".GyroscopeActivity" android:screenOrientation= "portrait" > </activity> |
4.使用旋轉矢量傳感器
大多數開發者今天都喜歡軟件,複合傳感器超過硬件傳感器 軟件傳感器結合了來自多個硬件傳感器的低級原始數據,生成不僅易於使用的新數據,而且更準確。接近傳感器沒有替代軟件。然而,陀螺儀具有兩個:遊戲旋轉矢量傳感器和旋轉矢量傳感器。在本教程中,我們將僅關注後者。
在上一步的例子中,我們每次沿着Z軸的角速度順時針或逆時針方向大於0.5rad / s時,改變了活動的背景顏色。然而,使用角速度並不直觀。此外,我們不知道設備在旋轉之前或之後的實際角度。
通過使用旋轉矢量傳感器,讓我們現在創建一個活動,其背景顏色只有在旋轉了特定角度時纔會改變。例如,我們可以將其沿着Z軸的旋轉度大於45°時變爲黃色,當其旋轉在-10°和10°之間時爲白色,當旋轉小於-45°時,它們爲藍色。
步驟1:設置旋轉矢量傳感器
要獲取旋轉矢量傳感器,必須將TYPE_ROTATION_VECTOR
常量傳遞給對象的getDefaultSensor()
方法SensorManager
。
1
2
|
// 獲取旋轉矢量傳感器 rotationVectorSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
|
使用軟件傳感器與使用硬件傳感器沒有什麼不同。因此,您必須將偵聽器與旋轉矢量傳感器相關聯才能讀取其數據。您可以再次使用SENSOR_DELAY_NORMAL
常量進行輪詢間隔。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
//
Create a listener rvListener
= new SensorEventListener()
{ @Override public void onSensorChanged(SensorEvent
sensorEvent) { //
More code goes here } @Override public void onAccuracyChanged(Sensor
sensor, int i)
{ } }; // Register it sensorManager.registerListener(rvListener, rotationVectorSensor, SensorManager.SENSOR_DELAY_NORMAL); |
步驟2:使用數據
旋轉矢量傳感器組合由陀螺儀,加速度計和磁力計產生的原始數據,以產生四元數。因此,values
其SensorEvent
對象的數組有以下五個元素:
- 四元數的X,Y,Z和W分量
- 標題精度
您可以通過使用該類的getRotationMatrixFromVector()
方法將四元數轉換爲旋轉矩陣,即4x4矩陣SensorManager
。
1
2
3
|
float[] rotationMatrix = new float[16]; SensorManager.getRotationMatrixFromVector( rotationMatrix, sensorEvent.values);
|
如果您正在開發OpenGL應用程序,則可以直接使用旋轉矩陣來轉換3D場景中的對象。然而,現在,我們將旋轉矩陣轉換成方向陣列,指定器件沿着Z,X和Y軸的旋轉。爲此,我們可以使用該類的getOrientation()
方法SensorManager
。
在調用該getOrientation()
方法之前,必須重新映射旋轉矩陣的座標系。更準確地說,您必須旋轉旋轉矩陣,使新座標系的Z軸與原始座標系的Y軸重合。
01
02
03
04
05
06
07
08
09
10
|
// Remap coordinate system float[] remappedRotationMatrix = new float[16]; SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remappedRotationMatrix); // Convert to orientations float[] orientations = new float[3]; SensorManager.getOrientation(remappedRotationMatrix, orientations);
|
默認情況下,orientations
數組包含弧度而不是度數的角度。如果您習慣於弧度,請直接使用它。否則,使用以下代碼將其所有角度轉換爲度數:
1
2
3
|
for(int i = 0; i < 3; i++) { orientations[i] = (float)(Math.toDegrees(orientations[i])); }
|
您現在可以根據orientations
數組的第三個元素更改活動的背景顏色。
1
2
3
4
五
6
7
|
if(orientations[2] > 45) { getWindow().getDecorView().setBackgroundColor(Color.YELLOW); } else if(orientations[2] < -45) { getWindow().getDecorView().setBackgroundColor(Color.BLUE); } else if(Math.abs(orientations[2]) < 10) { getWindow().getDecorView().setBackgroundColor(Color.WHITE); }
|
如果您現在運行該應用程序,請將手機置於肖像模式,並順時針或逆時針傾斜45度以上,您應該會看到背景顏色的變化。
結論
在本教程中,您學習瞭如何使用Android的傳感器框架來創建可以響應接近傳感器和陀螺儀生成的數據的應用程序。您還學習瞭如何使用旋轉矢量傳感器,這是陀螺儀更受歡迎的替代品。隨意使用傳感器的創意方式。請注意,使用低效傳感器的應用程序可能會很快耗盡設備的電池。
要了解有關硬件傳感器及其生成的數據的更多信息,可參考官方傳感器API指南。並在Envato Tuts +上查看我們的其他硬件和傳感器內容!
原文地址 傳送門
無意中看到這篇文章 感覺很有意思 就學習了下 三種傳感器我都集成在了一起 測試的時候最好註釋掉其他兩個 要不會混亂 整個屏幕 五顏六色跳動個不停 源碼我註釋掉了其他兩個 只留下了距離傳感器 其他兩個自行放開