You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin的MotionLayout中从指定时长位置启动动画?

在MotionLayout中从指定时间位置启动动画(Kotlin实现)

要实现从10秒动画的第7秒位置启动,核心是利用MotionLayout的进度控制——MotionLayout的动画进度范围是0f(起始状态)到1f(结束状态),第7秒对应的进度为7/10=0.7f。具体实现步骤如下:

1. 计算初始进度

先把目标起始时间(7秒)转换成对应的进度值:

val totalDuration = 10000L // 总过渡时长,单位毫秒(10秒)
val startAtTime = 7000L    // 要启动的时间点,单位毫秒(7秒)
val initialProgress = startAtTime.toFloat() / totalDuration.toFloat() // 结果为0.7f

2. 设置初始进度并启动动画

在视图加载完成后,给MotionLayout设置初始进度,再启动动画:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val motionLayout = findViewById<MotionLayout>(R.id.motion_layout)
        val totalDuration = 10000L
        val startAtTime = 7000L

        // 计算初始进度
        val initialProgress = startAtTime.toFloat() / totalDuration.toFloat()

        // 直接跳转到7秒对应的位置
        motionLayout.progress = initialProgress

        // 启动动画(根据你的过渡方向选择:transitionToEnd/transitionToStart)
        motionLayout.transitionToEnd()
    }
}

灵活适配XML配置的时长

如果你的过渡时长是在XML的<Transition>标签中通过app:motionDuration设置的,可以直接读取该值,避免硬编码:

// 读取XML中设置的过渡时长
val totalDuration = motionLayout.transitionDuration.toLong()
val startAtTime = 7000L
val initialProgress = startAtTime.toFloat() / totalDuration.toFloat()

注意事项

  • 确保在视图初始化完成后执行上述代码,比如在onCreate(Activity)或onViewCreated(Fragment)中调用。
  • 如果动画需要反向执行,将transitionToEnd()替换为transitionToStart()即可。

内容的提问来源于stack exchange,提问作者Mustafa Dogan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:36:21