第十二章 传感器

第十二讲 传感器
光照传感器、加速度传感器、地磁传感器、压力传感器、温度传感器等。
SensorManger senserManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
SensorManager 是系统所有传感器的管理器

Sensor sensor = senserManager.getDefaultSensor(Sensor.TYPE_LIGHT);
传感器输出的信号进行监听,这就要借助

SensorEventListener 来实现 了。
SensorEventListener 是一个接口,其中定义了 onSensorChanged()和 onAccuracyChanged() 这两个方法,
如下所示:
SensorEventListener listener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
float values=event.values[0]; 获取当前光照的强度

    }

};

sensorManager.registerListener(listener,senser,SensorManager.SENSOR_DELAY_NORMAL);

sensorManager.unregisterListener(listener);

由于地心引力的存在,你的手机无论在世界上任何角落都会有一个重力 加速度,这个加速度的值大约是 9.8m/s2。当手机平放的时候,这个加速度是作用在 Z 轴上 的,当手机竖立起来的时候,这个加速度是作用在 Y 轴上的,当手机横立起来的时候,这个 加速度是作用在 X 轴上的。

onSensorChanged(SensorEvent event)
float xValue=Math.abs(event.values[0]);
float yValue=Math.abs(event.values[1]);
float zValue = Math.abs(event.values[2]);
if (xValue > 15 || yValue > 15 || zValue > 15) {
// 认为用户摇动了手机,触发摇一摇逻辑
Toast.makeText(MainActivity.this, “摇一摇”, Toast.LENGTH_SHORT).show();

事实上,Android 获取手 机旋转的方向和角度是通过加速度传感器和地磁传感器共同计算得出的,这也是 Android 目 前推荐使用的方式。

其实指南针的实现原理并不复杂,我们只需要检测到手机围绕 Z 轴的旋转角度,然后 对这个值进行处理就可以了。

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// 注意赋值时要调用clone()方法
accelerometerValues = event.values.clone();
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
// 注意赋值时要调用clone()方法
magneticValues = event.values.clone();
}
float[] R = new float[9];
float[] values = new float[3];
SensorManager.getRotationMatrix(R, null, accelerometerValues,
magneticValues);
SensorManager.getOrientation(R, values);
Log.d(“MainActivity”, “value[0] is ” + Math.toDegrees(values[0])); }

就将 values 数组赋值给 accelerometerValues 数组
accelerometervalues=event.values.clone();

SensorManager.getRotationMatrix(R.null,accelerometerValues,magneticValues); 为R赋值
SensorManager.getOrientation(R, values); 为values赋值

values[0]表示手机围绕 Z 轴旋转 的弧度,这里我们调用 Math.toDegrees()方法将它转换成角度,并打印出来。

float rotateDegree =-(float) Math.toDegrees(values[0]);
if (Math.abs(rotateDegree - lastRotateDegree) > 1) {
RotateAnimation animation = new RotateAnimation (lastRotateDegree, rotateDegree, Animation.RELATIVE_TO_SELF, 0.5f, Animation. RELATIVE_TO_SELF, 0.5f);
animation.setFillAfter(true);
compassImg.startAnimation(animation);
lastRotateDegree = rotateDegree;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值