最近項目裡使用到了android中重力感應使用,現分享給大家。
重力感應座標是相對於裝置而言,而不是空間座標,
代碼如下;
package com.pioneersoft.temp;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.util.Log;import android.widget.Toast;public class TempActivity extends Activity { //搖晃速度臨界值 private static final int SPEED_SHRESHOLD = 600; //兩次檢測的時間間隔 private static final int UPTATE_INTERVAL_TIME = 200; //上次檢測時間 private long lastUpdateTime; private SensorManager sensorMag; private Sensor gravitySensor; //儲存上一次記錄 float lastX = 0; float lastY = 0; float lastZ = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initGravitySensor(); } /** * 初始化感應器 */ private void initGravitySensor(){ sensorMag=(SensorManager)getSystemService(Context.SENSOR_SERVICE); gravitySensor = sensorMag.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } @Override protected void onPause() { sensorMag.unregisterListener(sensorLis); super.onPause(); } @Override protected void onResume() { sensorMag.registerListener(sensorLis, gravitySensor, SensorManager.SENSOR_DELAY_UI); super.onResume(); } float tMax=1.0f; private SensorEventListener sensorLis = new SensorEventListener() {@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}@Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) { return; } //現在檢測時間 long currentUpdateTime = System.currentTimeMillis(); //兩次檢測的時間間隔 long timeInterval = currentUpdateTime - lastUpdateTime; //判斷是否達到了檢測時間間隔 if(timeInterval < UPTATE_INTERVAL_TIME) return; //現在的時間變成last時間 lastUpdateTime = currentUpdateTime; //擷取加速度數值,以下三個值為重力分量在裝置座標的分量大小 float x = event.values[SensorManager.DATA_X]; float y = event.values[SensorManager.DATA_Y]; float z = event.values[SensorManager.DATA_Z]; // Log.e("msg", "x= "+x+" y= "+y); // Log.e("msg", "x= "+x+" y= "+y+" z= "+z); float absx = Math.abs(x); float absy = Math.abs(y); float absz = Math.abs(z); if (absx > absy && absx > absz) {if (x > tMax) {Log.e("origen", "turn left");} else if(x<-tMax){Log.e("origen", "turn right");}}else if (absy > absx && absy > absz) {if (y > tMax) {Log.e("origen", "turn up");} else if(y<-tMax){Log.e("origen", "turn down");}}else if (absz > absx && absz > absy) {if (z > 0) {Log.e("origen", "screen up");} else {Log.e("origen", "screen down");}} else {Log.e("origen", "unknow action");} //獲得x,y,z的變化值 float deltaX = x - lastX; float deltaY = y - lastY; float deltaZ = z - lastZ; //備份本次座標 lastX = x; lastY = y; lastZ = z; //計算移動速度 double speed = Math.sqrt(deltaX*deltaX + deltaY*deltaY + deltaZ*deltaZ)/timeInterval * 10000; // Log.e("msg", "speed= "+speed); if(speed >= SPEED_SHRESHOLD) Toast.makeText(TempActivity.this, "onshake", 200).show(); } }; }
需要注意的是,對手機的移動操作實現對於手機螢幕朝向為標準,例如手機螢幕向左,此時認為手機向左移動。
以上是手機為縱向螢幕時的座標,如果當前手機是橫向螢幕: x>0 說明當前手機下翻 x<0上翻 y>0 說明當前手機右翻 y<0左翻 z軸座標不變。