Android項目——傳感器的使用


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個生命週期的方法: 分別是: onCreateonStartonResume方法 方向傳感器:

     * 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,但一般都是-55之間的某個值)。這時從手機頂部開始擡起,

                直到將手機沿X軸旋轉180度(屏幕向下水平放在桌面上)。

              在這個旋轉過程中,y值會在0-180之間變化,也就是說,從手機頂部擡起時,y的值會逐漸變小,

              直到等於-180。如果從手機底部開始擡起,直到將手機沿X軸旋轉180度,這時y值會在0180之間變化。

              也就是y值會逐漸增大,直到等於180。可以利用y值和z值來測量桌子等物體的傾斜度。

                        

              z值表示手機沿着Y軸的滾動角度。表示手機沿着Y軸的滾動角度。取值範圍是-90≤z≤90

              假設將手機屏幕朝上水平放在桌面上,這時如果桌面是平的,z值應爲0。將手機左側逐漸擡起時,

              z值逐漸變小,直到手機垂直於桌面放置,這時z值是-90。將手機右側逐漸擡起時,z值逐漸增大,

              直到手機垂直於桌面放置,這時z值是90。在垂直位置時繼續向右或向左滾動,z值會繼續在-9090之間變化。

              */

              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);

    }

 

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章