【发布时间】:2015-09-28 15:05:48
【问题描述】:
我的活动已锁定在 LANDSCAPE 上。但我仍然需要知道设备的方向。所以我选择使用传感器。我有以下代码
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);
...
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;
// Movement
float azimuth = values[0];
float pitch = values[1];
float roll = values[2];
if ((-110 <= pitch && pitch <= -70) || (70 <= pitch && pitch <= 110)) {
//PORTRAIT MODE
portraitPitch = true;
landscapePitch = false;
Log.d(TAG, "portrait mode: pitch = " + pitch);
} else if ((-20 <= pitch && pitch <= 20) || (-200 <= pitch && pitch <= -160) || (160 <= pitch && pitch <= 200)) {
//LANDSCAPE MODE
portraitPitch = false;
landscapePitch = true;
Log.d(TAG, "landscape mode : pitch = " + pitch);
}
if ((-20 <= roll && roll <= 20)) {
//PORTRAIT MODE
portraitRoll = true;
landscapePitch = false;
Log.d(TAG, "portrait mode: roll = " + roll);
} else if ((-110 <= roll && roll <= -70) || (70 <= roll && roll <= 110)) {
//LANDSCAPE MODE
portraitRoll = false;
landscapePitch = true;
Log.d(TAG, "landscape mode : roll = " + roll);
}
if (portraitPitch && portraitRoll && !portrait) {
portrait = true;
landscape = false;
rotateIconsToPortraitMode();
Log.d(TAG, "portrait mode for icons: pitch = " + pitch + ", roll = " + roll);
}
if (landscapePitch && landscapeRoll && !landscape) {
landscape = true;
portrait = false;
rotateIconsToLandscapeMode();
Log.d(TAG, "landscape mode for icons: pitch = " + pitch + ", roll = " + roll);
}
}
我的代码运行不可靠,事实上,otateIconsToLandscapeMode() 永远无法到达。
如何使用有关azimuth、pitch 和roll 的信息来确定设备的纵向或横向方向?`我希望我的问题足够具体,可以保证一个具体的答案。谢谢。
【问题讨论】:
-
您是否尝试过自己处理配置更改? developer.android.com/guide/topics/resources/… - 将
configChanges: orientation添加到manifest,并实现onConfigurationChanged,那么也许你可以得到newConfig.orientation -
那行不通。一旦锁定方向,配置更改事件就没有意义了。你必须使用传感器。
标签: android orientation screen-orientation android-sensors android-orientation