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

如何在MotionLayout动画结束时修改其通过include引入的嵌套布局内文本的textSize

实现方案

方案1:通过TransitionListener监听动画结束修改(代码实现)

这是最直接的实现方式,步骤如下:

  • 首先在Activity/Fragment中获取MotionLayout实例,以及include布局内的3个TextView实例
  • 给MotionLayout设置过渡监听,在onTransitionCompleted回调中修改字号

Kotlin代码示例:

val motionLayout = findViewById<MotionLayout>(R.id.motion_layout)
// 获取include的根布局
val includeLayout = findViewById<ConstraintLayout>(R.id.incl)
val tv1 = includeLayout.findViewById<TextView>(R.id.tv1)
val tv2 = includeLayout.findViewById<TextView>(R.id.tv2)
val tv3 = includeLayout.findViewById<TextView>(R.id.tv3)

motionLayout.addTransitionListener(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) {
        // 动画结束后修改字号,指定单位为sp避免适配问题
        tv1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f)
        tv2.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f)
        tv3.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f)
    }

    override fun onTransitionTrigger(motionLayout: MotionLayout?, triggerId: Int, positive: Boolean, progress: Float) {}
})

Java代码示例:

MotionLayout motionLayout = findViewById(R.id.motion_layout);
ConstraintLayout includeLayout = findViewById(R.id.incl);
TextView tv1 = includeLayout.findViewById(R.id.tv1);
TextView tv2 = includeLayout.findViewById(R.id.tv2);
TextView tv3 = includeLayout.findViewById(R.id.tv3);

motionLayout.addTransitionListener(new MotionLayout.TransitionListener() {
    @Override
    public void onTransitionStarted(MotionLayout motionLayout, int startId, int endId) {}

    @Override
    public void onTransitionChange(MotionLayout motionLayout, int startId, int endId, float progress) {}

    @Override
    public void onTransitionCompleted(MotionLayout motionLayout, int currentId) {
        tv1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
        tv2.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
        tv3.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
    }

    @Override
    public void onTransitionTrigger(MotionLayout motionLayout, int triggerId, boolean positive, float progress) {}
});

方案2:在MotionScene中直接配置(无需额外代码)

MotionLayout支持直接识别include嵌套布局内的子View id,你可以直接在MotionScene的结束状态ConstraintSet中配置TextView的字号,动画过渡到结束状态时会自动应用属性:
在你的MotionScene xml文件中,找到对应结束状态的ConstraintSet,添加如下配置:

<ConstraintSet android:id="@+id/end">
    <!-- 保留原有其他控件的约束配置 -->
    <Constraint
        android:id="@id/tv1"
        android:textSize="20sp" />
    <Constraint
        android:id="@id/tv2"
        android:textSize="20sp" />
    <Constraint
        android:id="@id/tv3"
        android:textSize="20sp" />
</ConstraintSet>

如果你需要字号变化跟随动画进度平滑过渡,只需要给Transition节点添加motion:duration配置即可,无需额外修改。

注意:使用方案2时需要保证嵌套布局内的TextView id在整个MotionLayout的视图树中唯一,避免属性匹配错误。

内容的提问来源于stack exchange,提问作者Sayok Majumder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:39:04