如何以编程方式滚动同步的 MotionLayout+AppBarLayout?

How to scroll a sync'd up MotionLayout+AppBarLayout programmatically?

考虑 Google 的演示中的以下 Coordinator+AppBar+MotionLayout and its MotionScene。这会创建一个 MotionLayout,它会在用户滚动时同步其过渡进度。

视频预览:https://i.imgur.com/1MnPB8R.mp4

但是,我想在 Kotlin 中以编程方式执行此操作。这是我失败的尝试。

val motion = findViewById<MotionLayout>(R.id.constraintToolbar)
motion.transitionToState(R.id.end)

以上会导致 MotionLayout 进行动画处理,但完成后会立即闪烁回 start 状态。 AppBarLayout 也不会改变高度。

val appbar = findViewById<AppBarLayout>(R.id.app_bar)
val scrollable = findViewById<NestedScrollView>(R.id.scrollable)
val s = if(motion.progress==0F) appbar.totalScrollRange else 0
scrollable.smoothScrollTo(0, s)

上面滚动了NestedScrollView,但是AppBarLayout和MotionLayout没有收到滚动事件

val s = if(motion.progress==0F)-appbar.totalScrollRange else 0
val appbar = findViewById<AppBarLayout>(R.id.app_bar)
appbar.scrollTo(0,s)
appbar.offsetTopAndBottom(s)

上面移动了 AppBarLayout,完全打破了布局。

如何以编程方式触发此滚动?

如果只有 2 个状态,您应该尝试 setExpanded()

val e = motion.progress != 0F
appbar.setExpanded(e, true)