Android的大部分手機(jī)中都有傳感器,傳感器類型有方向、加速度(重力)、光線、磁場(chǎng)、距離(臨近性)、溫度等。 方向傳感器: Sensor.TYPE_ORIENTATION 加速度(重力)傳感器: Sensor.TYPE_ACCELEROMETER 光線傳感器: Sensor.TYPE_LIGHT 磁場(chǎng)傳感器: Sensor.TYPE_MAGNETIC_FIELD 距離(臨近性)傳感器: Sensor.TYPE_PROXIMITY 溫度傳感器: Sensor.TYPE_TEMPERATURE //獲取某種類型的感應(yīng)器 Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //注冊(cè)監(jiān)聽,獲取傳感器變化值 sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME); 上面第三個(gè)參數(shù)為采樣率:最快、游戲、普通、用戶界面。當(dāng)應(yīng)用程序請(qǐng)求特定的采樣率時(shí),其實(shí)只是對(duì)傳感器子系統(tǒng)的一個(gè)建議,不保證特定的采樣率可用。 最快: SensorManager.SENSOR_DELAY_FASTEST 最低延遲,一般不是特別敏感的處理不推薦使用,該種模式可能造成手機(jī)電力大量消耗,由于傳遞的為原始數(shù)據(jù),算法不處理好將會(huì)影響游戲邏輯和UI的性能。 游戲: SensorManager.SENSOR_DELAY_GAME 游戲延遲,一般絕大多數(shù)的實(shí)時(shí)性較高的游戲都使用該級(jí)別。 普通: SensorManager.SENSOR_DELAY_NORMAL 標(biāo)準(zhǔn)延遲,對(duì)于一般的益智類或EASY級(jí)別的游戲可以使用,但過(guò)低的采樣率可能對(duì)一些賽車類游戲有跳幀現(xiàn)象。 用戶界面: SensorManager.SENSOR_DELAY_UI 一般對(duì)于屏幕方向自動(dòng)旋轉(zhuǎn)使用,相對(duì)節(jié)省電能和邏輯處理,一般游戲開發(fā)中我們不使用。 使用傳感器做應(yīng)用的難點(diǎn)在于獲取數(shù)據(jù)后如何處理,獲得相應(yīng)需要的效果,這里涉及很多數(shù)學(xué)物理的知識(shí)…… 下面使用一個(gè)代碼實(shí)例演示如何獲取方向與加速度的數(shù)據(jù): - <span style="font-family:'Comic Sans MS';font-size:18px;">public class MainActivity extends Activity
- {
- private TextView accelerometerView;
- private TextView orientationView;
- private SensorManager sensorManager;
- private MySensorEventListener sensorEventListener;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- sensorEventListener = new MySensorEventListener();
- accelerometerView = (TextView) this.findViewById(R.id.accelerometerView);
- orientationView = (TextView) this.findViewById(R.id.orientationView);
-
- sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
- }
-
- @Override
- protected void onResume()
- {
-
- Sensor orientationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
- sensorManager.registerListener(sensorEventListener, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL);
-
-
- Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
- sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
- super.onResume();
- }
-
- private final class MySensorEventListener implements SensorEventListener
- {
-
- @Override
- public void onSensorChanged(SensorEvent event)
- {
-
- if(event.sensor.getType()==Sensor.TYPE_ORIENTATION)
- {
- float x = event.values[SensorManager.DATA_X];
- float y = event.values[SensorManager.DATA_Y];
- float z = event.values[SensorManager.DATA_Z];
- orientationView.setText("Orientation: " + x + ", " + y + ", " + z);
- }
-
- else if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER)
- {
- float x = event.values[SensorManager.DATA_X];
- float y = event.values[SensorManager.DATA_Y];
- float z = event.values[SensorManager.DATA_Z];
- accelerometerView.setText("Accelerometer: " + x + ", " + y + ", " + z);
- }
-
- }
-
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy)
- {
- }
- }
-
-
- @Override
- protected void onPause()
- {
- sensorManager.unregisterListener(sensorEventListener);
- super.onPause();
- }
- } </span>
|