活动之间的图像转换闪烁屏幕

Blinking screen on image transition between activities

我使用棒棒糖中的新共享元素实现了两个活动之间的图像转换。它工作正常,但在转换期间整个屏幕上出现奇怪的白色闪烁,我找不到如何摆脱它。这是一个例子:

这是第二个 activity 的启动方式

public static void launch(
            @NonNull Activity activity, @NonNull View transitionView, Game game) {
        ActivityOptionsCompat options =
                ActivityOptionsCompat.makeSceneTransitionAnimation(
                        activity, transitionView, game.gameFullId);
        Intent intent = new Intent(activity, ListImportationLoginActivity.class);
        intent.putExtra(INTENT_EXTRA_GAME, retailer);
        ActivityCompat.startActivity(activity, intent, options.toBundle());
    }

然后在onCreate中:

ViewCompat.setTransitionName(mLogoView, mGame.gameFullId);  

主题文件:

<resources>
    <style name="Theme.MyApp.NoActionBar" parent="Theme.MyApp.NoActionBar.Base">
        <item name="android:windowContentTransitions">true</item>
        <item name="android:windowAllowEnterTransitionOverlap">true</item>
        <item name="android:windowAllowReturnTransitionOverlap">true</item>
        <item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
        <item name="android:windowSharedElementExitTransition">@android:transition/move</item>
    </style>
</resources>  

感谢您的帮助

您看到的 "white blinking" 是两个活动在过渡期间进入和退出 alpha 动画的结果:当 activity A 开始时 activity B、activity A 淡出并且 activity B 淡入。

如果要防止状态栏and/or导航栏在过渡过程中淡化(从而减少"blinking"效果),可以看this post

我遇到了类似的问题。 我按照@Alex 的建议将闪烁的状态栏和导航栏问题排除在过渡之外,但在切换活动时屏幕仍然闪烁。当我删除 "finish();" startActivity() 之后的语句;屏幕停止闪烁。 可能是由于调用 activity 结束。 希望这对某人有所帮助。

我通过更改默认主题的背景颜色解决了这个问题,希望这仍然可以帮助某人节省时间。

<item name="android:windowBackground">@color/black</item>
<item name="android:colorBackground">@color/black</item>

在退出 activity 时,调用 getWindow().setExitTransition(null);

在进入 activity 时,调用 getWindow().setEnterTransition(null);

它将防止退出 activity 淡出和进入 activity 淡入,从而消除明显的闪烁效果。

在 helper like

中创建一些方法
public static Transition makeEnterTransition() {
    Transition fade = new Fade();
    fade.excludeTarget(android.R.id.navigationBarBackground, true);
    fade.excludeTarget(android.R.id.statusBarBackground, true);
    return fade;
}

在你开始的activity中执行它

getWindow().setEnterTransition(TransitionUtils.makeEnterTransition());

来源 https://github.com/alexjlockwood/custom-lollipop-transitions/

元素淡入淡出,除非您明确指定它们在两个活动中相同。这包括状态和导航栏。

在您的特定情况下,我会将工具栏和这两个视图添加到共享元素列表中:

List<Pair> viewPairs = new ArrayList<>();
viewPairs.add(Pair.create(findViewById(android.R.id.statusBarBackground), Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
viewPairs.add(Pair.create(findViewById(android.R.id.navigationBarBackground), Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
// Add your views...

Pair[] array = new Pair[viewPairs.size()];
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), viewPairs.toArray(array)).toBundle();
// ...

ActivityCompat.startActivity(activity, intent, options.toBundle());

在我的情况下,第二个 activity 没有在 activity 主题中使用此标签定义的状态栏。

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

由于在纵向模式下隐藏状态栏不是强制性的,我删除了这个标签并在需要时手动 hide/show 状态栏并且闪烁消失了。

我遇到过类似的闪烁问题并尝试了此处提到的许多示例,但对我来说并没有解决问题。对我有用的是将第二个 activity 主题的 window 背景更改为透明。 (@Webdma 使用黑色,但在我的情况下,使屏幕闪烁黑色而不是白色)

    <item name="android:windowBackground">@android:color/transparent</item>

上面的一些有用的答案。 据我了解,这是由 activity 过渡重叠引起的。为了克服这个问题,我在两个活动的 onCreate() 方法中使用了以下值:

getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);

在您执行转换元素的两个活动的 onCreate 中添加这些代码

   Fade fade = new Fade();
        View decor = getWindow().getDecorView();
        fade.excludeTarget(decor.findViewById(R.id.action_bar_container),true);
        fade.excludeTarget(android.R.id.statusBarBackground,true);
        fade.excludeTarget(android.R.id.navigationBarBackground,true);

        getWindow().setEnterTransition(fade);
        getWindow().setExitTransition(fade);

这将从导航和状态栏中排除动画,因此不再闪烁

将此添加到您的 style.xml。这可以防止屏幕闪烁

    <item name="android:windowIsTranslucent">true</item>
<!-- edit in your theme -->
<item name="android:windowEnterTransition">@android:transition/no_transition</item>
<item name="android:windowExitTransition">@android:transition/no_transition</item>

在Java中,在父activity中的ActivityCompat.startActivity(activity, intent, options.toBundle());

getWindow().setExitTransition(null);

并在子 activity

的 onCreate 方法中添加以下行
getWindow().setEnterTransition(null); 

在 Kotlin 中,在父级中添加以下行 activity

window.setExitTransition = null 

并在子 activity

的 onCreate 方法中添加以下行
window.setEnterTransition = null