deviceorientation事件和deviceorientationabsolute事件
这两个事件都是用来判断手机方位的。事件返回结构都一样,分别有absolute,alpha,beta,gama。
deviceorientation获取的alpha不一定是指的南北方,这是有原因的。如果使用指南针传感器来的到alpha的值,这个值只能代表当前的南北方
这样造成了我们不能精确获取旋转的状态,因为南北方旋转并不一定是正圆。这样还有一个大问题是指南针容易受磁场干扰,很难反应精确的旋转状态
因此目前较为妥当的实现是让absolute为false,alpha的值每次刷新给一个初始值,旋转的时候返回精确的旋转角度,即alpha取陀螺仪的值。
那么我们非要获得指南针的数据呢?这时候就要用deviceorientationabsolute了。
deviceorientationabsolute获取的alpha为指南针的数据,一旦手机有能力得到这个数据,返回值里absolute为true,如果手机没有能力获取指南针数据,一般是因为没有磁场传感器,则这个事件返回的
alpha、beta、gama均为null,absolute为false。
因此在需要获取手机指南针数据时,需要用到deviceorientationabsolute事件而不是deviceorientation事件。
而需要获取旋转的精确数据时,应该用deviceorientation事件。但是deviceorientation也很有可能返回指南针数据,不同的浏览器实现不同,此时只能将就用了。
MDN
W3C
absolute:
absolute_absolute:
absolute为true代表当前获取的alpha为真实指向,即alpha为0时就是北极。absolute为false则代表无法判断北极。
alpha:
absolute_alpha:
alpha围绕Z轴旋转,代表当前的东西南北方向,当手机正对北极时值为0,然后左转(逆时针转动)时不断增加,直到360度时回到0度。所以0 <= alpha < 360
beta:
absolute_beta:
beta围绕X轴旋转,通过beta可以判断出手机在X轴上的任意状态。
当手机的顶部和底部处于水平线上时为0。
向顶部升高的方向旋转,顶部最高时为90,继续旋转直到又在一个水平面时达到180。
向底部升高的方向旋转,底部最高时为-90,继续旋转直到又在一个水平面时达到-180。
gamma:
absolute_gamma:
gamma围绕Y轴旋转,通过gamma可以判断出手机左右翻转的状态。
当手机左右处于水平线上时为0。
向右侧翻转逐渐增加,直到90。
向左侧翻转逐渐减少,直到-90。
DeviceMotionEvent是判断加速度的,DeviceMotionEvent.acceleration不含重力,DeviceMotionEvent.accelerationIncludingGravity含重力,硬件为加速度传感器
不含重力(如果手机硬件无法去除重力加速度,则这些值都为空):
accelerationX:
accelerationY:
accelerationZ:
含重力:
accelerationIncludingGravityX:
accelerationIncludingGravityY:
accelerationIncludingGravityZ: