在 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)
我正在使用导航组件,并且在主 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)