当前位置: 首页 > 知识库问答 >
问题:

如何防止状态栏和导航栏在活动场景动画转换期间设置动画?

丁曦
2023-03-14

首先,我的状态栏背景设置为深棕色,导航栏背景默认为黑色。我使用的是材质灯光主题。

我正在使用ActivityOptions启动一个新的活动。使用默认转换生成ScenetTransitionAnimation,我注意到状态栏和导航栏都会短暂地淡入白色,然后返回到正确的颜色。

根据文件:

要获得转换的全部效果,必须在调用活动和被调用活动上启用窗口内容转换。否则,调用活动将启动退出转换,但随后您将看到窗口转换(如缩放或淡入淡出)

我正在使用getWindow()。requestFeature(窗口、功能、内容、转换)

类似地,如果我将enter转换更改为幻灯片,则状态栏和导航栏都会有一个带有白色背景的幻灯片转换。

如何防止状态栏和导航栏在活动场景动画转换期间设置动画?


共有3个答案

卫阳曜
2023-03-14

我刚刚遇到了同样的问题,答案似乎遗漏了谜题的关键部分。请记住,在共享元素转换中,一切都发生在目标活动中。

为了消除闪烁效果,只需将以下内容添加到正在调用的活动中:

Fade fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);

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

这应该能解决你的问题!

班承恩
2023-03-14

完全防止活动转换干扰共享元素转换:

在退出活动时,调用getWindow()。setExitTransition(空);

在输入活动中,调用getWindow()。setEnterTransition(空);

从…起https://stackoverflow.com/a/34907685/967131

我怀疑这可能有副作用,但不确定。这是非常简单的,但工作。

防止特定元素闪烁:

我从亚历克斯·洛克伍德的答案开始,做了相当多的实验,试图让它发挥作用。它的核心是正确的,尽管我不需要他为接收活动建议的代码,但是我在片段(而不是活动)中调用它并将工具栏设置为操作栏时遇到了一些问题。

哦,碎片的事?我看到很多评论说,试图检索对状态栏和导航栏的引用是空的。同样的事情也发生在我身上,直到我意识到我在碎片的布局中找不到那些。。。他们高于这个水平。因此,下面的代码用于从活动中获取装饰视图并搜索该视图。然后我发现他们没有问题。

最后,我开发了这个实用方法:

public static Bundle transitionOptions(Activity activity, int transitionViewResId, int transitionNameResId) {
   if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
       return null;
   }

   View decorView = activity.getWindow().getDecorView();
   View statusBar = decorView.findViewById(android.R.id.statusBarBackground);
   View navigationBar = decorView.findViewById(android.R.id.navigationBarBackground);
   View appBarLayout = decorView.findViewById(**R.id.appbarlayout**);
   View transitionView = decorView.findViewById(transitionViewResId);
   String transitionName = activity.getString(transitionNameResId);

   List<Pair<View, String>> pairs = new ArrayList<>();
   pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
   pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
   if (appBarLayout != null) {
       pairs.add(Pair.create(appBarLayout, activity.getString(**R.string.transition_appbarlayout**)));
   }
   pairs.add(Pair.create(transitionView, transitionName));
   //noinspection unchecked - we're not worried about the "unchecked" conversion of List<Pair> to Pair[] here
   return ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()]))
           .toBundle();
}

注意R.string.transition_appbarlayout和R.id.appbarlayout.这些ID是任意的,只要它们与您的代码使用的匹配。在我的XML中,我像这样布局自定义操作栏(编辑到要点):

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    android:id="**@+id/appbarlayout**"
    android:transitionName="**@string/transition_appbarlayout**">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"/>
</android.support.design.widget.AppBarLayout>

如果您不使用这样的工具栏,则可以从实用程序方法中删除该部分。

然后你会在你的片段中这样称呼它:

startActivity(intent, UIUtils.transitionOptions(getActivity(),
                        R.id.**my_view**,
                        R.string.**transition_my_view**));

使用您想要的任何值,只要它与您的XML匹配。

这可防止状态栏、工具栏和导航栏(返回/主页/最近的应用程序按钮)在转换期间闪烁。活动转换的其余部分是正常的。

在我的例子中,我们的应用程序主题有一个蓝色的android:windowBackground。这会导致在过渡过程中出现蓝色闪光,这相当令人沮丧。但是,与其做出这样影响整个应用程序的更改,现在我选择第一个快速脏的选项。

越福
2023-03-14

据我所知,有两种方法可用于防止导航/状态栏在过渡期间设置动画:

导航/状态栏在转换期间淡入淡出的原因是因为默认情况下,一旦转换开始,所有非共享视图(包括导航/状态栏背景)将分别淡出/淡入调用/调用的Activitys。然而,您可以通过从窗口的默认退出/输入淡出转换中排除导航/状态栏背景来轻松解决这个问题。只需将以下代码添加到Activitys的oncread()方法中:

Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);

也可以使用XML在活动主题中声明此转换(即在您自己的res/transition/window\u fade.XML文件中):

<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android">
    <targets>
        <target android:excludeId="@android:id/statusBarBackground"/>
        <target android:excludeId="@android:id/navigationBarBackground"/>
    </targets>
</fade>

这种方法建立在klmprt的答案之上,它几乎对我有效...尽管我仍然需要做一些修改

在我的呼叫活动中,我使用以下代码启动活动:

View statusBar = findViewById(android.R.id.statusBarBackground);
View navigationBar = findViewById(android.R.id.navigationBarBackground);

List<Pair<View, String>> pairs = new ArrayList<>();
if (statusBar != null) {
  pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
}
if (navigationBar != null) {
  pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
}
pairs.add(Pair.create(mSharedElement, mSharedElement.getTransitionName()));

Bundle options = ActivityOptions.makeSceneTransitionAnimation(activity, 
        pairs.toArray(new Pair[pairs.size()])).toBundle();
startActivity(new Intent(context, NextActivity.class), options);

到目前为止,这基本上与klmprt在他的回答中建议的是一样的。但是,我还需要在我的所谓的活动的oncread()方法中添加以下代码,以防止状态栏和导航栏在转换过程中“闪烁”:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_next);

    // Postpone the transition until the window's decor view has
    // finished its layout.
    postponeEnterTransition();

    final View decor = getWindow().getDecorView();
    decor.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            decor.getViewTreeObserver().removeOnPreDrawListener(this);
            startPostponedEnterTransition();
            return true;
        }
    });
}

将状态栏和导航栏背景添加为共享元素将强制它们绘制在窗口默认的退出/进入淡入淡入淡入淡入淡入淡入淡出淡入淡入淡入淡入淡入淡入淡入淡入淡入淡出淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡入淡。关于这种方法的更多讨论可以在谷歌的这篇文章中找到。

 类似资料:
  • 问题内容: 我知道必须在引导程序中手动管理活动类。我已经用jQuery完成了几次。 我最新的项目与react反应。 我知道我不应该在使用react时使用jQuery在dom中设置类。但是,如何正确地做到这一点呢? 问题答案: 您只需要在函数中指定选项卡的值即可。要知道选项卡是否应具有该属性的值,是将其存储在某处。 您如何将某些内容存储在react组件中?您使用。您没有显示任何代码,但是可以简单地跟

  • Dynamic Navbar is supported only in iOS Theme iOS7的好评特性之一是动态导航栏。当页面过渡时,导航栏元素会滑动渐变。 它只对穿透类型的布局有效 它应该在视图初始化时通过传递dynamicNavbar: true参数来启用 动态导航栏布局 动态导航栏和一般的导航栏是一样的,区别只在于,你可以对导航栏的组成部分(左、中、右)加入额外的类,来说明使用哪个过

  • 问题内容: 我有bootstrap v3。 我在菜单上使用时,它不会切换。我知道该如何使用并建立点击功能,但我认为该功能应包含在引导程序中?那么也许是JavaScript问题? 这是我包含的js / css / bootstrap文件的标头: 这是我的代码: 我可以正确设置吗? (在不相关的注释上,但可能相关吗?当菜单移动时,我单击菜单按钮,它将折叠。尽管再次按下并不会使其崩溃。因此,此问题与另一

  • 问题内容: 我是Android新手。我想在手机上制作 电池充电动画 ,例如,在屏幕的右上方,该小图标在充电时会上下颠倒,并以当前电池电量百分比停止显示。 到目前为止,在我的代码中,我已经能够移动它,但是它永远不会停止。 我想要的是让动画在不充电时停止播放或以当前电池电量百分比停止播放。 这是我在动画中的代码: 到目前为止,我可以获得电池状态,插头类型和电池的状况。 问题答案: 入门类也应实现停止逻

  • 我将其添加到我的应用程序底部导航栏中,但现在的问题是,我想从底部导航栏中的一个按钮移动到活动必须分段才能查看的活动(TabLayout,ViewPager)。当我尝试将其设置为selectedFragment=newmainActivityoderlistfargmant()时;“显示我”这样的错误。。也是这样,也不管用。。startActivity(新意图(NafMain.this,MainAc

  • 我试图动态添加在导航栏,但它一直给这个错误: 警告:mysqli_fetch_array()希望参数1是mysqli_结果,布尔值在第11行的C:\xampp\htdocs\includes\navigation.php中给出 我的PHP代码: