设计一个简单的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地址

相关推荐
孤鸿玉21 分钟前
[Flutter小试牛刀] 低配版signals,添加多层监听链
android·前端·响应式设计
雨和卡布奇诺23 分钟前
LiveData源码浅析
android
淡蓝色_justin26 分钟前
Hilt-plus 简介
android·android jetpack
app1e2341 小时前
ctfshow web入门 命令执行(29-77)
android·前端
恋猫de小郭3 小时前
Flutter 在 Dart 3.8 开始支持 Null-Aware Elements 语法,自动识别集合里的空元素
android·前端·flutter
fatiaozhang95274 小时前
咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包
android·电视盒子·av1·机顶盒rom·魔百盒刷机
_小马快跑_4 小时前
玩转 ImageView.ScaleType:图片的缩放与裁剪技巧
android
Lei活在当下4 小时前
【现代 Android APP 架构】02. UI 层的职责与具体实现
android·架构·android jetpack
_一条咸鱼_4 小时前
揭秘 Android 高级工程师面试秘籍:从源码到实战全方位剖析
android·面试·android jetpack