我的应用程序旨在“仅景观”。必须支持左右横向之间的旋转,因此我使用的是android:screenOrientation="sensorLandscape"
。
然而,我的应用程序中有一个迷你游戏,必须完全禁用旋转(因为这个迷你游戏将由设备tlting控制)。迷你游戏完成后,必须将方向处理政策恢复为sensorLandscape
。
禁用方向更改的标准方法是调用
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
但不是在这种情况下!如上所述here(并由我检查),它会导致定向更改为默认状态(可能是肖像)。
因此,从sensorLandscape
转到“disableRotation”的唯一方法是设置明确所需的方向。所以我有一个选择:要么打电话
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
或
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
显然,我需要传递当前的方向,但似乎Android无法获得它!
getResources().getConfiguration().orientation
会返回无用的Configuration.ORIENTATION_PORTRAIT
或Configuration.ORIENTATION_LANDSCAPE
。
getWindowManager().getDefaultDisplay().getRotation()
似乎更有希望。它返回Surface.ROTATION_0
... Surface.ROTATION_270
,我尝试使用如下逻辑:
int getCurrentOrintation()
{
final int rot = getWindowManager().getDefaultDisplay().getRotation();
if (Surface.ROTATION_0 == rot || Surface.ROTATION_90 == rot)
{
return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
}
return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
它在谷歌Nexus上运行良好,但在Kindle Fire HD上返回翻转。
那么,原则上可以暂时锁定Android中的方向更改吗?
答案 0 :(得分:1)
您可以通过在Android清单中声明screenOrientation="locked"
或使用程序化等效项ActivityInfo.SCREEN_ORIENTATION_LOCKED
来锁定特定活动的方向。但是,这是在API级别18中添加的,因此仅限于新设备。有关详细信息,请参阅清单documentation。
答案 1 :(得分:0)
强制方向不会禁用加速计/陀螺仪传感器,因此您无需移除方向锁。
但是,您应该注意传感器给出的值在标准传感器坐标系中:
加速度计使用标准传感器坐标系。实际上,这意味着当设备以自然方向平放在桌子上时,以下条件适用:
如果您将设备推向左侧(使其向右移动),则x加速度值为正。 如果您将设备推到底部(使其远离您),则y加速度值为正。
如果以A m / s2的加速度将设备推向天空,则z加速度值等于A + 9.81,这对应于设备的加速度(+ A m / s2)减去重力(-9.81 m / s2)。
固定装置的加速度值为+9.81,对应于装置的加速度(0 m / s2减去重力,即-9.81 m / s2)。
答案 2 :(得分:0)
您可以使用以下代码获取当前方向并将其锁定。
int currentOrient = getResources().getConfiguration().orientation;
if (currentOrient == Configuration.ORIENTATION_LANDSCAPE)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);//Lock to Landscape mode
}
else
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);//Lock to Potrait mode
}