Android 重力感應判斷手機的上下左右移動

來源:互聯網
上載者:User

最近項目裡使用到了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軸座標不變。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.