1、加速度传感器Accelerometer
加速度传感器主要感应手机的运动,在注册了传感器监听器后加速度传感器主要捕获3个参数values[0]、values[1]、values[2]。
values[0]:空间坐标系中x轴方向上的加速度减去重力加速度减去中立加速度在x轴上的分量。
values[1]:空间坐标系中x轴方向上的加速度减去重力加速度减去中立加速度在y轴上的分量。
values[2]:空间坐标系中x轴方向上的加速度减去重力加速度减去中立加速度在z轴上的分量。
上述3个数据的单位均为米每二次方秒。
距离说明:
当手机平放到桌面静止时,加速度为重力加速度g,通过0减去-g(重力加速度g方向为z轴反方向,故为负值)得到values[2]为g。
如果把手机水平方向右推,此时手机x方向上的加速度为正,即values[0]为正。
当把手机以a米每二次方秒的加速度竖值向上举时,values[2]的返回值为(a+g)米每二次方秒,通过a减去-g得到。
2、 方向传感器Orientation
方向传感器主要感应手机方位的变化,其每次读取的都是静态的状态值,在注册了传感器监听器后方向传感器主要捕获3个参数values[0]、values[1]、values[2],关于三个角度的说明如下:
第一个角度:表示手机顶部朝向与正北方向的夹角。当手机绕着Z轴旋转时,该角度值发生改变。
第二个角度:表示手机顶部或尾部翘起的角度,当手机绕着X轴倾斜时,该角度值发生变化。
第三个角度:表示手机左侧或右侧翘起的角度。当手机绕着Y轴倾斜时,该角度值发生变化。
3、磁场传感器Magnetic Field
磁场传感器主要用于感应周围的磁感应强度。即使周围没有任何直接的磁场,手机设备也始终会处于地球磁场中。随着手机状态设备摆放状态的改变,周围磁场在手机的X、Y、Z方向上的会发生改变。
磁场传感器传感器会返回三个数据,三个数据分别代表周围磁场分解到X、Y、Z三个方向上的磁场分量。磁场数据的单位是微特斯拉(uT)。
4、光传感器Light
光传感器用于感应周围的光强,注册监听器后只捕获一个参数:values[0]。该参数代表周围的光照强度,单位为勒克斯(lux)。
5、温度传感器Temperature
温度传感器用于获取手机设备所处环境的温度。温度传感器会返回一个数据,该数据代表手机设备周围的温度,单位是摄氏度。
6、压力传感器 Pressure
压力传感器用于获取手机设备所处环境的压力的大小。压力传感器会返回一个数据,代表手机设备周围的压力大小。
------------------------------------------------------------------------------------------------------------------------------------------
关于手机传感器的介绍,我就不多讲了,具体你们可以去网上搜一搜就知道了,
其他话就不多说,直接切入正题了,先给大家看看程序运行后的效果图吧:
具体代码实现如下了:
主布局文件就不贴出来了,太简单了,是不是?
<<<如果想要main_activity.xml的代码,可以去文章最下面的github链接里下载回来就可以了>>>
MainActivity.java关键代码入下:
package com.yaowen.sensorbigtest; //............这里省略了n行代码 public class MainActivity extends AppCompatActivity implements SensorEventListener { //............这里省略了n行代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化UI控件 //............这里省略了n行代码 // 获取真机的传感器管理服务 // sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 获取传感器模拟器的传感器管理服务 sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); } @Override protected void onResume() { super.onResume(); // 为系统的方向传感器注册监听器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME); // 为系统的磁场传感器注册监听器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_GAME); // 为系统的温度传感器注册监听器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE), //sensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE), SensorManager.SENSOR_DELAY_GAME); // 为系统的光传感器注册监听器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_GAME); // 为系统的压力传感器注册监听器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE), SensorManager.SENSOR_DELAY_GAME); } //............这里省略了n行代码 @Override protected void onDestroy() { // 程序销毁时取消注册传感器监听器 sensorManager.unregisterListener(this); super.onDestroy(); } @Override public void onSensorChanged(SensorEvent event) { float[] values = event.values; // // 真机上获取触发event的传感器类型 // Sensor sensorType = event.sensor; // 模拟器上获取触发event的传感器类型 Sensor sensorType = event.sensor; StringBuilder sb = null; sb = new StringBuilder(); // 判断是哪个传感器发生改变 //方向传感器 if (sensorType == sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION)) { sb.append("绕Z轴转过的角度:"); sb.append(values[0]); sb.append("绕X轴转过的角度:"); sb.append(values[1]); sb.append("绕Y轴转过的角度:"); sb.append(values[2]); etOrientation.setText(sb.toString()); } //光照传感器 if (sensorType == sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)) { sb.append("当前光的强度为:"); sb.append(values[0]); etLight.setText(sb.toString()); } //磁场传感器 if (sensorType == sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)) { sb.append("X方向上的角度:"); sb.append(values[0]); sb.append("Y方向上的角度:"); sb.append(values[1]); sb.append("Z方向上的角度:"); sb.append(values[2]); etMagnetic.setText(sb.toString()); } //温度传感器 if (sensorType == sensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE)) { sb.append("当前温度为:"); sb.append(values[0]); etTemerature.setText(sb.toString()); } //压力传感器 if (sensorType == sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE)) { sb.append("当前压力为:"); sb.append(values[0]); etPressure.setText(sb.toString()); } } //............这里省略了n行代码 }
代码就这么多,已经贴完了。大家可以试试看咯。
github源代码如下:https://github.com/yaowen613/SensorBigTest.git