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

相关推荐
李艺为7 小时前
根据apk包名动态修改Android品牌与型号
android·开发语言
Tom4i9 小时前
【网络优化】Android 如何监听系统网络连接成功
android·网络
FrameNotWork9 小时前
HarmonyOS 与 Android 架构对比:从“写页面”到“设计系统”的差异
android·架构·harmonyos
TAEHENGV10 小时前
基本设置模块 Cordova 与 OpenHarmony 混合开发实战
android·java·数据库
屏息12 小时前
Android 低延迟流媒体播放器实战:基于 FFmpeg 6.1.1 的 RTSP/RTMP 解决方案
android
TeleostNaCl13 小时前
Kodi | 如何使用 ADB 无 root 备份 Android 版本 Kodi 的数据并导入到另一台设备中
android·经验分享·adb·电视盒子·智能电视·tv·智能tv
csj5013 小时前
安卓基础之《(10)—中级控件(4)对话框》
android
nono牛14 小时前
Android.bp 配置文件详解---gatekeeperd
android
来来走走14 小时前
Android开发(kotlin) 开发一个简单天气应用
android·kotlin
SweetCode15 小时前
汉诺塔问题
android·java·数据库