活动之间图像过渡时屏幕闪烁

65
我在两个活动之间使用Lollipop的新共享元素实现了图像转换。 运作正常,但在过渡期间整个屏幕会出现奇怪的闪烁白色,并且我找不到如何摆脱它。这是一个示例: 状态栏也在闪烁 这里是第二个活动的启动方式。
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>  

感谢您的帮助


你能否发送给我这个动画的代码?我已经尝试了很长时间。 - rajlaxmi_jagdale
13个回答

47

在退出的活动中,调用getWindow().setExitTransition(null);

在进入的活动中,调用getWindow().setEnterTransition(null);

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


2
@kevinze 謝謝。現在它已經可以了,在那之前它一直不工作。我給你點了個讚。 - Anant Shah
1
@KevinLee 我通过调用getWindow().setSharedElementsUseOverlay(true)解决了这个问题。 - JPLauber
@sativa,getWindow().setSharedElementsUseOverlay(true); 默认为 true,所以我不确定它是否真正解决了任何问题... - Sakiboy
然而,它有一些副作用,比如当应用程序被系统杀死时会出现黑色背景。 - M. Reza Nasirloo
2
它会去除淡出效果。就像扫除物质一样。 - Mahdi Astanei
显示剩余3条评论

24

我通过更改默认主题的背景色来解决了这个问题,希望这仍然能帮助有需要的人省去时间。

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

10
我使用了@android:color/transparent,因为其他方法都会导致错误。谢谢! - Josh Laird
除了这个答案,其他的都不起作用。向你致敬! - 6rchid

19
您所看到的“白闪烁”是两个活动在过渡期间进行alpha淡入和淡出的结果:当活动A启动活动B时,活动A淡出并活动B淡入。

如果您想防止状态栏和/或导航栏在过渡期间淡化(从而稍微减少“闪烁”效果),可以参考此帖子


我想知道您是否能帮我回答这个问题http://goo.gl/d5opg5。我保证这不是一个“替我修复”的问题。 - Axel
请在您的答案中引用源代码的相关部分。 - Eugen Pechanec
确实需要排除状态栏和导航栏,感谢您指出! - raquezha

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());

Source https://github.com/alexjlockwood/custom-lollipop-transitions/


1
那底部带有软键盘栏的Nexus设备怎么样?它的ID是什么,这样我们就可以将其从动画中排除掉? - Abdul Samad

3

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

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

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

2

我遇到了类似的问题。根据@Alex的建议,我通过将状态栏和导航栏从转换中排除来解决了闪烁的状态栏和导航栏问题,但在活动之间切换时屏幕仍然在闪烁。当我在startActivity()后删除"finish();"语句时,屏幕停止闪烁。可能是由于调用活动的关闭造成的。希望这能帮助到某些人。


2

上面有一些有用的答案。

据我所知,这是由于活动转换重叠引起的。为了解决这个问题,我在两个活动的onCreate()方法中使用了以下值:

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

对我没有任何作用。 - Nexen

2
在你的style.xml中添加以下内容,可以防止屏幕闪烁。"最初的回答"
    <item name="android:windowIsTranslucent">true</item>

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);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接