android 加速的傳感器(重力傳感器)

傳感器系統:SensorManager.java:實現傳感器系統核心的管理類SensorManagerSensor.java:單一傳感器的描述性文件SensorSensorEvent.java:表示傳感器系統的事件類SensorEventSensorEventListener.java:傳感器事件的監聽者SensorEventListener接口SensorListener.java:傳感器的監聽者SensorListener接口(不推薦使用)在這裏介紹一下加速度傳感器也就是重力傳感器:

加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數值。

該數值包含地心引力的影響,單位是m/s^2。

將手機平放在桌面上,x軸默認爲0,y軸默認0,z軸默認9.81。

將手機朝下放在桌面上,z軸爲-9.81。

將手機向左傾斜,x軸爲正值。

將手機向右傾斜,x軸爲負值。

將手機向上傾斜,y軸爲負值。

將手機向下傾斜,y軸爲正值。

測試代碼:
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView XT,ZT,YT,ACT;
	private SensorManager sm;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//獲取組件
		XT=(TextView)findViewById(R.id.XT);
		YT = (TextView)findViewById(R.id.YT);
	    ZT = (TextView)findViewById(R.id.ZT);
	   
	    ACT = (TextView)findViewById(R.id.onAccuracyChanged);
	        
	  //創建一個SensorManager來獲取系統的傳感器服務
      sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
      //選取加速度感應器
      int sensorType = Sensor.TYPE_ACCELEROMETER;
        
        /*
         * 註冊事件
         * 參數1 :SensorEventListener監聽器
         * 參數2 :Sensor 一個服務可能有多個Sensor實現,此處調用getDefaultSensor獲取默認的Sensor
         * 參數3 :模式 可選數據變化的刷新頻率
         * */
        sm.registerListener(mySensorListener,sm.getDefaultSensor(sensorType),SensorManager.SENSOR_DELAY_NORMAL);
        

    }
	
	public void onPause(){
		sm.unregisterListener(mySensorListener);
		super.onPause();
	}
	
    /*
     * SensorEventListener接口的實現,需要實現兩個方法
     * 方法1 onSensorChanged 當數據變化的時候被觸發調用
     * 方法2 onAccuracyChanged 當獲得數據的精度發生變化的時候被調用,比如突然無法獲得數據時
     * */
    final SensorEventListener mySensorListener = new SensorEventListener(){
    	
    	//重寫onSensorChanged方法
    	public void onSensorChanged(SensorEvent sensorEvent){
    		if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
    			
    			//圖解中已經解釋三個值的含義
    			float X_lateral = sensorEvent.values[0];
    			float Y_longitudinal = sensorEvent.values[1];
    			float Z_vertical = sensorEvent.values[2];
    			XT.setText("x="+X_lateral);
    			YT.setText("y="+Y_longitudinal);
    			ZT.setText("z="+Z_vertical);
    		}
    	}
    	
    	//重寫onAccuracyChanged方法
    	public void onAccuracyChanged(Sensor sensor , int accuracy){
    		ACT.setText("onAccuracyChanged被觸發");
    	}
    	
    };
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


測試結果:



可以看到x,y,z值的變化,設定一個閥值然後根據搖晃值判斷是否進行功能,就可以達到重力感應實現功能的效果



在這裏補充一個“重力感應類”,可以在程序中直接用的:

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;


public class NewSensor implements SensorEventListener {


	private SensorManager sm;//傳感器管理
	private Sensor sensor;//傳感器
	private Context context;//上下文
	//重力感應監聽器
	private OnShakeListener shakeListener;
	//設置速度閥值
	private final int SPEED_SHRESHOLD = 4000;
	//兩次檢測的時間間隔
	private final int UPTATE_INTERVAL_TIME = 70;
	//上次檢測時間
	private long lastUpdateTime;
	
	public NewSensor(Context c){
		this.context = c;
		start();
	}
	
	//開始檢測
	public void start(){
		//獲取系統傳感器管理
		sm = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
		//獲得重力傳感器
		sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		//註冊
		sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
			
	}
	
	//停止檢測   (用此方法停止對加速度傳感器的使用)
	public void stop(){
		sm.unregisterListener(this);
	}
	
	//搖晃監聽接口
	public interface OnShakeListener {
		public void onShake();
	}
	
	@Override
	public void onSensorChanged(SensorEvent event) {
	
		//現在檢測時間
		long currentUpdateTime = System.currentTimeMillis();
		//兩次檢測的時間間隔
		long timeInterval = currentUpdateTime - lastUpdateTime;  
		//判斷是否達到了檢測時間間隔
		if(timeInterval < UPTATE_INTERVAL_TIME) 
		return;
		//現在的時間變成last時間
		lastUpdateTime = currentUpdateTime;
		
		//獲取座標
		float x = event.values[0];
		float y = event.values[1];
		float z = event.values[2];
		//轉變
		float lastx = x;
		float lasty = y;
		float lastz = z;
		//獲取變化值
		float changex = x-lastx;
		float changey = y-lasty;
		float changez = z-lastz;
		//計算搖晃值
		double speed = Math.sqrt(changex*changex + changey*changey + changez*changez)/timeInterval * 10000;
		
		//判斷是否達到閥值
		if(speed>SPEED_SHRESHOLD){
			shakeListener.onShake();
		}
		
	}
	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {


		
		
	}
	
	
}
直接在主類裏面創建對象  然後在監聽裏可以實現(播放歌曲、切換圖片等功能)

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