据我所知,有两种方法可以用来防止导航/状态栏在过渡期间设置动画:
方法1:从窗口的默认退出/进入淡入淡出过渡中排除状态栏和导航栏
导航/状态栏在转换期间淡入淡出的原因是,默认情况下,一旦转换开始,调用/调用活动中的所有非共享视图(包括导航/状态栏背景)将分别淡出/淡出.但是,您可以通过将导航/状态栏背景从窗口的默认退出/输入Fade
转换中排除,轻松解决这个问题.只需将以下代码添加到Activitys的onCreate()
方法中:
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_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>
方法#2:将状态栏和导航栏添加为共享元素
这种方法基于klmprt的答案,这almost个答案对我有用...尽管我仍然需要做一些修改.
在我的呼叫活动中,我使用以下代码启动活动:
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在他的回答中提出的建议相同.但是,我还需要在我调用的Activity onCreate()
方法中添加以下代码,以防止状态栏和导航栏在转换期间"闪烁":
@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;
}
});
}
将状态栏和导航栏背景添加为共享元素将强制将它们绘制在窗口默认的退出/进入淡入淡入淡出过渡的顶部,这意味着它们在过渡期间不会淡入淡出.关于这种方法的更多讨论,请参见this Google+ post页.