Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android動作傳感器

android動作傳感器

編輯:關於Android編程

android動作傳感器

Android平台支持一些用於監視設備動作的傳感器(這樣的傳感器共有5個)。其中兩個(加速傳感器和陀螺儀傳感器)是純的硬件傳感器。另外三個(重力傳感器、線性加速傳感器和旋轉向量傳感器)可能是硬件傳感器,也可能是軟件傳感器。例如,在一些Android設備中,這些基於軟件的傳感器會從加速和磁力傳感器中獲取數據,但在另一些Android設備中也可能從陀螺儀傳感器中獲取數據。也就是說,同一種基於軟件的傳感器在不同的Android設備中回傳的數據可能來自不同的硬件傳感器。所以基於軟件的同一種傳感器在不同的設備中可能精確度、使用范圍有所不同。大多數高端Android設備都會有加速傳感器,還有一些擁有陀螺儀傳感器。

動作傳感器對於監測設備的移動非常有用,例如,傾斜、震動、旋轉和擺動都屬於動作傳感器的監測范圍。設備的移動通常是對用戶輸入的直接反應。例如,用戶正在游戲中飙車,或控制游戲中的一個小球)。除此之外,設備所處的物理環境也會反應在設備的動作上,例如,用戶正常駕駛汽車,而這是Android設備正安靜地躺在旁邊的座椅上,盡管設備沒有移動,但會隨著車的行駛而不斷震動,而且設備也會隨著汽車的移動而移動。
對於第一種情況,可以對設備本身的相對位置進行監測。而對於第二種情況,需要考慮到設備以外的參照系。動作傳感器本身一般並不會用於監測設備的位置,關於設備的位置需要用其他類型的傳感器進行監測,例如,磁場傳感器。

所有的動作傳感器都會返回三個浮點數的值(通過長度為3的數組返回),但對於不同的傳感器,這三個只的意義不同。例如,對於加速傳感器,會返回三個坐標軸的數據。對於陀螺儀傳感器,會返回三個坐標軸的旋轉角速度。

設備從左到右推動,X軸加速度為正值。


設備朝著自己推動,Y軸加速度為正值。


如果朝著天空以A m/s^2的加速度推動,那麼Z軸的加速度為A + 9.81,所以如果計算實際的加速度(抵消重力加速度),需要減9.81。

 

view:

 




    
    
    

java:

 

 

pupublic class MainActivity extends ActionBarActivity  implements SensorEventListener{


    private TextView sensor=null;
    private SensorManager mSensorManager;
    private TextView gravityTV=null;
    private float[] gravity=new float[3];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensor= (TextView) findViewById(R.id.sensor);


        mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);


    }


    @Override
    protected void onResume() {
        super.onResume();


        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),//加速度傳感器,
                SensorManager.SENSOR_DELAY_UI);//SensorManager.SENSOR_DELAY_UI采樣頻率


        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),//重力傳感器,
                SensorManager.SENSOR_DELAY_FASTEST);//SensorManager.SENSOR_DELAY_UI采樣頻率


        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),//鄰近傳感器
                SensorManager.SENSOR_DELAY_UI);
    }


    @Override
    protected void onPause() {
        super.onPause();


        mSensorManager.unregisterListener(this);//卸載所有的傳感器
    }


    //傳感度狀態發生變化
    @Override
    public void onSensorChanged(SensorEvent event) {


        switch (event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER: //加速度傳感器
                //減雜音(干擾)
                final float alpha=(float)0.8;
                gravity[0]=alpha*gravity[0]+(1-alpha)*event.values[0];
                gravity[1]=alpha*gravity[1]+(1-alpha)*event.values[1];
                gravity[2]=alpha*gravity[2 ]+(1-alpha)*event.values[2];


                String accelerometer=String.valueOf("X:"+(event.values[0]-gravity[0])+"\nY:"+
                        (event.values[1]-gravity[1])+"\nZ:"+
                        (event.values[2]-gravity[2]));
                sensor= (TextView) findViewById(R.id.sensor);
                sensor.setText(accelerometer);
                Log.i("X:", String.valueOf((event.values[0] - gravity[0])));
                Log.i("Y:", String.valueOf((event.values[1] - gravity[1])));
                Log.i("Z:", String.valueOf((event.values[2]-gravity[2])));


                break;


            case Sensor.TYPE_GRAVITY:
                gravity[0]=event.values[0];
                gravity[1]=event.values[1];
                gravity[2]=event.values[2];


                gravityTV= (TextView) findViewById(R.id.gravity);
                gravityTV.setText(String.valueOf("gravity[0]="+event.values[0]+
                "\ngravity[1]="+event.values[1]+
                "\ngravity[2]="+event.values[2]));
                break;
            case Sensor.TYPE_PROXIMITY:
                TextView Proximity= (TextView) findViewById(R.id.PROXIMITY1);
                Proximity.setText(String.valueOf(event.values[0]));
                break;




        }
    }


    //精確度發生變化
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {




    }
}


 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved