MotionLayout实现的启动页无动画且无法跳转至下一个Fragment如何解决
修复方案
问题根因
你遇到的两个问题都是配置和代码漏写导致的:
- MotionLayout的过渡动画配置了点击触发、且自动过渡属性设为仅跳转到起始状态,不会自动播放
- Activity中仅配置了动画结束的监听逻辑,没有主动触发动画执行
1. 修改MotionLayout过渡配置
调整Transition节点的属性,删除不必要的点击触发规则:
<Transition motion:constraintSetEnd="@+id/end" motion:constraintSetStart="@id/start" motion:duration="1000" motion:autoTransition="animateToEnd"> <KeyFrameSet> <KeyAttribute motion:motionTarget="@+id/imageView8" motion:framePosition="0" android:scaleX="1.2" /> <KeyAttribute motion:motionTarget="@+id/imageView8" motion:framePosition="0" android:scaleY="1.2" /> <KeyAttribute motion:motionTarget="@+id/imageView8" motion:framePosition="20" android:scaleX="0.7" /> <KeyAttribute motion:motionTarget="@+id/imageView8" motion:framePosition="20" android:scaleY="0.7" /> <KeyAttribute motion:motionTarget="@+id/imageView8" motion:framePosition="40" android:scaleX="0.7" /> <KeyAttribute motion:motionTarget="@+id/imageView8" motion:framePosition="40" android:scaleY="0.7" /> <KeyAttribute motion:motionTarget="@+id/imageView8" motion:framePosition="100" android:scaleX="50.0" /> <KeyAttribute motion:motionTarget="@+id/imageView8" motion:framePosition="100" android:scaleY="50.0" /> </KeyFrameSet> </Transition> <ConstraintSet android:id="@+id/start"> <Constraint android:layout_height="287dp" android:layout_width="313dp" android:id="@+id/imageView8" motion:layout_constraintBottom_toBottomOf="parent" motion:layout_constraintEnd_toEndOf="parent" motion:layout_constraintStart_toStartOf="parent" motion:layout_constraintVertical_bias="0.487" android:layout_marginBottom="180dp" /> </ConstraintSet> <ConstraintSet android:id="@+id/end"> <Constraint android:layout_height="335dp" android:layout_width="303dp" android:id="@+id/imageView8" motion:layout_constraintTop_toTopOf="parent" motion:layout_constraintStart_toStartOf="parent" motion:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="293dp"/> </ConstraintSet>
说明:额外删除了start约束里不存在的imageView7依赖,把end约束里的绝对定位替换为通用的marginTop适配不同分辨率设备
2. 修改SplashActivity代码
添加主动触发动画的逻辑,避免autoTransition因场景加载延迟不生效:
class SplashActivity : AppCompatActivity() { private lateinit var binding: ActivitySplashBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportActionBar?.hide() binding = ActivitySplashBinding.inflate(layoutInflater) setContentView(binding.root) binding.motionLayout.setTransitionListener(object : MotionLayout.TransitionListener { override fun onTransitionStarted( motionLayout: MotionLayout?, startId: Int, endId: Int ) { } override fun onTransitionChange( motionLayout: MotionLayout?, startId: Int, endId: Int, progress: Float ) { } override fun onTransitionCompleted(motionLayout: MotionLayout?, currentId: Int) { val intent = Intent(this@SplashActivity, MainActivity::class.java) startActivity(intent) finish() } override fun onTransitionTrigger( motionLayout: MotionLayout?, triggerId: Int, positive: Boolean, progress: Float ) { } }) // 新增:主动触发动画执行 binding.motionLayout.transitionToEnd() } }
内容的提问来源于stack exchange,提问作者waad Alshammari
相关产品推荐
相关产品推荐

