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

时间:2015-02-06 10:52:12

标签: android material-design shared-element-transition

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

以下是第二项活动的启动方式

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>  

感谢您的帮助

12 个答案:

答案 0 :(得分:35)

在退出活动中,请致电 getWindow().setExitTransition(null);

在进入活动时,请致电 getWindow().setEnterTransition(null);

它可以防止退出活动的淡出和进入活动的淡入,从而消除明显的眨眼效果。

答案 1 :(得分:18)

您看到的“白色闪烁”是转换过程中两个动画进出动画的结果:当活动A开始活动B时,活动A消失out和活动B淡入。

如果要防止状态栏和/或导航栏在转换过程中褪色(从而减少“闪烁”效果),可以查看this post

答案 2 :(得分:15)

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

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

答案 3 :(得分:9)

在帮助器中制作一些方法,如

public static Transition makeEnterTransition() {
    Transition fade = new Fade();
    fade.excludeTarget(android.R.id.navigationBarBackground, true);
    fade.excludeTarget(android.R.id.statusBarBackground, true);
    return fade;
}

在你正在开始的活动中执行它

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

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

答案 4 :(得分:3)

我有类似的闪烁问题并尝试了很多这里提到的例子,但对我来说它并没有解决问题。对我有用的是将第二个活动主题的窗口背景更改为透明。 (@Webdma使用黑色,但在我的情况下,使屏幕闪烁黑色而不是白色)

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

答案 5 :(得分:2)

我有类似的问题。 我按照@Alex的建议将过滤器排除在状态栏和导航栏问题后解决了问题,但在切换活动时屏幕仍然闪烁。当我删除了 “完();” startActivity()之后的语句;屏幕停止闪烁。 可能是因为通话活动结束了。   希望这有助于某人。

答案 6 :(得分:2)

上面的一些有用的答案。 据我了解,这是由活动过渡重叠引起的。为了解决这个问题,我在两个活动的getWindow().setAllowEnterTransitionOverlap(false); getWindow().setAllowReturnTransitionOverlap(false); 方法中使用了以下值:

{{1}}

答案 7 :(得分:2)

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

答案 8 :(得分:1)

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

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

由于不必在纵向模式下隐藏状态栏,因此我删除了此标记并在需要时手动隐藏/显示状态栏并且闪烁消失。

答案 9 :(得分:1)

在您执行过渡元素的两个活动的 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);

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

答案 10 :(得分:0)

在您的style.xml中添加它。这样可以防止屏幕闪烁

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

答案 11 :(得分:0)

在 Java 中,在 ActivityCompat.startActivity(activity, intent, options.toBundle()) 之后的父活动中添加以下行;

getWindow().setExitTransition(null);

并在子活动的 onCreate 方法中添加以下行

getWindow().setEnterTransition(null); 

在 Kotlin 中,在父活动中添加以下行

window.setExitTransition = null 

并在子活动的 onCreate 方法中添加以下行

window.setEnterTransition = null
相关问题