它可以在 Android Lollipop 中通过使用Activity Transition Animations来完成,在所有 Activity 中使用相同的操作栏布局,并通过以下方式将操作栏定义为共享元素:
首先,确保在 v21/styles.xml 中启用活动转换并使用 NoActionBar 主题,以便您可以创建自定义操作栏:
<style name="AppTheme.NoActionBar">
...
<!-- enable window content transitions -->
<item name="android:windowActivityTransitions">true</item>
<!-- specify enter and exit transitions -->
<item name="android:windowEnterTransition">@android:transition/slide_right</item>
<item name="android:windowExitTransition">@android:transition/slide_left</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">@transition/app_bar_transform</item>
<item name="android:windowSharedElementExitTransition">@transition/app_bar_transform</item>
</style>
然后将您的 app_bar_transform.xml(在 res/transition 目录中)定义为 changeBounds,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<transitionSet>
<changeBounds/>
</transitionSet>
由于所有活动中的应用栏布局都相同,因此不会发生任何转换。
在您的自定义AppBarLayout 中设置 android:transitionName 属性:
<android.support.design.widget.AppBarLayout
...
android:id="@+id/app_bar"
android:transitionName="appBar"
...
</android.support.design.widget.AppBarLayout>
将此布局用于所有活动中的操作栏:
<include layout="@layout/app_bar"/>
然后,当您要启动下一个活动时,将应用栏布局定义为共享元素,如下所示:
final Intent intent = new Intent(getApplicationContext(), MainActivity.class);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, toolbar, "appBar");
ActivityCompat.startActivity(WelcomeActivity.this, intent, options.toBundle());
这将在活动之间转换时将应用栏保持在适当的位置。