Как повернуть вид с двух разных углов?

Я пытаюсь повернуть ImageButton на 180 градусов, чтобы он соответствовал обратной портретной ориентации. Когда я сделал это так же, как другие изменения ориентации, результат был идеальным, но не анимация.

 public void onOrientationChanged(int DeviceAngle) {
      float MyButtonCurrentAngle = MyButton.getRotation(); //Gets portrait rotation (0)
           if(DeviceAngle > 350 || DeviceAngle < 10) { //Portrait
                MyButton.animate().rotationBy(- MyButtonCurrentAngle).setDuration(100).start();
           } else if(DeviceAngle > 80 && DeviceAngle < 100) { //Reverse Landscape
                MyButton.animate().rotationBy(-90 - MyButtonCurrentAngle ).setDuration(100).start();
            } else if(DeviceAngle > 170 && DeviceAngle < 190) { //Reverse Portrait
                MyButton.animate().rotationBy(180 -  MyButtonCurrentAngle).setDuration(100).start();
           } else if(DeviceAngle > 260 && DeviceAngle < 280) { //Landscape
                MyButton.animate().rotationBy(90 - MyButtonCurrentAngle ).setDuration(100).start();
           }          

Я думал, что это происходит, потому что поплавок MyButtonCurrentAngle получает значение угла поворота MyButton (0 или без поворота) из DeviceAngle между 350 и 10 (0 или 360, портретная ориентация) и использует его в качестве эталона.

Хотя я все еще сомневаюсь, я отбросил предыдущий случай. Поплавок, казалось, хорошо работал с другими ориентациями, и я думаю, что проблема заключается в анимации для ориентации «Обратный портрет». Кнопку нужно поворачивать не на 180, а либо на 90, либо на -90 градусов. Это связано с тем, что вы не можете повернуть устройство из книжной ориентации в обратную, не выбрав альбомную ориентацию. (Невозможно напрямую повернуть портрет в перевернутый портрет).

После многих безуспешных попыток я пришел к выводу, что я не могу использовать значение угла, полученное MyButton, после того, как кнопка была повернута и обнаружена ориентация: альбомная или обратная альбомная. Я думал о создании еще одного плавающего элемента, чтобы получить значение угла MyButton для обратного портрета, но ориентация этого действия установлена ​​​​на Портрет, поэтому это не имеет смысла.

Поэтому мне нужно получить угол поворота MyButton после того, как он был повернут с плавающей запятой, используя эти значения как условие цикла, и в зависимости от результата повернуть его на 90 градусов или -90 градусов в двух разных анимациях. Это был мой последний подход к проблеме:

    while (MyButtonCurrentAngle==90) { 
    if (DeviceAngle > 170 && DeviceAngle < 190) {
        MyButton.animate().rotationBy(90 - MyButtonCurrentAngle).setDuration(100).start();
    }
}
while (MyButtonCurrentAngle==270) { 
    if (DeviceAngle > 170 && DeviceAngle < 190) {
        MyButton.animate().rotationBy(-90 - MyButtonCurrentAngle).setDuration(100).start();
    }
}

По сути, это обрабатывает ориентацию устройства от альбомной и обратной альбомной до обратной портретной. Это не запускало никакой анимации, поэтому значение угла плавания MyButtonCurrentAngle никогда не менялось или не могло быть обнаружено? Почему операторы if не могут его прочитать? Я не знаю, и я хотел бы знать, что я делаю неправильно. Заранее спасибо.


person Lekstadt    schedule 03.11.2015    source источник


Ответы (1)


Вот вы снова пришли.. Вы не обновили значение MyButtonCurrentAngle в цикле, поэтому, конечно, оно никогда не изменится. Это выглядит как бесконечный цикл, если не изменится DeviceAngle.

Тем не менее, большинство приложений не поддерживают обратный портретный режим, потому что это не имеет смысла. Это также поведение ОС по умолчанию. Вы действительно должны поддерживать это?

Хорошо, давайте сделаем это:

    OrientationEventListener orientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_UI) {
        static final int DELTA = 20;

        @Override
        public void onOrientationChanged(int angle) {
            float destination = mDestination;
            if (angle > 90 - DELTA && angle < 90 + DELTA) {
                destination = -90;
            } else if (angle > 180 - DELTA && angle < 180 + DELTA) {
                destination = 180;
            } else if (angle > 270 - DELTA && angle < 270 + DELTA) {
                destination = 90;
            } else if (angle > 360 - DELTA || angle < DELTA) {
                destination = 0;
            }
            if (destination != mDestination) {
                mDestination = destination;
                button.animate().rotation(mDestination).setDuration(100).start();
            }
        }
    };
    orientationEventListener.enable();

mDestination — это переменная-член вашей активности, объявленная следующим образом:

float mDestination = 0;

Я думаю, что этот новый код решит проблему моего предыдущего поста, из-за которой анимация замедлялась, потому что анимация часто перезапускалась.

Вы можете изменить продолжительность, если хотите. Я изменил дельту на 20, потому что считаю, что 10 слишком мало.

person Xiaoyu Yu    schedule 03.11.2015
comment
Я попробовал это, и это работает. Если я перехожу от портрета к пейзажу, отлично, но от пейзажа к портрету он не реагирует. Он также застрял на половине анимации, и элементы были наклонены. Я тестирую Oppo Find 7, может быть устройство? Тем не менее, это правильный ответ, я, вероятно, просто сделаю то, что вы сказали, и пойду с тремя ориентациями. Опубликуйте свой ответ и здесь: вид под разными углами">stackoverflow.com/questions/33473879/, чтобы я мог выбрать его. - person Lekstadt; 03.11.2015
comment
Вы заметили, что я изменил rotateBy() на rotate()? Я попробовал код сам, и он работал без каких-либо проблем. - person Xiaoyu Yu; 03.11.2015
comment
Точно, я не заметил. И да, он работает идеально. Ты замечательный!! Большое спасибо, я новичок в Android и Java, так что это действительно очень помогает. - person Lekstadt; 03.11.2015