【问题标题】:Blinking screen on image transition between activities活动之间的图像转换时闪烁屏幕
【发布时间】:2015-04-06 11:55:48
【问题描述】:

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

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

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>  

感谢您的帮助

【问题讨论】:

  • 你能把这个动画的代码发给我吗,我正在尝试很长时间

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


【解决方案1】:

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

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

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

【讨论】:

  • @AnantShah 你可以。为什么不试试呢?您首先需要两个活动。
  • @kevinze 谢谢。它现在工作之前,它不工作。我这边的一个赞成票。
  • @sativa 让我们知道更多信息,例如您调用代码的位置、Android 版本等。
  • @KevinLee 我已经通过调用 getWindow().setSharedElementsUseOverlay(true); 解决了这个问题;
  • 它消除了褪色效果。就像扫地一样
【解决方案2】:

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

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

【讨论】:

  • 由于这个问题,我使用了@android:color/transparent,因为所有其他人都导致了错误。干杯!
  • 除此之外,这里没有任何答案。向你致敬!
【解决方案3】:

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

如果您想防止状态栏和/或导航栏在过渡期间消失(从而稍微减少“闪烁”效果),可以查看this post

【讨论】:

  • 我想知道你是否可以帮助我解决这个问题goo.gl/d5opg5。我保证,这不是那些“为我解决这个问题”的问题之一。
  • 请在您的回答中引用来源的相关部分。
  • 确实需要排除状态栏和导航栏,谢谢指出!
【解决方案4】:

在 helper 中创建一些方法,例如

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/

【讨论】:

  • 底部有软键栏的nexus设备怎么样?该栏的 id 是什么,因此我们也可以将其从动画中排除?
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:
    <!-- edit in your theme -->
    <item name="android:windowEnterTransition">@android:transition/no_transition</item>
    <item name="android:windowExitTransition">@android:transition/no_transition</item>
    

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

        • 什么也没帮我
        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

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

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

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

          【讨论】:

            【解决方案11】:

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

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

            【讨论】:

              【解决方案12】:

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

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

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

              【讨论】:

                【解决方案13】:

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

                getWindow().setExitTransition(null);
                

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

                getWindow().setEnterTransition(null); 
                

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

                window.setExitTransition = null 
                

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

                window.setEnterTransition = null
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2015-03-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-06
                  • 2020-04-08
                  • 2014-08-02
                  • 1970-01-01
                  相关资源
                  最近更新 更多