Kotlin扩展简化Android动画开发

1. 基础 View 动画扩展

为 View 添加常用动画的快捷方法

kotlin 复制代码
// 淡出动画
fun View.fadeOut(duration: Long = 300) {
    animate()
        .alpha(0f)
        .setDuration(duration)
        .setInterpolator(AccelerateInterpolator())
        .start()
}

// 使用示例
view.fadeOut() // 默认 300ms
view.fadeOut(500) // 自定义时长

2. 链式动画扩展

支持属性组合的流畅写法

kotlin 复制代码
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. 动画监听简化

用高阶函数简化监听器

kotlin 复制代码
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 扩展

封装通用数值动画

kotlin 复制代码
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. 动画集合扩展

简化动画序列组合

kotlin 复制代码
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. 综合使用示例

kotlin 复制代码
// 实现一个组合动画效果
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 密集型应用开发。

相关推荐
1024奇点13 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch14 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
好的佩奇14 小时前
蓝牙之通信架构
android·flutter·蓝牙
FlightYe15 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
Knight_AL15 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing0316 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
诸神黄昏EX16 小时前
Android fw BatteryService
android
by2099916 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
alexhilton16 小时前
提升 Android Compose 页面的流畅度
android·kotlin·android jetpack
砚底藏山河16 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融