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) {


		
		
	}
	
	
}
直接在主类里面创建对象  然后在监听里可以实现(播放歌曲、切换图片等功能)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值