如何在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
相关产品推荐
相关产品推荐

