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

how to remove default animation transition when using navigation component in Android?

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

我想删除那个动画。这是我在 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)

    }


}

根据this issue

NavigationUI is a set of helpers which follow the material design guidelines and that includes animations between BottomNavigationView items.

您会在 Transitions section of the Material design guidelines 中注意到,他们明确指出:

Transition between active and inactive bottom navigation destinations using a cross-fade animation.

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

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

The default animations provided by NavigationUI have been sped up from 400ms to 220ms to match the default animation speed of activities and fragments. b/130055522

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

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

更新:最新的文件路径请看下面的评论。


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

  • 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()

@HvSimon 提供了一个设置全局默认值的解决方案,但对我不起作用。 另外我想 choose/disable 每个转换的动画。

您可以使用 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)