Android: отчеты об ориентации экрана слишком медленные? - PullRequest
1 голос
/ 04 марта 2011

Я использую метод Display.getRotation(), чтобы определить текущую ориентацию экрана в моем приложении, согласно этой полезной записи блога от Google:

http://android -developers.blogspot.com / 2010/09 / один экран поворота-заслуживает-another.html

В двух словах, у меня есть приложение для рисования, которое позволяет пользователю рисовать фигуры и т. Д. На экране, и холст для рисования должен оставаться в той же ориентации, но я все еще хотел, чтобы меню «Параметры» и т. Д. Перевернулось к правильное местоположение, если и когда пользователь начинает рисовать с устройством в другой ориентации.

В onDraw() для холста я запрашиваю ориентацию у getRotation(), а затем поворачиваю холст обратно в положение «0», чтобы с точки зрения конечного пользователя холст никогда не перемещался. Работает как шарм ИСКЛЮЧИТЬ , если пользователь быстро переворачивает устройство ОЧЕНЬ , тогда getRotation() сообщает о повороте 0, и, таким образом, холст не поворачивается назад, делая рисунок кажется перевернутым или повернутым.

Интересно, что строка заголовка и меню параметров переворачиваются ... поэтому не уверены, откуда они получают ориентацию. Если пользователь затем начинает рисовать, последующий вызов onDraw() получает правильный угол поворота, и рисунок возвращается в правильное местоположение, но это немного нервирует / раздражает, как вы можете себе представить. Любые стратегии борьбы с этим?

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Вместо этого вы можете попробовать использовать getOrientation () ... Я не уверен, откуда возникла ваша проблема, но кто знает, это может дать вам другой результат.

Display myDisplay = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();         
int rotation = myDisplay.getOrientation();
switch (rotation) {
    case Surface.ROTATION_0: { doSomething(); break; }
    case Surface.ROTATION_90: { doSomething(); break; }                 
    case Surface.ROTATION_270: { doSomething(); break; }                    
    case Surface.ROTATION_180: { doSomething(); break; }
}
0 голосов
/ 10 июля 2011

Использовать onOrientationChanged ().Возвращает текущий угол в градусах.Кажется, он работает надежно для изменения ориентации дисплея.Я конвертирую угол в 4 стандартные ориентации, например:

    myOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL)
    {

        @Override
        public void onOrientationChanged(int iAngle)
        {                         // 0  15 30 45 60 75, 90 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285, 300, 315, 330, 345
            final int iLookup[] = {0,   0, 0,90,90, 90,90, 90,  90, 180, 180, 180, 180, 180, 180, 270, 270, 270, 270, 270, 270, 0, 0, 0}; // 15-degree increments 
            if (iAngle != ORIENTATION_UNKNOWN)
            {
                int iNewOrientation = iLookup[iAngle / 15];
                if (iOrientation != iNewOrientation)
                {
                iOrientation = iNewOrientation;
                <do something with new orientation>
                }  
            }
        }
    };
...