传感器
注:这里都是用的真机调试
根据生命周期,在onResume()中启用传感器,在onPause()中注销注册,
先设置传感器管理器 SensorManager,再在 onResume() 其中添加各个传感器 sensor 并监听,然后在onSensorChanged(SensorEvent event)方法中读取数据,最后还要在 onPause()(onStop())中注销注册。
MainActivity.java
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager sensorManager;
private Sensor sensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//传感器管理器
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_PROXIMITY:
System.out.println(event.values[0]);
break;
case Sensor.TYPE_ACCELEROMETER:
System.out.format("x=%f,y=%f,z=%f\n", event.values[0], event.values[1], event.values[2]);
break;
case Sensor.TYPE_ORIENTATION:
System.out.format("value:%f\n", event.values[0]);
break;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
//距离传感器
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
//传感器监听器
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
//加速度传感器
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
//指南针传感器
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sensorManager.registerListener(this, sensor, sensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
//注销注册
sensorManager.unregisterListener(this);
}
}
具体代码点击
指南针的实现
效果图
这里就是添加了一张图片,使用 RotateAnimation 来根据传感器数据来做相应的旋转,
MainActivity.java
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private ImageView imageView;
private SensorManager sensorManager;
private Sensor sensor;
private float degrees, preDegree = 0f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//传感器管理器
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
imageView = (ImageView) findViewById(R.id.imageView);
}
@Override
protected void onResume() {
super.onResume();
//指南针传感器
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
sensorManager.registerListener(this, sensor, sensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ORIENTATION:
degrees = -event.values[0];//读取度数
//在屏幕上显示,若变化大于5度就显示变化
if (Math.abs(degrees - preDegree) > 5) {
RotateAnimation ra = new RotateAnimation(preDegree, degrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
ra.setDuration(200);
ra.setFillAfter(true);//保持在这里
imageView.startAnimation(ra);
preDegree = degrees;//下次的初始数据
}
break;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
protected void onPause() {
super.onPause();
//注销注册
sensorManager.unregisterListener(this);
}
}
具体代码点击