63

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

这是第二个活动的启动方式

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>  

谢谢你的帮助

4

13 回答 13

47

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

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

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

于 2016-01-20T18:26:00.420 回答
24

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

<item name="android:windowBackground">@color/black</item>
<item name="android:colorBackground">@color/black</item>
于 2015-11-29T12:28:53.473 回答
19

您看到的“白色闪烁”是过渡期间两个活动 alpha 动画进出的结果:当活动A开始活动时B,活动A淡出,活动B淡入。

如果您想防止状态栏和/或导航栏在过渡期间褪色(从而稍微减少“闪烁”效果),您可以查看这篇文章

于 2015-02-18T16:03:47.033 回答
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/

于 2016-04-01T18:31:32.250 回答
3
<!-- edit in your theme -->
<item name="android:windowEnterTransition">@android:transition/no_transition</item>
<item name="android:windowExitTransition">@android:transition/no_transition</item>
于 2020-05-13T21:07:49.380 回答
3

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

    <item name="android:windowBackground">@android:color/transparent</item>
于 2017-06-02T09:55:50.687 回答
2

我有一个类似的问题。我解决了闪烁的状态栏和导航栏问题,根据@Alex 的建议将它们排除在过渡之外,但是在活动之间切换时屏幕仍在闪烁。当我删除“finish();” startActivity() 之后的语句;屏幕停止闪烁。可能是由于呼叫活动的关闭。希望这可以帮助某人。

于 2015-06-19T07:50:26.950 回答
2

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

getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
于 2017-07-12T14:37:13.973 回答
2

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

    <item name="android:windowIsTranslucent">true</item>
于 2019-08-06T15:13:08.547 回答
1

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

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

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

于 2017-01-24T09:18:49.593 回答
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);

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

于 2018-10-30T13:05:26.543 回答
0

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

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

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());
于 2016-08-16T14:21:23.930 回答
0

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

getWindow().setExitTransition(null);

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

getWindow().setEnterTransition(null); 

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

window.setExitTransition = null 

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

window.setEnterTransition = null
于 2021-01-20T16:13:51.277 回答