设计一个简单的android动画库

设计一个通用的Android View动画库。这个库将会提供一组简单易用的API来创建和管理各种类型的动画。我们可以使用Kotlin来编写这个库,并利用Android的动画框架(如ObjectAnimatorValueAnimator等)来实现。

功能需求

  1. 基本动画支持:支持透明度、平移、旋转和缩放动画。
  2. 组合动画:支持顺序和并行动画。
  3. 自定义动画:允许用户自定义动画属性和时间。
  4. 回调:支持动画开始、结束和取消的回调。
  5. 便捷的API:提供链式调用的API,简化动画创建和管理。

目录结构

markdown 复制代码
markdown
复制代码
/src/main/java/com/example/animationlibrary
    - AnimationLibrary.kt
    - ViewExtensions.kt
    - AnimListener.kt
    - AnimationType.kt

代码实现

AnimationLibrary.kt

kotlin 复制代码
kotlin
复制代码
package com.example.animationlibrary

import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.view.View

class AnimationLibrary {
    private val animatorSet = AnimatorSet()
    private val animators = mutableListOf<ObjectAnimator>()

    fun addAlphaAnimation(view: View, fromAlpha: Float, toAlpha: Float, duration: Long): AnimationLibrary {
        val animator = ObjectAnimator.ofFloat(view, "alpha", fromAlpha, toAlpha).apply {
            this.duration = duration
        }
        animators.add(animator)
        return this
    }

    fun addTranslationAnimation(view: View, fromX: Float, toX: Float, fromY: Float, toY: Float, duration: Long): AnimationLibrary {
        val animatorX = ObjectAnimator.ofFloat(view, "translationX", fromX, toX).apply {
            this.duration = duration
        }
        val animatorY = ObjectAnimator.ofFloat(view, "translationY", fromY, toY).apply {
            this.duration = duration
        }
        animators.add(animatorX)
        animators.add(animatorY)
        return this
    }

    fun addRotationAnimation(view: View, fromDegrees: Float, toDegrees: Float, duration: Long): AnimationLibrary {
        val animator = ObjectAnimator.ofFloat(view, "rotation", fromDegrees, toDegrees).apply {
            this.duration = duration
        }
        animators.add(animator)
        return this
    }

    fun addScaleAnimation(view: View, fromScaleX: Float, toScaleX: Float, fromScaleY: Float, toScaleY: Float, duration: Long): AnimationLibrary {
        val animatorX = ObjectAnimator.ofFloat(view, "scaleX", fromScaleX, toScaleX).apply {
            this.duration = duration
        }
        val animatorY = ObjectAnimator.ofFloat(view, "scaleY", fromScaleY, toScaleY).apply {
            this.duration = duration
        }
        animators.add(animatorX)
        animators.add(animatorY)
        return this
    }

    fun setDuration(duration: Long): AnimationLibrary {
        animators.forEach { it.duration = duration }
        return this
    }

    fun setListener(listener: AnimListener): AnimationLibrary {
        animatorSet.addListener(listener)
        return this
    }

    fun start() {
        animatorSet.playTogether(animators)
        animatorSet.start()
    }
}

ViewExtensions.kt

kotlin 复制代码
kotlin
复制代码
package com.example.animationlibrary

import android.view.View

fun View.animateAlpha(fromAlpha: Float, toAlpha: Float, duration: Long): AnimationLibrary {
    return AnimationLibrary().addAlphaAnimation(this, fromAlpha, toAlpha, duration)
}

fun View.animateTranslation(fromX: Float, toX: Float, fromY: Float, toY: Float, duration: Long): AnimationLibrary {
    return AnimationLibrary().addTranslationAnimation(this, fromX, toX, fromY, toY, duration)
}

fun View.animateRotation(fromDegrees: Float, toDegrees: Float, duration: Long): AnimationLibrary {
    return AnimationLibrary().addRotationAnimation(this, fromDegrees, toDegrees, duration)
}

fun View.animateScale(fromScaleX: Float, toScaleX: Float, fromScaleY: Float, toScaleY: Float, duration: Long): AnimationLibrary {
    return AnimationLibrary().addScaleAnimation(this, fromScaleX, toScaleX, fromScaleY, toScaleY, duration)
}

AnimListener.kt

kotlin 复制代码
kotlin
复制代码
package com.example.animationlibrary

import android.animation.Animator

open class AnimListener : Animator.AnimatorListener {
    override fun onAnimationStart(animation: Animator) {}
    override fun onAnimationEnd(animation: Animator) {}
    override fun onAnimationCancel(animation: Animator) {}
    override fun onAnimationRepeat(animation: Animator) {}
}

AnimationType.kt

kotlin 复制代码
kotlin
复制代码
package com.example.animationlibrary

enum class AnimationType {
    ALPHA,
    TRANSLATION,
    ROTATION,
    SCALE
}

使用示例

在你的应用中,可以通过以下方式使用这个动画库:

kotlin 复制代码
kotlin
复制代码
import com.example.animationlibrary.animateAlpha
import com.example.animationlibrary.AnimListener

val myView: View = findViewById(R.id.my_view)

myView.animateAlpha(0f, 1f, 1000)
    .setListener(object : AnimListener() {
        override fun onAnimationEnd(animation: Animator) {
            // 动画结束后的操作
        }
    })
    .start()

通过这种方式,你可以非常方便地创建和管理动画,并且代码清晰简洁。这个库可以根据具体需求进一步扩展,例如添加更多的动画类型、支持更多的回调等。

上面的动画库支持曲线路径效果。通过使用 Path 类,你可以定义各种曲线路径,然后通过 ObjectAnimator 来沿着这些路径移动视图。例如,使用二次贝塞尔曲线或三次贝塞尔曲线来定义复杂的曲线路径。

要在现有的动画库基础上添加更多的动画效果,如烟花绽放和水滴效果,我们可以定义一些自定义的动画。可以利用 ObjectAnimatorValueAnimatorAnimatorSet 等工具来实现这些效果。

demo地址

相关推荐
心中有国也有家1 小时前
AtomGit Flutter 鸿蒙客户端: AnimatedScale 与 AnimatedContainer 联合实战
android·javascript·flutter·华为·harmonyos
恋猫de小郭2 小时前
Flutter Windows 开始支持 Impeller ,还修复了多窗口 bug
android·前端·flutter
鱼儿也有烦恼3 小时前
07.RecyclerView、SwipeRefreshLayout、SmartRefreshLayout
android
三少爷的鞋3 小时前
Kotlin Flow 深入解析:`stateIn()` 的真正核心,其实是 SharingStarted
android
心中有国也有家15 小时前
AtomGit Flutter 鸿蒙客户端:ModalBottomSheet 实战
android·javascript·学习·flutter·华为·harmonyos
YSoup16 小时前
Android Stuidio中下载TRAE插件依赖的JCEF后打不开
android
2401_8949155317 小时前
Geo搜索优化排名源码部署搭建全流程详解
android·开发语言·flask·php·精选
星释18 小时前
鸿蒙智能体开发实战:34.鸿蒙壁纸大师 - 提示词工程与优化
android·华为·harmonyos·鸿蒙
blanks202018 小时前
android 编译问题记录
android
bobuddy19 小时前
平台总线(platform bus)
android