在Android中使用导航组件时如何删除默认动画过渡?

Posted

技术标签:

【中文标题】在Android中使用导航组件时如何删除默认动画过渡?【英文标题】:how to remove default animation transition when using navigation component in Android? 【发布时间】:2019-10-03 05:58:15 【问题描述】:

我正在使用导航组件,并且我在主活动中有一个底部导航视图。当我在该底部导航视图中点击选项卡时,似乎在片段出现时动画淡入淡出。好像没有手动设置动画,好像默认会有动画。

我想删除那个动画。这是我在 Main Activity 中使用的代码。

class MainActivity : AppCompatActivity(), NavController.OnDestinationChangedListener 

    private lateinit var navController : NavController
    lateinit var destinationTitleTextView : TextView
    lateinit var progressBar : ProgressBar
    lateinit var topToolbar : Toolbar
    lateinit var bottomNavigationView : BottomNavigationView

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        FirebaseApp.initializeApp(this)

        // Initial Setup views
        navController = Navigation.findNavController(this,R.id.nav_host_fragment)
        setupBottomNavMenu(navController)
        setupActionBar(navController)
        setUpViewDeclaration()


        // Add Listeners
        navController.addOnDestinationChangedListener(this)


    



    private fun setUpViewDeclaration() 
        destinationTitleTextView = findViewById(R.id.destination_label_text_view)
        progressBar = findViewById(R.id.progressBar_main_activity)
        topToolbar = findViewById(R.id.top_toolbar)
        bottomNavigationView = findViewById(R.id.bottom_nav)

    

    private fun setupBottomNavMenu(navController: NavController) 
        bottom_nav.setupWithNavController(navController)
    


    private fun setupActionBar(navController: NavController) 

        setSupportActionBar(top_toolbar)
        supportActionBar?.setDisplayShowTitleEnabled(false)

        // set up top hierarchy destination
        val appBarConfiguration = AppBarConfiguration(setOf(
            R.id.destination_home,
            R.id.destination_search,
            R.id.destination_user_control,
            R.id.destination_create_event)
        )

        top_toolbar.setupWithNavController(navController,appBarConfiguration)

    



【问题讨论】:

【参考方案1】:

更新:最新文件路径请见下方评论。


您可以添加动画文件来替换默认动画。

res/anim/nav_default_enter_anim.xml res/anim/nav_default_exit_anim.xml res/anim/nav_default_pop_enter_anim.xml res/anim/nav_default_pop_exit_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--Empty to disable animation-->
</set>

[Navigation Component] I can`t change animation from NavigationUI.setupWithNavController()

【讨论】:

只是添加文件并没有改变我的动画。我必须在哪里引用它们? 一般不需要引用。你有完全相同的文件名和路径吗? 我愿意。我可以通过将动画提供给navigate() 来使其工作 请注意,这导航组件支持,并且会在未来的导航版本中中断,并且在使用 namespaced resources 时在工具级别不受支持。 文件应该在res\animator包中【参考方案2】:

@HvSimon 提供了一个解决方案来设置对我不起作用的全局默认值。 另外我想选择/禁用每个过渡的动画。

您可以使用NavOptions 对象向navigate() 提供其他参数。

首先在您的 res 文件夹中创建一个动画,例如 res/anim/nav_enter_anim.xml(没有动画为空):

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!--Empty to disable animation-->
</set>

为每个动画创建一个动画 xml 或重复使用相同的动画。然后为您的navigate() 调用提供一个NavOptions 对象,如下所示:

val animationOptions = NavOptions.Builder().setEnterAnim(R.anim.nav_enter_anim)
            .setExitAnim(R.anim.nav_exit_anim)
            .setPopEnterAnim(R.anim.nav_pop_enter_anim)
            .setPopExitAnim(R.anim.nav_pop_exit_anim).build()

findNavController().navigate(MyFragmentDirections.toMainActivity(), animationOptions)

【讨论】:

【参考方案3】:

根据this issue:

NavigationUI 是一组遵循材料设计指南的助手,其中包括 BottomNavigationView 项之间的动画。

你会注意到Transitions section of the Material design guidelines,他们特别声明:

使用交叉淡入淡出动画在活动和非活动底部导航目的地之间转换。

因此 Navigation 不提供任何用于自定义或删除动画的 API。

请注意,Navigation 2.1.0-alpha03 release 确实有此更改:

NavigationUI 提供的默认动画已从 400 毫秒加速到 220 毫秒,以匹配活动和片段的默认动画速度。 b/130055522

所以我建议 1) 升级到 Navigation 2.1.0-alpha03 或更高版本以获取更新的动画和 2) 遵循材料设计指南。

当然,NavigationUI 是完全可选的,您当然可以使用 NavigationUI 在后台使用的 underlying OnDestinationChangedListener 做任何您想做的事情。

【讨论】:

可以在操作系统设置中禁用这些动画,还是我们应该担心它们会使 Espresso 测试变得不稳定?

以上是关于在Android中使用导航组件时如何删除默认动画过渡?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除默认导航路线动画

如何在动态渲染底部导航视图时删除动画?

在 Nuxt 中切换导航动画

在Recycler视图上添加图像视图时,Android导航抽屉动画滞后/减速

如何动画添加或删除 Android ListView 行

使用Android导航组件时如何从后台获取片段?