【问题标题】:how to remove default animation transition when using navigation component in Android?在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)

    }


}

【问题讨论】:

    标签: android kotlin android-architecture-components android-jetpack android-navigation


    【解决方案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 测试变得不稳定?
      猜你喜欢
      • 2020-01-06
      • 2018-12-22
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多