加速度传感器(Accelerometer sensor)

Android-传感器-加速度传感器(Accelerometer sensor)-编程之家

1.加速度传感器,用于检测手机运动状态。
2.同方向传感器一样,加速度传感器也有X,Y,Z三个轴
3,加速度传感器也叫G-sensor,返回X,Y,Z,三轴的加速度数值。该数值包含地心引力的影响,单位是m/s2
4.将手机平放在桌面上,X轴默认是0,Y轴默认是0,Z轴默认是9.81;手机朝下,Z轴相反,其他不变。
5.手机向左倾斜,X轴为正,向右,为负
6,向上倾斜,为负,向下倾斜,为正值

简单例子

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="${relativePackage}.${activityClass}"android:orientation="vertical"><TextViewandroid:id="@+id/tv1"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="40sp"android:background="#ffff00"/><Button android:id="@+id/btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击按钮"/></LinearLayout>

java文件

public class JiaSuDuActivity extends Activity implements SensorEventListener,OnClickListener {//创建一个传感器管理器private SensorManager sensorManager;//创建加速度传感器private Sensor mSensorAccelerometer; //创建文本组件private TextView tv1;//创建按钮组件private Button btn;//计数private int cont = 0;//原始值private double oldV = 0;//上次值private double lstV = 0;//当前值private double curV = 0;//是否处于摇晃状态private boolean motiveState = true;//标记是否在记录private boolean processState = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_jia_su_du);//获取传感器管理器sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//获取加速度传感器Sensor. TYPE_ACCELEROMETERmSensorAccelerometer = sensorManager.getDefaultSensor(Sensor. TYPE_ACCELEROMETER);//设置传感器监听事件sensorManager.registerListener((SensorEventListener) this, mSensorAccelerometer,  SensorManager.SENSOR_DELAY_UI);//绑定文本组件tv1=(TextView) findViewById(R.id.tv1);//绑定按钮组件btn=(Button) findViewById(R.id.btn);btn.setOnClickListener(this);	}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubcont = 0;     //单击按钮后初始化tv1.setText("睡觉中~~~~~");if(processState == true){btn.setText("开始");processState= false;     //开始计数}else {btn.setText("停止");processState= true;     }}//向量求模public double magnitude(float x, float y, float z) {double magnitude = 0;//初始化值magnitude = Math.sqrt(x * x + y * y + z * z);return magnitude;}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubdouble range = 5;                //设置一个摇摆幅度float[] value = event.values;    //获取坐标值数组curV = magnitude(value[0], value[1], value[2]);   //计算当前的模//向上加速的状态if(motiveState == true){//判断抬起--当前值大于上次值if(curV >= lstV){lstV = curV;}else{//检测到一次峰值if(Math.abs(curV - lstV) > range){ //当前值-上次值 > range(上边定义的摆动幅度)oldV = curV;    //把当前值赋给原始值motiveState = false;}}		}//向下加速状态if(motiveState == false){//判断落下--当前值小于上次值if(curV <= lstV){lstV = curV;}else{//检测到一次峰值if(Math.abs(curV - lstV) > range){ //当前值-上次值 > range(上边定义的摆动幅度)oldV = curV;    //把当前值赋给原始值if(processState == true){cont++;    //计数+1}motiveState = true;}}		}
//判断摇摆次数做出相应的提示if(cont>0 && cont <5){tv1.setText("1你在摇手机吗?");}else if (cont>5 && cont <10) {tv1.setText("2你还在摇?");}else if (cont>10 && cont <15) {tv1.setText("3让爷爷再谁一觉");}else if (cont > 15) {tv1.setText("4没完了,干死你");finish();                //推出本活动}//显示信息         
//为了不会一直显示(加if语句限制)		Toast.makeText(JiaSuDuActivity.this, "值"+ value[0]+"    "+value[1]+"     "+value[2],  Toast.LENGTH_SHORT).show();}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub		}
}

效果:::
Android-传感器-加速度传感器(Accelerometer sensor)-编程之家