如何让TransitionManager的ChangeTransform始终以旋转动画实现视图任意角度旋转?
解决ChangeTransform在180度旋转时自动切换动画的问题
我之前也踩过这个坑!ChangeTransform的默认逻辑确实有点“自作聪明”——它会自动计算两种动画路径(旋转 vs 平移/缩放翻转)的“性能成本”,当旋转角度为180度时,它判定后者的计算开销更小,就偷偷切换了动画类型,完全忽略我们想要纯粹旋转效果的需求。
要强制让它始终以旋转动画实现任意角度变换,有两个实用方案:
方案一:自定义ChangeTransform强制生成旋转动画
你可以继承ChangeTransform类,重写它的createAnimator方法,直接指定生成旋转属性动画,不让系统自动选择路径。示例代码如下:
class ForceRotateTransform : ChangeTransform() { override fun createAnimator( sceneRoot: ViewGroup, startValues: TransitionValues?, endValues: TransitionValues? ): Animator? { val targetView = endValues?.view ?: return super.createAnimator(sceneRoot, startValues, endValues) // 获取起始与目标旋转角度 val startRotation = startValues?.values[PROPNAME_ROTATION] as? Float ?: targetView.rotation val endRotation = endValues.values[PROPNAME_ROTATION] as? Float ?: targetView.rotation // 直接创建旋转属性动画,完全掌控动画类型 return ObjectAnimator.ofFloat(targetView, View.ROTATION, startRotation, endRotation).apply { duration = defaultDuration interpolator = AccelerateDecelerateInterpolator() } } }
使用时把原有的ChangeTransform替换成这个自定义类即可:
TransitionManager.beginDelayedTransition(sceneRoot, ForceRotateTransform()) // 设置目标旋转角度 targetView.rotation = 180f
方案二:直接用属性动画配合TransitionManager(更简洁)
如果不想自定义Transition,也可以绕过ChangeTransform的自动逻辑,直接用属性动画控制旋转,同时让TransitionManager处理其他视图的联动变化:
TransitionManager.beginDelayedTransition(sceneRoot) // 直接创建并启动旋转动画 ObjectAnimator.ofFloat(targetView, View.ROTATION, targetView.rotation, 180f).apply { duration = 300 // 自定义动画时长 start() }
这种方式更直接,完全掌控动画类型,不会出现系统擅自切换动画的问题。
如果你的视图还有缩放、平移等其他变换需要同步动画,方案一可以扩展自定义逻辑加入这些属性;方案二则可以把多个属性动画组合到AnimatorSet中统一执行。
内容的提问来源于stack exchange,提问作者JHH
相关产品推荐
相关产品推荐

