Переход общего элемента Android работает только при выходе из действия, а не при входе

Я использую переход общего элемента для анимации просмотра изображения из действия A в действие B. Для этого я использую следующий код:

Intent i = new Intent(A.this, B.class);
Pair<View, String> p1 = Pair.create(v2, "logo");
ActivityOptionsCompat options = ActivityOptionsCompat.
                     makeSceneTransitionAnimation((Activity) mContext,p1);
context.startActivity(i, options.toBundle());

Моя тема:

<style name="AnimationTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <item name="android:windowContentTransitions">true</item>
        <item name="android:windowAllowEnterTransitionOverlap">true</item>
        <item name="android:windowAllowReturnTransitionOverlap">true</item>

    </style>

с «логотипом» — это имя перехода для представления изображения как в A, так и в B. Но я заметил, что, хотя изображение переходит из B-> A, как и ожидалось, переход от A-> B не работает, и есть просто затухание анимация между двумя действиями.

Что я делаю неправильно и как это исправить, чтобы изображение также анимировалось из A-> B?

ПРИМЕЧАНИЕ. A — это действие с переработкой изображений, каждое из которых открывается в подробное действие (B) с переходом изображения между двумя действиями.

Спасибо!


person Shivam Bhalla    schedule 28.10.2015    source источник
comment
то же самое здесь: stackoverflow.com/questions/35846447 /   -  person Jemshit Iskenderov    schedule 07.03.2016


Ответы (2)


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

private final RequestListener<Integer, GlideDrawable> listener = new RequestListener<Integer, GlideDrawable>() {
       @Override
       public boolean onException(Exception e, Integer model, Target<GlideDrawable> target, boolean isFirstResource) {
           return false;
       }

       @Override
       public boolean onResourceReady(GlideDrawable resource, Integer model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
           startPostponedEnterTransition();
           return false;
       }
};


Glide.with(getActivity()).load(list.get(position).getId()).listener(listener).into(imageView);

Вызовите PostponeEnterTransition() в OnCreate подробного действия и вызовите startPostponeRequest в OnResourceReady.

private void startPostponedEnterTransition() {
    imageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            imageView.getViewTreeObserver().removeOnPreDrawListener(this);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
                getActivity().startPostponedEnterTransition();
            return true;
        }
    });
}
person vaibhav jain    schedule 31.05.2016

Я проверил все ответы, такие как удаление анимации или startPostponedEnterTransition() и так далее. ничего не сработало. наконец, эта строка решила мою проблему. Добавьте это в свой style.xml. Это предотвращает мигание экрана

<item name="android:windowIsTranslucent">true</item>
person mhKarami    schedule 10.02.2021