android传感器(2)
来源:互联网 发布:直线裁剪算法代码 编辑:程序博客网 时间:2024/06/11 01:47
在Android应用程序中使用传感器要依赖于android.hardware.SensorEventListener接口。通过该接口可以监听传感器的各种事件。SensorEventListener接口的代码如下:
- package android.hardware;
- public interface SensorEventListener
- {
- public void
- onSensorChanged(SensorEvent event);
- public void
- onAccuracyChanged(Sensor sensor, int accuracy);
- }
在SensorEventListener接口中定义了两个方法:onSensorChanged和onAccuracyChanged。当传感器的值发生变化时,例如磁阻传感器的方向改变时会调用onSensorChanged方法。当传感器的精度变化时会调用onAccuracyChanged方法。
onSensorChanged方法只有一个SensorEvent类型的参数event,其中SensorEvent类有一个values变量非常重要,该变量的类型是float[]。但该变量最多只有3个元素,而且根据传感器的不同,values变量中元素所代表的含义也不同。
在解释values变量中元素的含义之前,先来介绍一下Android的坐标系统是如何定义X、Y、Z轴的。
X轴的方向是沿着屏幕的水平方向从左向右。如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。
Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指向屏幕的顶端。
将手机平放在桌子上,Z轴的方向是从手机里指向天空。
下面是values变量的元素在主要的传感器中所代表的含义。
1.1方向传感器
在方向传感器中values变量的3个值都表示度数,它们的含义如下:
values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。可以利用这个特性来实现电子罗盘,实例76将详细介绍电子罗盘的实现过程。
values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1]
≤180。假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values[1]的值应该是0(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)。这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values[1]会在0到-180之间变化,也就是说,从手机顶部抬起时,values[1]的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values[1]会在0到180之间变化。也就是values[1]的值会逐渐增大,直到等于180。可以利用values[1]和下面要介绍的values[2]来测量桌子等物体的倾斜度。
values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values[2]的值应为0。将手机左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。将手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化。
1.2加速传感器
该传感器的values变量的3个元素值分别表示X、Y、Z轴的加速值。例如,水平放在桌面上的手机从左侧向右侧移动,values[0]为负值;从右向左移动,values[0]为正值。读者可以通过本节的例子来体会加速传感器中的值的变化。要想使用相应的传感器,仅实现SensorEventListener接口是不够的,还需要使用下面的代码来注册相应的传感器。
- // 获得传感器管理器
- SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
- // 注册方向传感器
- sm.registerListener(this,
- sm.getDefaultSensor(Sensor.TYPE_ORIENTATION),
-
- SensorManager.SENSOR_DELAY_FASTEST);
如果想注册其他的传感器,可以改变getDefaultSensor方法的第1个参数值,例如,注册加速传感器可以使用Sensor.TYPE_ACCELEROMETER。在Sensor类中还定义了很多传感器常量,但要根据手机中实际的硬件配置来注册传感器。如果手机中没有相应的传感器硬件,就算注册了相应的传感器也不起任何作用。getDefaultSensor方法的第2个参数表示获得传感器数据的速度。SensorManager.SENSOR_DELAY_ FASTEST表示尽可能快地获得传感器数据。除了该值以外,还可以设置3个获得传感器数据的速度值,这些值如下:
SensorManager.SENSOR_DELAY_NORMAL:默认的获得传感器数据的速度。
SensorManager.SENSOR_DELAY_GAME:如果利用传感器开发游戏,建议使用该值。
SensorManager.SENSOR_DELAY_UI:如果使用传感器更新UI中的数据,建议使用该值。
1.3重力感应器
加速度传感器的类型常量是Sensor.TYPE_GRAVITY。重力传感器与加速度传感器使用同一套坐标系。values数组中三个元素分别表示了X、Y、Z轴的重力大小。Android SDK定义了一些常量,用于表示星系中行星、卫星和太阳表面的重力。下面就来温习一下天文知识,将来如果在地球以外用Android手机,也许会用得上。
- public static final float GRAVITY_SUN= 275.0f;
- public static final float GRAVITY_MERCURY= 3.70f;
- public static final float GRAVITY_VENUS= 8.87f;
- public static final float GRAVITY_EARTH= 9.80665f;
- public static final float GRAVITY_MOON= 1.6f;
- public static final float GRAVITY_MARS= 3.71f;
- public static final float GRAVITY_JUPITER= 23.12f;
- public static final float GRAVITY_SATURN= 8.96f;
- public static final float GRAVITY_URANUS= 8.69f;
- public static final float GRAVITY_NEPTUNE= 11.0f;
- public static final float GRAVITY_PLUTO= 0.6f;
- public static final float GRAVITY_DEATH_STAR_I= 0.000000353036145f;
- public static final float GRAVITY_THE_ISLAND= 4.815162342f;
光线传感器的类型常量是Sensor.TYPE_LIGHT。values数组只有第一个元素(values[0])有意义。表示光线的强度。最大的值是120000.0f。Android SDK将光线强度分为不同的等级,每一个等级的最大值由一个常量表示,这些常量都定义在SensorManager类中,代码如下:
- public static final float LIGHT_SUNLIGHT_MAX =120000.0f;
- public static final float LIGHT_SUNLIGHT=110000.0f;
- public static final float LIGHT_SHADE=20000.0f;
- public static final float LIGHT_OVERCAST= 10000.0f;
- public static final float LIGHT_SUNRISE= 400.0f;
- public static final float LIGHT_CLOUDY= 100.0f;
- public static final float LIGHT_FULLMOON= 0.25f;
- public static final float LIGHT_NO_MOON= 0.001f;
陀螺仪传感器的类型常量是Sensor.TYPE_GYROSCOPE。values数组的三个元素表示的含义如下:values[0]:延X轴旋转的角速度。
values[1]:延Y轴旋转的角速度。
values[2]:延Z轴旋转的角速度。
当手机逆时针旋转时,角速度为正值,顺时针旋转时,角速度为负值。陀螺仪传感器经常被用来计算手机已转动的角度,代码如下:
- private static final float NS2S = 1.0f / 1000000000.0f;
- private float timestamp;
- public void onSensorChanged(SensorEvent event)
- {
- if (timestamp != 0)
- {
- // event.timesamp表示当前的时间,单位是纳秒(1百万分之一毫秒)
- final float dT = (event.timestamp - timestamp) * NS2S;
- angle[0] += event.values[0] * dT;
- angle[1] += event.values[1] * dT;
- angle[2] += event.values[2] * dT;
- }
- timestamp = event.timestamp;
- }
- android传感器(2)
- Android_开发 Android传感器(加速度传感器,磁场传感器,光线传感器,方向传感器)
- android 加速的传感器(重力传感器)
- Android之传感器(一)光照传感器
- Android之传感器(二)加速度传感器
- Android之传感器(三)方向传感器
- Android传感器(二):加速度传感器
- Android传感器(一):传感器列表
- Android传感器(三):方向传感器
- Android传感器(四):距离传感器
- Android传感器(五):线性加速度传感器
- Android传感器(六):光传感器
- Android传感器的使用(方向传感器,重力传感器)
- android传感器2--指南针
- android 传感器 (未完成)
- Pro Android学习笔记(一五二):传感器(2):光传感器
- Pro Android学习笔记(一五二):传感器(2):光传感器
- Android-传感器-光照传感器
- 在对话框中应用CScrollView显示图像
- Gstreamer GstPipeline管道
- MINA网络框架
- Gstreamer流
- 大数相乘算法
- android传感器(2)
- Gstreamer Segments
- Gstreamer 预滚(Preroll)
- Apache Torque的关键配置参数 (DBCP)
- Gstreamer part-progress.txt翻译
- Hadoop运行python作业时的依赖于其他库的问题
- 两个编译2.4与2.6内核模块的Makefile 模板
- C++保存和调用lua函数
- android property system