2
ViewCompat.setOnApplyWindowInsetsListener(fab) { view, insets ->
        val lp = fab.layoutParams as ConstraintLayout.LayoutParams
        lp.bottomMargin += insets.systemWindowInsetBottom
        fab.layoutParams = lp
        insets
    }

OnApplyWindowInsetsListener尽管在侦听器中显式地使用了插图,但运动布局不会将任何窗口插图传递给孩子。

applyMotionScene当动作布局的属性设置为时,插入会正确应用false

4

2 回答 2

5
with(ml) { //ml -> your motionLayout id
                    updateState(R.id.start, ConstraintSet().apply {
                        clone(ml)
                        constrainHeight(viewWhichHeightNeedsToChange.id, height.dp + insets.systemWindowInsetTop)
                        applyTo(ml)
                    })
                    setState(R.id.end, ml.width, ml.height)
                    updateState(R.id.end, ConstraintSet().apply {
                        clone(ml)
                        constrainHeight(viewWhichHeightNeedsToChange.id, height.dp + insets.systemWindowInsetTop)
                        applyTo(ml)
                    })
                    setState(R.id.start, ml.width, ml.height)
                }

基本上,您需要在两个运动布局集中更新视图的填充/大小。如果有一种方法可以做到这一点而无需在状态之间切换,那就太好了。此代码在 setOnApplyWindowInsetsListener { } 中执行

androidx.constraintlayout:constraintlayout:2.0.0-beta3

于 2020-02-03T16:17:03.977 回答
3

您可以按照文档 getConstraintSet返回状态链接直接更新每个状态。

获取与一个id关联的ConstraintSet 这会返回一个指向约束集的链接 但是在大多数情况下都可以使用。createConstraintSet 制作一个更昂贵的副本。

ViewCompat.setOnApplyWindowInsetsListener(fab) { view, insets ->
    val bottom = lp.marginBottom + insets.systemWindowInsetBottom

    with(motionLaytout) {
        getConstraintSet(R.id.state_id).apply {
            setMargin(fab.id, ConstraintSet.BOTTOM, bottom)
        }

        getConstraintSet(R.id.another_state_id).apply {
            setMargin(fab.id, ConstraintSet.BOTTOM, bottom)
        }
    }

    insets
}
于 2021-06-15T10:40:01.497 回答