Sunday, August 28, 2011

Определение ориентации экрана

Установил на VirtualBox x86-версию Android, чтобы отладка не была мученьем (об этом потом). Установил разрешение 1024х600, запустил отлаживаемую программу. Приложение вело себя соответственно портретному режиму.
В коде обнаружилось следующее:
public static boolean isLandscapeMode(Context context) {
    Display display = ((WindowManager) (context.getSystemService(Context.WINDOW_SERVICE))).getDefaultDisplay();
    return display.getRotation() == Surface.ROTATION_90 || display.getRotation() == Surface.ROTATION_270;
}

В документации нашлось, что метод getRotation() returns the rotation of the screen from its "natural" orientation. В общем-то, все понятно, что Android внутри виртуальной машины воспринимает свою ориентацию как "натуральную", не думая о, собственно, разрешении экрана. На телефонах вроде моего любимого HTC ChaCha этот метод также должен работать неправильно. Заменил на решение "в лоб":

public static boolean isLandscapeMode(Context context) {
    Display display = ((WindowManager) (context.getSystemService(Context.WINDOW_SERVICE))).getDefaultDisplay();
    return display.getWidth() >= display.getHeight();
}

Все работает.

No comments:

Post a Comment