Экран вспыхивает случайным образом при использовании overridePendingTransition на желе Bean

Эта проблема возникает иногда только на желе Bean 4.1 и 4.2 (проверена на Galaxy Nexus и Nexus 4). Вот как я использую overridePendingTransition

При запуске нового действия:

Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivity(intent);
overridePendingTransition(R.anim.transition_right_to_left,
                    R.anim.transition_right_to_left_out);

Когда закончите операцию, чтобы вернуться к предыдущей

finish();
overridePendingTransition(R.anim.transition_left_to_right, R.anim.transition_left_to_right_out);

transition_left_to_right

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="-100%p"
android:toXDelta="0" 
android:duration="@integer/transition_duration"/>

transition_left_to_right_out

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="0"
android:toXDelta="100%p" 
android:duration="@integer/transition_duration"/>

transition_right_to_left

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="100%p"
android:toXDelta="0" 
android:duration="@integer/transition_duration"/>

transition_right_to_left_out

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="-100%p" 
android:duration="@integer/transition_duration"/>

И вот как экран мигает: http://youtu.be/TUKRz2yVF6Q (происходит только с 01:00)

Скажите, пожалуйста, если вы знаете, что не так с моим кодом и почему экран устройства иногда мигает? Спасибо.

Изменить: Пытался использовать ActivityOptions на желе Bean, но это не помогло

Ответ 1

У меня была такая же проблема. Я смог решить это, изменив интерполятор на linear_interpolator вместо acceleration_decelerate_interpolator.

Ответ 2

Попробуйте добавить следующую строку в оба файла анимации XML

 android:fillAfter="true"

Ответ 3

Если у вас есть опция "Не сохранять действия" в разделе "Параметры разработчика" в настройках?

Ответ 4

Вы можете решить эту проблему, отложив переходы активности и используя некоторый элемент представления в качестве перехода на общий элемент "якорь".

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

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().setEnterTransition(null);
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // Postpone the shared element enter transition.
        postponeEnterTransition();
    }
}

Теперь вам просто нужно вызвать 'scheduleStartPostponedTransition()' из точки вашего приложения, где все должно отображаться на экране. Этот метод работает очень хорошо и решает проблему с флэш-памятью при переключении действий.

//
// Schedules the shared element transition to be started immediately
// after the shared element has been measured and laid out within the
// activity view hierarchy. Some common places where it might make
// sense to call this method are:
//
// (1) Inside a Fragment onCreateView() method (if the shared element
//     lives inside a Fragment hosted by the called Activity).
//
// (2) Inside a Picasso Callback object (if you need to wait for Picasso to
//     asynchronously load/scale a bitmap before the transition can begin).
//
// (3) Inside a LoaderCallback onLoadFinished() method (if the shared
//     element depends on data queried by a Loader).
//
public void scheduleStartPostponedTransition(final ImageView sharedElement) {
    LogHelper.v(TAG, "scheduleStartPostponedTransition");
    sharedElement.getViewTreeObserver().addOnPreDrawListener(
            new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    sharedElement.getViewTreeObserver().removeOnPreDrawListener(this);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        startPostponedEnterTransition();
                    }
                    return true;
                }
            });
}

См. http://www.androiddesignpatterns.com/2015/03/activity-postponed-shared-element-transitions-part3b.html

Ответ 5

Глупое предложение, но попробовали ли вы изменить порядок анимации/финиша()?

Вот так:

overridePendingTransition(R.anim.transition_left_to_right, R.anim.transition_left_to_right_out);
finish();