Display.getRotation () не работает точно при поворотах устройства на 180 градусов - PullRequest
0 голосов
/ 27 апреля 2011

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

Во всяком случае, я обнаружил странное поведение, которое, я думаю, лучше всего объяснить на примере.

Допустим, я держу устройство в «естественном» повороте на 0 градусов. Если я поверну на 90 градусов по часовой стрелке, я получу 270 градусов, а если поверну на 90 градусов против часовой стрелки, я получу 90 градусов. Однако, если я быстро поверну устройство на 180 градусов, это достаточно быстро, чтобы не было перехода через поворот на 90 градусов или поворот на 270 градусов, все изображение поворачивается, но поворот все равно отображается как исходный 0 градусов.

Допустим, я держал под углом 90 градусов, он прекрасно работает, если я поворачиваю на 90 градусов в любом направлении, но если я делаю переворот на 180 градусов, изображение снова поворачивается, но оно все равно сообщает исходные 90 градусов.

В чем здесь дело? Есть идеи?

Я собираюсь попробовать еще несколько экспериментов, если я это выясню, я опубликую результаты.

Ответы [ 2 ]

1 голос
/ 17 октября 2011

С документация :

public int getRotation ()

С: API Level 8 Возвращает поворот экрана из его "естественной" ориентации.Возвращаемое значение может быть Surface.ROTATION_0 (без вращения), Surface.ROTATION_90, Surface.ROTATION_180 или Surface.ROTATION_270.Например, если устройство имеет естественно высокий экран, и пользователь повернул его на бок, чтобы перейти в альбомную ориентацию, возвращаемое здесь значение может быть либо Surface.ROTATION_90, либо Surface.ROTATION_270 в зависимости от направления его поворота.Угол поворота нарисованной графики на экране является противоположным направлением физического поворота устройства.Например, если устройство повернуто на 90 градусов против часовой стрелки, для компенсации рендеринга будет повернуто на 90 градусов по часовой стрелке, и поэтому возвращаемое значение здесь будет Surface.ROTATION_90.

Надеюсь, это прояснит некоторые вещи для вас.

0 голосов
/ 23 апреля 2014

итак ... у меня такая проблема на HTC one, работает cyanogenmod.Ответ выше, кажется, не отвечает на этот вопрос, но, возможно, я просто его пропускаю.

Я решил с помощью directionEventListener, также используя onresume и Display.getRotation () для отслеживания ориентации (я использую это дляустановить данные поворота exif в файлах изображений).

в onResume. Я делаю:

if (display.getRotation() == Surface.ROTATION_0){  // portrait
    mPicOrientation = ExifInterface.ORIENTATION_ROTATE_90;
}else if (display.getRotation() == Surface.ROTATION_270){ // CW 90
    mPicOrientation = ExifInterface.ORIENTATION_ROTATE_180;
}else if (display.getRotation() == Surface.ROTATION_180){  // portrait inverted
    mPicOrientation = ExifInterface.ORIENTATION_ROTATE_270;
}else{ // CW 270
    mPicOrientation = ExifInterface.ORIENTATION_ROTATE_270;
}

в onCreate.вращение, требуемое на фотографиях, бессмысленно с портретной перевернутой ориентацией.Понятия не имею почему.это может быть несколько устройств, на которых я тестировал.
Я снова протестирую в эмуляторе, но очень сложно определить, когда его эмулированные снимки с камеры перевернуты (спасибо, Google).это работает большую часть времени, когда портрет перевернут.но не все время.сводит меня с ума, но кто на самом деле хочет так фотографировать?directionEventListener работает каждый раз.но это, конечно, не сработает, пока вы на самом деле не измените ориентацию (не уверен, каков порог).вот почему у меня есть Display.getRotation () в onResume.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...