Kotlin扩展简化Android动画开发

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
        }
    }
}

最佳实践建议:

  1. 将扩展函数统一放在 AnimationExtensions.kt 文件中
  2. 使用 @JvmOverloads 注解支持 Java 调用
  3. 为常用插值器创建预置参数
  4. 结合协程实现更复杂的动画序列
  5. 使用 withLayer() 提升动画性能

通过合理使用 Kotlin Extensions,可以让动画代码:

  • 减少 40%-60% 的样板代码
  • 提高可读性和维护性
  • 保持原生动画 API 的灵活性
  • 方便团队统一动画风格

这种模式特别适合需要频繁实现复杂动效的 UI 密集型应用开发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值