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

相关推荐
Android疑难杂症32 分钟前
鸿蒙Notification Kit通知服务开发快速指南
android·前端·harmonyos
lcanfly35 分钟前
Mysql作业5
android·数据库·mysql
进阶的小叮当2 小时前
Vue代码打包成apk?Cordova帮你解决!
android·前端·javascript
-指短琴长-3 小时前
MySQL快速入门——基本查询(上)
android·数据库·mysql
下位子3 小时前
『OpenGL学习滤镜相机』- Day6: EGL 与 GLSurfaceView 深入理解
android·opengl
java干货4 小时前
MySQL “灵异事件”:我 INSERT id=11,为什么被 UPDATE id=10 锁住了?
android·数据库·mysql
正经教主4 小时前
【App开发】ADB 详细使用教程- Android 开发新人指南
android·adb
gx23485 小时前
MySQL-5-触发器和储存过程
android·mysql·adb
六件套是我12 小时前
redission实现延时队列
android·java·servlet
00后程序员张17 小时前
iOS 上架费用全解析 开发者账号、App 审核、工具使用与开心上架(Appuploader)免 Mac 成本优化指南
android·macos·ios·小程序·uni-app·cocoa·iphone