2025-07-12

在Android中,所有傳感器都要通過SensorMannager來訪問,

然後調用getSystemService(SENSOR_SERVICE)方法得到手機的傳感器管理對象,

onSensorChanged(SensorEvent se)在傳感器值更改時調用,

使用傳感器必須調用registerListener(SensorEventListener listener, Sensor sensor, int rate)方法註冊,

感應器有3個方向float類型的值,x,y,z,取值范圍在-10到10之間,

手機屏幕向上(z軸朝天)水平放置的時侯,x=0,y=0,z=10

手機屏幕向下(z軸朝地)水平放置的時侯,x=0,y=0,z=-10

手機屏幕向左(x軸朝天)的時候,x=10,y=0,z=0

手機豎直(y軸朝天)向上的時候,x=0,y=10,z=0

代碼:
PS:在XML文件中有個TextView,用來顯示重力感應器的值,

[java] public class TestActivity extends Activity { 
    TextView textView; 
    float x,y,z; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        textView=(TextView) findViewById(R.id.textView); 
        //獲得重力感應硬件控制器  
        SensorManager sm=(SensorManager) this.getSystemService(SENSOR_SERVICE); 
        Sensor sensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
        //添加重力感應偵聽,並實現其方法,  
        SensorEventListener sel=new SensorEventListener(){ 
            public void onSensorChanged(SensorEvent se) { 
                x=se.values[SensorManager.DATA_X]; 
                y=se.values[SensorManager.DATA_Y]; 
                z=se.values[SensorManager.DATA_Z]; 
                textView.setText("x="+(int)x+"y="+(int)y+"z="+(int)z); 
            } 
            public void onAccuracyChanged(Sensor arg0, int arg1) { 
            } 
        }; 
        //註冊Listener,SENSOR_DELAY_GAME為檢測的精確度,  
        sm.registerListener(sel, sensor,SensorManager.SENSOR_DELAY_GAME); 
    } 
public class TestActivity extends Activity {
 TextView textView;
 float x,y,z;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView=(TextView) findViewById(R.id.textView);
        //獲得重力感應硬件控制器
        SensorManager sm=(SensorManager) this.getSystemService(SENSOR_SERVICE);
        Sensor sensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        //添加重力感應偵聽,並實現其方法,
        SensorEventListener sel=new SensorEventListener(){
   public void onSensorChanged(SensorEvent se) {
    x=se.values[SensorManager.DATA_X];
    y=se.values[SensorManager.DATA_Y];
    z=se.values[SensorManager.DATA_Z];
    textView.setText("x="+(int)x+"y="+(int)y+"z="+(int)z);
   }
   public void onAccuracyChanged(Sensor arg0, int arg1) {
   }
        };
        //註冊Listener,SENSOR_DELAY_GAME為檢測的精確度,
        sm.registerListener(sel, sensor,SensorManager.SENSOR_DELAY_GAME);
    }
當然,也可以用SensorEventListener接口來實現,

感應器在模擬器中是不能測試的,下面是真機測試效果,

  

摘自  柒尐狐的專欄 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *