Переход мигает после изменения ориентации

ОБНОВИТЬ

Я обнаружил ошибку в Google https://issuetracker.google.com/issues/63663775.

Я пытаюсь использовать makeSceneTransitionAnimation в своем текущем приложении для Android.

У меня есть источник Activity, который содержит Fragment, а внутри фрагмента находится RecyclerView.

Когда я нажимаю на изображение в RecyclerView, я перехожу к своей цели Activity, которая содержит фрагмент, который правильно отображает изображение с приемлемой анимацией.

Нажатие кнопки «Назад» корректно переворачивает анимацию.

Вышеупомянутое прекрасно работает как в портретной, так и в альбомной ориентации.

Проблема МИГАНИЯ возникает, когда я меняю ориентацию при просмотре целевого фрагмента, а затем нажимаю кнопку «Назад».

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

Это МИГАЕТ, что очень плохо, экран устройства становится полностью ЧЕРНЫМ примерно на 500 мс.

Я загрузил и развернул приложение Google для перехода к общему элементу, и, похоже, оно имеет ту же «Функция».

Я пробовал несколько решений, и ни одно из них не сработало, например это.

Вот один из примеров, демонстрирующих проблему.

ДОБАВЛЕН LOGCAT

07-21 12:57:18.097 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=30KB, data=21KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=30KB, data=23KB
07-21 12:57:18.099 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 128KB
07-21 12:57:20.540 1962-2058/com.incentive.yellowpages D/OkHttp: --> GET http://www.spyur.am/en/home/search-1/?company_name=Happy http/1.1
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=61KB, data=55KB
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=61KB, data=55KB
07-21 12:57:20.688 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 256KB
07-21 12:57:21.084 1962-2058/com.incentive.yellowpages D/OkHttp: <-- 200 OK http://www.spyur.am/en/home/search-1/?company_name=Happy (543ms, unknown-length body)
07-21 12:57:22.197 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=124KB, data=93KB
07-21 12:57:22.197 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=98KB, data=59KB
07-21 12:57:22.377 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=101KB, data=79KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=101KB, data=79KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 512KB
07-21 12:57:22.378 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 4MB to compile boolean org.jsoup.parser.HtmlTreeBuilderState$7.process(org.jsoup.parser.Token, org.jsoup.parser.HtmlTreeBuilder)
07-21 12:57:22.701 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 4MB to compile void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-21 12:57:24.495 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=245KB, data=178KB
07-21 12:57:24.495 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=216KB, data=130KB
07-21 12:57:25.040 1962-2058/com.incentive.yellowpages D/OkHttp: --> GET http://www.spyur.am/en/companies/happy-print-printing-house/34896 http/1.1
07-21 12:57:25.101 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=true
07-21 12:57:25.437 1962-2058/com.incentive.yellowpages D/OkHttp: <-- 200 OK http://www.spyur.am/en/companies/happy-print-printing-house/34896 (396ms, unknown-length body)
07-21 12:57:26.111 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 0
07-21 12:57:26.123 1962-1967/com.incentive.yellowpages I/zygote64: Do partial code cache collection, code=251KB, data=168KB
07-21 12:57:26.124 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=249KB, data=168KB
07-21 12:57:26.124 1962-1967/com.incentive.yellowpages I/zygote64: Increasing code cache capacity to 1024KB
07-21 12:57:26.173 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 1
07-21 12:57:26.177 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 2
07-21 12:57:26.186 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 3
07-21 12:57:26.226 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 4
07-21 12:57:26.232 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 5
07-21 12:57:26.238 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 6
07-21 12:57:26.244 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 7
07-21 12:57:26.265 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 8MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-21 12:57:26.437 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:26.579 1962-1967/com.incentive.yellowpages I/zygote64: Compiler allocated 6MB to compile void android.view.ViewRootImpl.performTraversals()
07-21 12:57:27.754 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 0
07-21 12:57:27.761 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 1
07-21 12:57:27.765 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 2
07-21 12:57:27.772 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 3
07-21 12:57:27.784 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 4
07-21 12:57:27.788 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 5
07-21 12:57:27.792 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 6
07-21 12:57:27.796 1962-1962/com.incentive.yellowpages I/DetailsAdapter: vvv: 7
07-21 12:57:29.889 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:30.117 1962-1962/com.incentive.yellowpages D/ViewRootImpl[DetailActivity]: changeCanvasOpacity: opaque=false
07-21 12:57:30.756 1962-1962/com.incentive.yellowpages W/AutofillManager: Session 409360048 could not be restored
07-21 12:57:30.922 1962-1967/com.incentive.yellowpages I/zygote64: Do full code cache collection, code=498KB, data=362KB
07-21 12:57:30.923 1962-1967/com.incentive.yellowpages I/zygote64: After code cache collection, code=445KB, data=262KB

comment
Может быть здесь: github.com/saulmm/Android-Material-Examples   -  person RonTLV    schedule 14.07.2017
comment
Можешь выложить видео с поведением?   -  person azizbekian    schedule 14.07.2017
comment
@azizbekian Я добавил ссылку на видео, мигание происходит на 0,06 (или сразу после)   -  person Hector    schedule 14.07.2017
comment
Ответ @azizbekian действительно останавливает поведение BLINK, однако этот подход неприемлем для моей конкретной ситуации. При сохранении альбомного вида в портретной ориентации во время завершения перехода верхняя и нижняя часть экрана остается ПУСТОЙ, что почти так же плохо, как и исходный симптом МИГАНИЯ всего экрана. Было бы неплохо понять, почему происходит BLINK. Я не могу согласиться с тем, что BLINK происходит только потому, что экран был перестроен из-за изменения ориентации.   -  person Hector    schedule 21.07.2017
comment
By keeping the landscape view in portrait... - можно уточнить, что это значит? ...leaves the top and bottom of the screen BLANK - можно видео?   -  person azizbekian    schedule 21.07.2017
comment
@azizbekian, во-первых, я должен признать, что мне не удалось собрать и развернуть ваш проект github на моем устройстве O, поэтому я исхожу только из вашего прикрепленного GIF. Похоже, ваш проект — это и Java, и Kotlin, Kotlin — не тот вариант, который я могу использовать. В вашем GIF видно, что когда происходит ориентация экрана и завершается переход, ваше устройство находится в портретном режиме, а на экране все еще отображается альбомный вид. Возможно, это моя ошибка, так как ваш GIF не показывает события Click на экране, поэтому невозможно определить, когда нажата кнопка «Назад».   -  person Hector    schedule 21.07.2017
comment
@ Гектор, проект не поддерживается. Только что проверил и увидел, что больше не строит. Обновил какой-то плагин, внес изменения. Теперь собирается и работает на Android O.   -  person azizbekian    schedule 21.07.2017
comment
@azizbekian Я только что создал и развернул ваше приложение «Желтые страницы» на своем устройстве O (PIXEL XL), и оно имеет функцию BLINK, как показано здесь youtu.be/tGA_DGx6lbU   -  person Hector    schedule 21.07.2017
comment
@ Гектор, вау, это действительно интересно. К сожалению, у меня нет устройства с O, и эмулятор очень не отвечает, зависает и перезагружается без причины. В логарифме что-то есть?   -  person azizbekian    schedule 21.07.2017
comment
@azizbekian Айв добавил весь логкэт из видео   -  person Hector    schedule 21.07.2017
comment
Мне не нравятся эти строки: zygote64: Компилятор выделил 8 МБ для компиляции.... Кажется, что android O слишком строгий.   -  person azizbekian    schedule 21.07.2017


Ответы (3)


Вот проблема: вы начинаете Activity2 в портретном режиме и возвращаетесь к Activity1 в ландшафтном режиме. Но поскольку вы выполнили изменение ориентации, иерархия представлений Activity1 была уничтожена и создана, таким образом, больше нет View, с которого изначально был начат переход.

Что вы можете сделать, так это повторно сопоставить представление со старого на новое, используя Activity#setExitSharedElementCallback() API. Однако для решения этой ситуации нужно проделать небольшую работу, которую я уже описал шаг за шагом в моем этом ответь.

Лучшим выбором для вас будет проверить Алекса Локвуда app at github с нужным вам функционалом, вам будет намного проще понять, как справиться с ситуацией.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setExitSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {

            if (we are coming back to Activity1) {
                View newSharedElement = findViewById(R.id.your_imageview);
                if (newSharedElement != null) {
                    names.clear();
                    names.add("transition name");
                    sharedElements.clear();
                    sharedElements.put("transition name", newSharedElement);
                }
            } else {
                // we are leaving Activity1
            }
        }
    });
}

По сути, вы очищаете карту и добавляете к ней новую пару «имя-представление перехода». Вы можете увидеть, как выполняется if (we are coming back to Activity1) проверка здесь.


Вот функция, реализованная в одном из моих приложений.

введите здесь описание изображения

person azizbekian    schedule 14.07.2017
comment
youtu.be/CigNib7UI3g в этом видео показано, что приложение Алекса имеет точно такую ​​же проблему при изменении ориентации - person Hector; 14.07.2017
comment
Я ценю работу, которую вы приложили к своему примеру приложения. Конечно, BLINK нет, однако выбранный вами подход неприемлем для моего конкретного приложения. Ваш метод сохранения ландшафтного пользовательского интерфейса при возврате в портретную ориентацию отображает много пустого экрана. - person Hector; 16.07.2017
comment
Как сказал @Hector, у примера приложения AlexLockwood есть проблема с мерцанием. Я вижу это на Nexus 5X, но не на Samsung Galaxy Note 5. Я предлагаю вам протестировать ваше приложение на Nexus. Скорее всего, это не ошибка Nexus 5X, потому что приложение Google Photos не затрагивается на 5X, так что есть способ заставить его работать, спрятанный где-то... - person Tim Autin; 30.11.2017

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

person Ankit Khare    schedule 14.07.2017

Похоже, это происходит только на Oreo. Его можно воспроизвести на эмуляторе API 26 с помощью примера проекта Google, доступного здесь: https://github.com/googlesamples/android-ActivitySceneTransitionBasic/#readme

Мне удалось исправить проблему в моем приложении, добавив это:

<item name="android:windowIsTranslucent">true</item>

К стилю моей детальной деятельности.

person Tim Autin    schedule 20.12.2017