如何为Navigation组件的Navigation Actions定义默认动画?
嘿,我完全懂你这种重复写动画属性的烦躁——每个action都手动配置enterAnim、exitAnim这些确实太啰嗦了!其实Navigation组件早就支持通过主题样式来设置全局默认转场动画,你之前没成功可能是样式配置的姿势不对,我来给你捋清楚正确的做法:
步骤1:准备好你的动画资源
首先确保你已经把需要的动画文件放在res/animator目录下,比如你用到的slide_in_right.xml、slide_out_left.xml这些。
步骤2:定义包含默认动画的主题样式
在res/values/styles.xml里创建一个自定义主题,继承你当前应用的基础主题,然后添加Navigation组件的全局动画属性:
<style name="AppTheme.NavigationDefaults" parent="Theme.MaterialComponents.Light.NoActionBar"> <!-- 全局默认的进入/退出动画 --> <item name="defaultEnterAnim">@animator/slide_in_right</item> <item name="defaultExitAnim">@animator/slide_out_left</item> <!-- 返回栈弹出时的默认进入/退出动画 --> <item name="defaultPopEnterAnim">@animator/slide_in_left</item> <item name="defaultPopExitAnim">@animator/slide_out_right</item> </style>
注意这里的属性名是defaultEnterAnim(不带app:前缀,因为是主题属性),这是Navigation组件专门用来设置全局默认动画的属性。
步骤3:将主题应用到NavHostFragment
接下来把这个主题绑定到你的导航宿主Fragment上,在布局文件中找到NavHostFragment的标签,添加android:theme属性:
<fragment android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:navGraph="@navigation/nav_graph" app:defaultNavHost="true" android:theme="@style/AppTheme.NavigationDefaults" />
额外说明:局部覆盖默认动画
如果某个特定的action需要使用不同于全局默认的动画,你只需要在该action标签里单独设置对应的动画属性即可——局部设置会自动覆盖全局默认值,比如:
<action android:id="@+id/action_special_transition" app:destination="@id/specialFragment" app:enterAnim="@animator/fade_in" app:exitAnim="@animator/fade_out"/>
这样设置后,所有没有单独配置动画的action都会自动使用你定义的全局默认动画,再也不用重复写那些属性啦!
内容的提问来源于stack exchange,提问作者Smedegaard
相关产品推荐
相关产品推荐

