`
George_ghc
  • 浏览: 94946 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
Android 重力感应判断手机的上下左右移动 感应
http://blog.csdn.net/yudajun/article/details/8054919

最近项目里使用到了android中重力感应使用,现分享给大家。
重力感应坐标是相对于设备而言,而不是空间坐标,如图


代码如下;
[html] view plaincopy
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() {  
  
        @Override  
        public void onAccuracyChanged(Sensor sensor, int accuracy) {  
              
        }  
  
        @Override  
        public 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轴坐标不变。
Global site tag (gtag.js) - Google Analytics