public class MainActivity extends Activity
{
// 定義 方向傳感器 和 重力傳感器
private TextView tvOrientation, tvAccelerometer;
// 定義一個傳感器的管理對象
private SensorManager sensorManager;
//定義一個監聽對象
private SensorEventListener sensorEventListener;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvOrientation = (TextView) findViewById(R.id.tvOrientation);
tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer);
// 獲取傳感器的 管理對象
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
//獲取監聽器對象
sensorEventListener = new MySensorEventListener();
}
/**
* 開始一個activity 的階段依次執行3個生命週期的方法: 分別是: onCreate,onStart,onResume方法 方向傳感器:
* Sensor.TYPE_ORIENTATION 加速度(重力)傳感器: Sensor.TYPE_ACCELEROMETER
* 光線傳感器:Sensor.TYPE_LIGHT 磁場傳感器: Sensor.TYPE_MAGNETIC_FIELD
* 距離(臨近性)傳感器:Sensor.TYPE_PROXIMITY 溫度傳感器: Sensor.TYPE_TEMPERATURE
*/
@Override
protected void onResume()
{
super.onResume();
// 獲取傳感器的類型(獲取方向傳感器)
Sensor orientationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//註冊監聽,獲取傳感器變化值
/*上面第三個參數爲採樣率:最快、遊戲、普通、用戶界面。當應用程序請求特定的採樣率時,其實只是對傳感器子系統的一個建議,不保證特定的採樣率可用。
最快: SensorManager.SENSOR_DELAY_FASTEST
最低延遲,一般不是特別敏感的處理不推薦使用,該種模式可能造成手機電力大量消耗,由於傳遞的爲原始數據,算法不處理好將會影響遊戲邏輯和UI的性能。
遊戲: SensorManager.SENSOR_DELAY_GAME
遊戲延遲,一般絕大多數的實時性較高的遊戲都使用該級別。
普通: SensorManager.SENSOR_DELAY_NORMAL
標準延遲,對於一般的益智類或EASY級別的遊戲可以使用,但過低的採樣率可能對一些賽車類遊戲有跳幀現象。
用戶界面: SensorManager.SENSOR_DELAY_UI
一般對於屏幕方向自動旋轉使用,相對節省電能和邏輯處理,一般遊戲開發中我們不使用。*/
sensorManager.registerListener(sensorEventListener, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL);
// 獲取傳感器的類型(獲取方向傳感器)
Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
private class MySensorEventListener implements SensorEventListener
{
@Override
public void onSensorChanged(SensorEvent event)
{
float x
= event.values[SensorManager.DATA_X];
float y
= event.values[SensorManager.DATA_Y];
float z
= event.values[SensorManager.DATA_Z];
switch (event.sensor.getType())
{
case Sensor.TYPE_ACCELEROMETER:
tvAccelerometer.setText("Accelerometer Sensor: " + x + ", " + y + ", " + z);
break;
case Sensor.TYPE_ORIENTATION:
/*x該值表示方位,0代表北(North);90代表東(East);180代表南(South);270代表西(West)
如果x值正好是這4個值之一,並且手機是水平放置,手機的頂部對準的方向就是該值代表的方向。
y值表示傾斜度,或手機翹起的程度。當手機繞着X軸傾斜時該值發生變化。y值的取值範圍是-180≤y值 ≤180。
假設將手機屏幕朝上水平放在桌子上,這時如果桌子是完全水平的,y值應該是0(由於很少有桌子是絕對水平的,
因此,該值很可能不爲0,但一般都是-5和5之間的某個值)。這時從手機頂部開始擡起,
直到將手機沿X軸旋轉180度(屏幕向下水平放在桌面上)。
在這個旋轉過程中,y值會在0到-180之間變化,也就是說,從手機頂部擡起時,y的值會逐漸變小,
直到等於-180。如果從手機底部開始擡起,直到將手機沿X軸旋轉180度,這時y值會在0到180之間變化。
也就是y值會逐漸增大,直到等於180。可以利用y值和z值來測量桌子等物體的傾斜度。
z值表示手機沿着Y軸的滾動角度。表示手機沿着Y軸的滾動角度。取值範圍是-90≤z值≤90。
假設將手機屏幕朝上水平放在桌面上,這時如果桌面是平的,z值應爲0。將手機左側逐漸擡起時,
z值逐漸變小,直到手機垂直於桌面放置,這時z值是-90。將手機右側逐漸擡起時,z值逐漸增大,
直到手機垂直於桌面放置,這時z值是90。在垂直位置時繼續向右或向左滾動,z值會繼續在-90至90之間變化。
*/
tvOrientation.setText("Orientation Sensor: " + x + ", " + y + ", " + z);
break;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
}
@Override
protected void onPause()
{
super.onPause();
//在失去焦點的時候 取消 這個傳感器對象上邊所有的監聽器
sensorManager.unregisterListener(sensorEventListener);
}
}