简单地创建一个光传感器
public class MainActivity extends Activity {
private SensorManager sensormanager;
private SensorEventListener sensorevent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
传感器的创建
1、先创建传感器管理器,管理所有传感器
2、传入参数,指定特定传感器
3、注册
4、结束,注销传感器
*/
// 1、获取传感器管理服务对象
sensormanager = (SensorManager) getSystemService(SENSOR_SERVICE);
// 2、特定传观器对象获取: 光传感器
Sensor lightsensor = sensormanager.getDefaultSensor(Sensor.TYPE_LIGHT);
// 3、注册监听器,来实时的更改操作
//监听器:精确度更改会立即执行onSensorChanged方法
sensorevent = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
sensormanager.registerListener(sensorevent, lightsensor,SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onDestroy() {
super.onDestroy();
sensormanager.unregisterListener(sensorevent);
Log.e("传感器", "注销");
}
}
速度传感器
- 不一样的地方
Sensor lightsensor = sensormanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
-
设备返回的数据:XYZ座标轴返回的加速度
Y轴总是9.8左右,代表地球引力作用下的加速度 - 举个栗子: 微信摇一摇
手机平放,力作用在Z轴;长边贴地立起,作用在X轴;短边贴地,作用在y轴
根据上边补充的代码
sensorevent = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
//手机竖放,作用在Y轴,来回摇摆让x轴受力
if (x > 15 && y > 15){
//正在微信摇一摇
}
}
方向传感器--简易指南针
Sensor.TYPE_ORIENTATION类型已经废弃,推荐使用加速度+磁力传感器
- 简单获取方向传感器
一个监听器来监听多个传感器
public class MainActivity extends Activity {
private SensorManager sensormanager;
private SensorEventListener listener;
private TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
传感器的创建
1、先创建传感器管理器,管理所有传感器
2、传入参数,指定特定传感器
3、注册
4、结束,注销传感器
*/
// 1、获取传感器管理服务对象
sensormanager = (SensorManager) getSystemService(SENSOR_SERVICE);
// 2、特定传观器对象获取: 方向传感器
Sensor accelerometersensor = sensormanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor magneticsensor = sensormanager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
// 3、注册监听器,来实时的更改操作
//监听器:精确度更改会立即执行onSensorChanged方法
listener = new SensorEventListener() {
private float[] accelerometer = new float[3];
private float[] magnetic = new float[3];
@Override
public void onSensorChanged(SensorEvent event) {
//判断当前是什么传感器
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
//使用clone来取值
accelerometer = event.values.clone();
}else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
magnetic = event.values.clone();
}
float[] R = new float[9];
float[] values = new float[3];
if (accelerometer.length != 0 && magnetic.length != 0) {
//根据传输的数据,计算转动角度,将结果放进长度为9的数组中
sensormanager.getRotationMatrix(R, null, accelerometer, magnetic);
//根据上面计算出的旋转矩阵R,在计算旋转角度,存进values中
sensormanager.getOrientation(R, values);
//弧度转换成角度
Math.toDegrees(values[0]);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
//更新速率:提到游戏的规格上
sensormanager.registerListener(listener, magneticsensor,SensorManager.SENSOR_DELAY_GAME);
sensormanager.registerListener(listener, accelerometersensor, SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onDestroy() {
super.onDestroy();
sensormanager.unregisterListener(listener);
Log.e("传感器", "注销");
}
}
- 粗糙版指南针
activity_layout.xml
展示指针和罗盘
<ImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:id="@+id/compass"
android:src="@drawable/compass"
android:layout_marginTop="25dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<ImageView
android:layout_width="96dp"
android:layout_height="wrap_content"
android:id="@+id/arrow"
android:src="@drawable/arrow"
android:layout_marginTop="53dp"
android:layout_alignTop="@+id/compass"
android:layout_centerHorizontal="true" />
MainActivity.java
public class MainActivity extends Activity {
private SensorManager sensormanager;
private SensorEventListener listener;
private ImageView arrow;
private float lastRotateDegree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arrow = (ImageView)findViewById(R.id.arrow);
/*
传感器的创建
1、先创建传感器管理器,管理所有传感器
2、传入参数,指定特定传感器
3、注册
4、结束,注销传感器
*/
// 1、获取传感器管理服务对象
sensormanager = (SensorManager) getSystemService(SENSOR_SERVICE);
// 2、特定传观器对象获取: 方向传感器
Sensor accelerometersensor = sensormanager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Sensor magneticsensor = sensormanager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
// 3、注册监听器,来实时的更改操作
//监听器:精确度更改会立即执行onSensorChanged方法
listener = new SensorEventListener() {
private float[] accelerometer = new float[3];
private float[] magnetic = new float[3];
@Override
public void onSensorChanged(SensorEvent event) {
//判断当前是什么传感器
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
//使用clone来取值
accelerometer = event.values.clone();
}else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
magnetic = event.values.clone();
}
float[] R = new float[9];
float[] values = new float[3];
if (accelerometer.length != 0 && magnetic.length != 0) {
//根据传输的数据,计算转动角度,将结果放进长度为9的数组中
sensormanager.getRotationMatrix(R, null, accelerometer, magnetic);
//根据上面计算出的旋转矩阵R,在计算旋转角度,存进values中
sensormanager.getOrientation(R, values);
//弧度转换成角度
Log.e("角度", String.valueOf(Math.toDegrees(values[0])));
float angle = (float) Math.toDegrees(values[0]);
//配置转动参数
RotateAnimation animate = new RotateAnimation(lastRotateDegree, angle, RELATIVE_TO_SELF, 0.5f, RELATIVE_TO_SELF, 0.5f);
animate.setFillAfter(true);
//开始传动配置好的动画
arrow.startAnimation(animate);
lastRotateDegree = angle;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
//更新速率:提到游戏的规格上
sensormanager.registerListener(listener, magneticsensor,SensorManager.SENSOR_DELAY_GAME);
sensormanager.registerListener(listener, accelerometersensor, SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onDestroy() {
super.onDestroy();
sensormanager.unregisterListener(listener);
Log.e("传感器", "注销");
}
}
网友评论