Navigation默认的透明度动画,只有300毫秒,通过BottomNavigationView切换fragment时,几乎看不到过渡动画的效果,开始还以为没有动画。

开始在网上查找相关资料,最后找到这个比较靠谱:
https://stackoverflow.com/questions/61541455/animation-for-bottomnavigation-fragments-with-architecture-navigation-components

参考上面资料写了如下代码,通过这种方式确定添加上了Navigation导航fragment时的自定义过渡动画,但是有一个问题,当按手机的返回键时,NavHostFragment容器中的fragment改变了,但是BottomNavigationView中的item选中状态没有跟着改变,如果要使它们能同步,势必要设置Navigation导航响应系统返回键时,让底部导航也做出相应的item选中状态。

    private fun initNavigationAndBottomNavView(navController: NavController) {val options = NavOptions.Builder().setLaunchSingleTop(true).setEnterAnim(R.anim.nav_default_enter_anim)//设置fragment进入动画.setExitAnim(R.anim.nav_default_exit_anim)//设置fragment退出动画.setPopUpTo(navController.graph.startDestination, false).build()//使用下面这种方式把navigation与BottomNavigationView关联起来binding.navView.setOnNavigationItemSelectedListener {when (it.itemId) {R.id.navigation_home -> {navController.navigate(R.id.navigation_home, null, options)}R.id.navigation_dashboard -> {navController.navigate(R.id.navigation_dashboard, null, options)}R.id.navigation_notifications -> {navController.navigate(R.id.navigation_notifications, null, options)}}true}//为了避免出现相同的item选择情况,进行如下设置binding.navView.setOnNavigationItemReselectedListener { item ->return@setOnNavigationItemReselectedListener}}

最好的做法还是使用官方的提供的方式,通过setupWithNavController方法让底部导航和navigation关联起来:

    override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)val navView: BottomNavigationView = binding.navView//获取Navigation的导航控制器 NavControllerval navHostFragment =supportFragmentManager.findFragmentById(binding.navHostFragmentActivityMain.id) as NavHostFragmentval navController = navHostFragment.navController//通过setupWithNavController方法让底部导航和navigation关联起来navView.setupWithNavController(navController)//initNavigationAndBottomNavView(navController)}

通过分析源码得知通过setupWithNavController方式关联navigation最终设置动画的目标代码如下图:

到了这里大家应该知道怎么办了吧? 通过Android的资源文件覆盖机制,我们只要覆盖上面设置动画的代码所引用的资源文件,然后在资源文件中定义我自己的过渡动画就行了,在res目录下新建animator文件夹,然后在animator文件夹中新建要覆盖的资源文件即可。

nav_default_enter_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="700"android:fromYDelta="100%p"android:toYDelta="0" /><alphaandroid:duration="700"android:fromAlpha="0.0"android:toAlpha="1.0" />
</set>

nav_default_exit_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:duration="700"android:fromYDelta="0"android:toYDelta="-100%p" /><alphaandroid:duration="700"android:fromAlpha="1.0"android:toAlpha="0.0" />
</set>

我这里是覆盖了默认的fragment的进入和退出动画,然后经过测试效果完美达到预期,也不会留下任何bug。

BottomNavigationView+Navigation 添加底部导航菜单切换时的fragment过渡动画animation相关推荐

  1. 安卓开发 底部导航图标切换时动画效果_安卓10系统终于来了,流畅度堪比苹果?...

    经过Android多年的发展,系统的流畅性和手感每年都在逐步改进.很明显,谷歌一直在朝着这个目标努力.而谷歌也是在9月4日正式推出了安卓10系统. 除了大幅度提高流畅度外,安卓10还添加了原生手势导航 ...

  2. 安卓开发 底部导航图标切换时动画效果_体验安卓 10:好用百倍都不止!

    十万人测评俱乐部 Q群:737976088 资源置换合作请加VX:15216685489 谷歌正式发布了 Android 10,这是安卓的第十个大版本更新. 雷科技(微信:leitech)在第一时间将 ...

  3. mui 底部导航菜单功能(原创)

    简单版 <!DOCTYPE html> <html><head><meta charset="UTF-8"><title> ...

  4. Android中的底部导航栏切换TabContainerView

    前言:在GitHub上看到一个框架,实现底部导航栏切换,感觉不错,就在这里总结一下. 参考:https://www.jianshu.com/p/9aaff43bbf9f https://github. ...

  5. 微信小程序添加底部导航栏

    我们平时上微信可以看到,微信的底部是4个导航栏选项进行切换的,我们自己开发小程序时,如果要添加像微信那样的底部导航栏的话,其实实现方式非常简单,便捷. 在微信小程序开发IDE中,我们新建一个小程序项目 ...

  6. Android底部导航栏切换页面填坑

    ** Android底部导航栏切换页面填坑 ** 这个效果的实现关键点就是给选项赋予两种状态,focused和normal,在主程序中用监听判断是否被选中,就给被选中的选项设focused为true, ...

  7. HBuilder开发旅游类APP(三) ----- 给APP添加底部导航栏(底部选项卡)

    HBuilder开发旅游类APP(三) ----- 给APP添加底部导航栏(底部选项卡) 作者:班尼科 本博文是本人原创,喜欢请给我点赞,转载请注明出处哦. 标签: 旅游 HBuilder H5+ M ...

  8. html仿微信公众号底部菜单代码,模仿微信公众号底部导航菜单

    模仿微信公众号底部导航菜单 demo *{ margin:0; padding:0; box-sizing: border-box; } body{ background: #fff; font-si ...

  9. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

最新文章

  1. iOS 四种保存数据的方式!
  2. POJ2104 K-th Number [分块做法]
  3. linuxliveu盘怎么用_U盘数据如何恢复?U盘打不开怎么办?
  4. DevOps通用及版本控制面试题
  5. C语言的“编译时多态”
  6. python paramiko invoke_shell_Python,paramiko,invoke_shell和丑陋的字符
  7. 360手机浏览器_网信办:UC、QQ、360、搜狗等8款手机浏览器被纳入首批整治范围...
  8. 微信小程序 防连点时间_微信小程序防止重复点击
  9. bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合
  10. 【过拟合】再也不用担心过拟合的问题了
  11. 收集java精确截取字符串
  12. cryptojs AES加密
  13. 数独游戏技巧从入门到精通_免费教学视频数独阶梯训练让孩子从入门到精通,数学思维直线上升!...
  14. 怎么提取伴奏?只要三招即可快速搞定,附带详细教程
  15. 数据校验validation
  16. pyqt5背景色设置使用css或者是调色板
  17. 网络安全——渗透综合实验
  18. Openpyxl 修改单元格长宽
  19. windows7蓝牙怎么打开_windows7系统如何调整字体大小
  20. raid5数据丢失后应该怎么做才能提高数据恢复成功率?

热门文章

  1. VMware中kali2022通过物理机代理上网(桥接模式)
  2. cisco理论---以太通道端口会聚协议(PAgP)与LACP的区别
  3. Odoo 创建帐套期初余额,科目初始化How to configure Opening Entries/Balance
  4. Python编程之文件操作
  5. NirCmd-v2.52使用说明中文译本
  6. IOException:Sharing Violation on Path
  7. (二)强网杯2019[随便注]
  8. 解决SecureFX无法连接linux服务器
  9. AR模型,MA模型,ARMA模型,GARCH模型
  10. 【专题】用ST表解决RMQ刷题总结