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 密集型应用开发。

相关推荐
测试员周周2 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
杜子不疼.4 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号34 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
晓梦林4 小时前
cp520靶场学习笔记
android·笔记·学习
sycmancia5 小时前
Qt——编辑交互功能的实现
开发语言·qt
石山代码6 小时前
C++ 内存分区 堆区
java·开发语言·c++
无风听海6 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠7 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
LuminousCPP7 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
有味道的男人7 小时前
Open Claw对接1688平台
android·rxjava