在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中使用导航组件时如何删除默认动画过渡?的主要内容,如果未能解决你的问题,请参考以下文章