android目前sensor开发接口有两种:
SensorListener 老接口,注释为已过时,建议不采用的接口
此接口默认坐标系以surface为参照物,也就是当系统界面发生旋转生,x,y 坐标也会
跟着旋转,也就是界面的水平方向永远为x,垂直方向永远为y
每个传感器有6个值,values[6],其中0,1,2为默认值,3,4,5为unwap的值,也就是
设备sensor传递上来未交换的数值,我们也可以理解为以设备为参照物的数据
此接口对于开发者容易理解,但对于android移植的人来说,需要对不同的surface
orientation做不同的映射,并且android framework层的默认坐标映射代码,在做
Orientation传感器的90/270度界面坐标转换时,把roll的方向搞反了,而其它手机
设备(如G14/I900/U8500)基本上也未修正这个bug,游戏也基本是按照这个错误的标准
来开发的,所以导致了一个不可修改的bug(这也可能是此接口被建议不采用的原因).
SensorEventListener 新接口
此接口坐标系统以设备为参照物,规定以设备的surface ROTATION0为原始参照坐标
也就是设备不做任何旋转时,水平方向为x,垂直方向为y,如果surface发生旋转,参照
物是设备,x,y坐标不变,就样就把坐标系统转换的工作留给了开发者
Surface0
其中,accelerometer传感器数值x,y,z正负方向与老接口相反,orientation的第三个值
roll正负方向与老接口相反
现在有很多Sensor游戏方向在我们设备上不对的原因,主要是发生在开发者使用了新接口
SensorEventListener,由于对新接口的坐标转换映射方向认识不够,或者只在手机一类默认为
竖屏的设备上测试过,所以放在我们默认为横屏的设备上,有可能会出现x,y坐标轴反掉的情况
使用新接口用来计算转换与surface相关的sample cod(development\samples\AccelerometerPlay\src)
switch (mDisplay.getRotation()) {
case Surface.ROTATION_0:
mSensorX = event.values[0];
mSensorY = event.values[1];
break;
case Surface.ROTATION_90:
mSensorX = -event.values[1];
mSensorY = event.values[0];
break;
case Surface.ROTATION_180:
mSensorX = -event.values[0];
mSensorY = -event.values[1];
break;
case Surface.ROTATION_270:
mSensorX = event.values[1];
mSensorY = -event.values[0];
break;
}
case Surface.ROTATION_0:
mSensorX = event.values[0];
mSensorY = event.values[1];
break;
case Surface.ROTATION_90:
mSensorX = -event.values[1];
mSensorY = event.values[0];
break;
case Surface.ROTATION_180:
mSensorX = -event.values[0];
mSensorY = -event.values[1];
break;
case Surface.ROTATION_270:
mSensorX = event.values[1];
mSensorY = -event.values[0];
break;
}