1. 基础 View 动画扩展
为 View 添加常用动画的快捷方法
// 淡出动画
fun View.fadeOut(duration: Long = 300) {
animate()
.alpha(0f)
.setDuration(duration)
.setInterpolator(AccelerateInterpolator())
.start()
}
// 使用示例
view.fadeOut() // 默认 300ms
view.fadeOut(500) // 自定义时长
2. 链式动画扩展
支持属性组合的流畅写法
fun View.animateProperties(
duration: Long = 300,
action: View.() -> Unit
) {
animate()
.setDuration(duration)
.withLayer()
.withAction { action() }
.start()
}
// 使用示例
view.animateProperties(500) {
translationX(100f)
scaleX(1.5f)
rotation(45f)
}
3. 动画监听简化
用高阶函数简化监听器
fun ViewPropertyAnimator.onComplete(action: () -> Unit) {
setListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
action()
}
})
}
// 使用示例
view.animate()
.alpha(0f)
.setDuration(300)
.onComplete {
view.visibility = View.GONE
}
4. ValueAnimator 扩展
封装通用数值动画
fun ValueAnimator.customAnimator(
vararg values: Any,
duration: Long = 300,
interpolator: Interpolator = AccelerateDecelerateInterpolator(),
update: (ValueAnimator) -> Unit
) {
setObjectValues(*values)
setDuration(duration)
setInterpolator(interpolator)
addUpdateListener { update(it) }
start()
}
// 使用示例
ValueAnimator().customAnimator(0f, 360f) { anim ->
val value = anim.animatedValue as Float
view.rotation = value
}
5. 动画集合扩展
简化动画序列组合
fun AnimatorSet.playSequentially(vararg animators: Animator.() -> Unit) {
val list = animators.map {
AnimatorSet().apply { it() }
}
playSequentially(list)
}
// 使用示例
AnimatorSet().playSequentially(
{ view.animate().alpha(0f) },
{ view.animate().translationY(100f) },
{ view.animate().rotation(90f) }
).start()
6. 综合使用示例
// 实现一个组合动画效果
fun View.bounceHide() {
animateProperties(duration = 400) {
scaleX(0.8f)
scaleY(0.8f)
alpha(0.5f)
}.onComplete {
animateProperties(300) {
scaleX(1f)
scaleY(1f)
alpha(0f)
}.onComplete {
visibility = View.GONE
}
}
}
最佳实践建议:
- 将扩展函数统一放在
AnimationExtensions.kt
文件中 - 使用
@JvmOverloads
注解支持 Java 调用 - 为常用插值器创建预置参数
- 结合协程实现更复杂的动画序列
- 使用
withLayer()
提升动画性能
通过合理使用 Kotlin Extensions,可以让动画代码:
- 减少 40%-60% 的样板代码
- 提高可读性和维护性
- 保持原生动画 API 的灵活性
- 方便团队统一动画风格
这种模式特别适合需要频繁实现复杂动效的 UI 密集型应用开发。