如何使用Android中的加速度计在XY平面上测量手机的倾斜度

我尝试使用来自SensorEvent.values的Z轴数据,但是它没有检测到我的手机在XY平面上的旋转, 围绕Z轴。

我用这个作为坐标轴的参考。 这是对的吗?

轴

如何使用加速计值来测量该运动?

这些游戏做类似的事情: 极限滑板 ,涂鸦跳跃。

PS:我的手机方向将是风景。

Solutions Collecting From Web of "如何使用Android中的加速度计在XY平面上测量手机的倾斜度"

从本质上讲,这里有两种情况:设备平放而不平整。 这里平坦表示设备屏幕表面与世界xy平面(我称之为倾斜)之间的angular度小于25度或大于155度。 想想手机平躺或从桌面上稍微倾斜一点。

首先你需要对加速度计vector进行归一化。
也就是说,如果g是由加速度传感器事件值返回的vector。 在代码中

float[] g = new float[3]; g = event.values.clone(); double norm_Of_g = Math.sqrt(g[0] * g[0] + g[1] * g[1] + g[2] * g[2]); // Normalize the accelerometer vector g[0] = g[0] / norm_Of_g g[1] = g[1] / norm_Of_g g[2] = g[2] / norm_Of_g 

那么倾斜度可以计算为

 int inclination = (int) Math.round(Math.toDegrees(Math.acos(g[2]))); 

从而

 if (inclination < 25 || inclination > 155) { // device is flat } else { // device is not flat } 

对于平铺的情况,您必须使用指南针来查看设备从起始位置旋转多less。

对于不平坦的情况,旋转(倾斜)的计算如下

 int rotation = (int) Math.round(Math.toDegrees(Math.atan2(g[0], g[1]))); 

现在旋转= 0表示设备处于正常位置。 这是对大多数手机没有任何倾斜的肖像,也可能是平板电脑的风景。 因此,如果您按上图所示持有手机并开始旋转,则旋转将会改变,手机处于横向时,旋转angular度将为90°或-90,具体取决于旋转方向。