加速度传感器
又称加速传感器G-sensor,返回x、y、z三轴加速度值。
该值包括地心重力的影响,单位是m/s^2。
将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81(由于地球固有的重力)。
把手机朝下放在桌面上,z轴为-9.81。
向左倾斜手机,x轴为正值。
向右倾斜手机,x轴为负值。
向上倾斜手机,y轴为负值。
向下倾斜手机,y轴为正值。
Android 加速度传感器的类型是 Sensor.TYPE_ACCELEROMETER
通过 android.hardware.SensorEvent 返回加速传感器值。
加速度传感器广泛应用于手机中,在开发过程中也非常简单(获得值真的非常简单)。如果你想实现某个功能,你仍然需要考虑如何判断)
举个栗子机摇动功能:
这是一个相对简单的判断,获得x,y,z在这三个值之后,判断这三个值。如果你摇手机,这些值肯定会改变。我们设置了一个阈值。当它们的值超过一定数字时,它们会摇晃,这更容易与代码一起理解
实现手机摇动功能
@Override public void onSensorChanged(SensorEvent event) { // 传感器返回的数据 float x=event.values[0]; float y=event.values[1]; float z=event.values[2]; StringBuffer buffer = new StringBuffer(); buffer.append("X方向加速度为:").append(String.format("%.2f", x)).append("\n"); buffer.append("Y方向加速度为:").append(String.format("%.2f", y)).append("\n"); buffer.append("Z方向加速度为:").append(String.format("%.2f", z)).append("\n"); if (x>20||y>20||z>20){ Toast.makeText(AccelerometerActivity.this,"欢迎使用摇晃",Toast.LENGTH_SHORT).show(); } mTvAccelerometer.setText(buffer); }
上面的代码可以看到,通过x,y,z判断手机是否摇晃的价值的变化相对简单这个想法就是这样一个想法。这种判断有缺点。以上判断是xyz无论哪个值超过20,手机都被确定为摇晃,但忽略了一点,即用户可以向一个方向移动手机,最好只判断zy,并且判断的xy必须同时超过20才能确定为摇晃。以下是更改的代码
if (x>20&&y>20){ Toast.makeText(AccelerometerActivity.this,"欢迎使用摇晃",Toast.LENGTH_SHORT).show(); }
抬手亮屏
还有一个比摇一摇更复杂的功能——举手亮屏,也是对的xyz判断,这里不放代码,简单说想法,当我们拿起手机时,加速传感器xyz的值肯定会发生变化,我们可以判断它的结束值,就是手机对着我们的脸的时候传感器的值是个什么样的状态(我低着头对着手机的时候是x:0,y:8,z:5),我们可以在手机200上判断这个值ms当这个值在内部达到时,将被确定为举手亮屏
代码部分
以下是获取加速度传感器和手机摇晃代码的值
public class AccelerometerActivity extends AppCompatActivity implements SensorEventListener { private TextView mTvAccelerometer; private SensorManager sensorManager; private Sensor sensor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_accelerometer); mTvAccelerometer = findViewById(R.id.tv_accelerometer); // 获取传感器管理者的对象 sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 获得加速度传感器对象 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } @Override protected void onResume() { super.onResume(); if (sensorManager!=null){ // 添加监听器 sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI); } } @Override protected void onPause() { super.onPause(); if(sensorManager != null){ //终止注册 sensorManager.unregisterListener(this,sensor); } } @Override public void onSensorChanged(SensorEvent event) { // 传感器返回的数据 float x=event.values[0]; float y=event.values[1]; float z=event.values[2]; StringBuffer buffer = new StringBuffer(); buffer.append("X方向加速度为:").append(String.format("%.2f", x)).append("\n"); buffer.append("Y方向加速度为:").append(String.format("%.2f", y)).append("\n"); buffer.append("Z方向加速度为:").append(String.format("%.2f", z)).append("\n"); if (x>20&&y>20){ Toast.makeText(AccelerometerActivity.this,"欢迎",Toast.LENGTH_SHORT).show(); } mTvAccelerometer.setText(buffer); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }
使用更多手机传感器请看Android中间的传感器(总)