使用Navigation组件的Activity启动右滑转场动画卡顿问题咨询
问题排查与解决方案
1. 移除重复导航代码(核心问题)
你在property_navigation中已经将nav_sub_property_purchase配置为起始目的地,NavHostFragment初始化时会自动加载该Fragment,你在onCreate中额外调用navController.navigate()会导致连续两次加载相同Fragment,冗余的布局绘制直接抢占动画渲染的主线程资源,是卡顿的核心诱因。
直接删除onCreate中的以下代码即可:
navController.navigate(R.id.nav_sub_property_purchase)
2. 调整转场动画调用时机
overridePendingTransition不要放在目标Activity的onCreate中,改为在跳转前的Activity调用startActivity()之后立即执行,避免动画启动被Activity初始化流程阻塞:
// 前序Activity的跳转逻辑 startActivity(Intent(this, SecondActivity::class.java)) overridePendingTransition(R.anim.slide_in_right, R.anim.hold)
3. 优化动画参数
当前slide_in_right.xml的平移距离设为300%屏幕宽度,1000ms的时长需要计算更多帧,低端设备极易掉帧。建议修改为符合系统规范的参数:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:duration="300" android:fromXDelta="100%" android:toXDelta="0%" /> </set>
4. 替换hold动画为透明主题解决黑屏问题
你使用的hold动画完全是冗余逻辑,要避免启动黑屏,直接给SecondActivity配置透明主题即可,同时可以移除hold动画:
在styles.xml中添加主题:
<style name="TransparentSecondActivityTheme" parent="你的App基础主题"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowAnimationStyle">@null</item> </style>
然后在AndroidManifest.xml中给SecondActivity应用该主题。
5. 排查ViewModel耗时操作
检查PropertyViewModel的构造方法、init代码块中是否存在磁盘读写、网络请求、大量数据计算等耗时操作,如有请全部放到子线程/协程非主线程调度器中执行,避免阻塞主线程影响动画渲染。
额外优化建议
如果SubjectPropertyPurchaseFragment布局层级复杂、包含大量图片,可开启硬件加速(主题中添加<item name="android:hardwareAccelerated">true</item>)、用merge标签减少布局层级、压缩图片资源,降低首次绘制的性能压力。
内容的提问来源于stack exchange,提问作者Andrain

