DoggyZhang 09153ff4bb feat: 更新一波库 vor 4 Monaten
..
src 32b457c5dc feat: 整理项目并编译通过 vor 4 Monaten
.gitignore 238e55aabd init vor 5 Monaten
CLAUDE.md 238e55aabd init vor 5 Monaten
README.md 238e55aabd init vor 5 Monaten
build.gradle 09153ff4bb feat: 更新一波库 vor 4 Monaten
consumer-rules.pro 238e55aabd init vor 5 Monaten
proguard-rules.pro 238e55aabd init vor 5 Monaten

README.md

动效播放框架

功能说明

  • 提供统一的动效播放接口,方便集成svga、webp、mp4等动效播放集成
  • 提供动效播放优先级队列管理能力

框架使用说明

动效视图

//动效视图统一使用EffectView
<com.adealink.frame.effect.view.EffectView
    android:id="@+id/effect_view"
    android:layout_width="200dp"
    android:layout_height="200dp" />

动效播放控制

特定动效视图动效播放控制

EffectView提供了add、play、pause、stop共4个动效播放控制方法

//play是默认的动效播放状态,用于启动动效播放
binding.effectView.play()

//add不修改播放状态,用于往动效队列增加待播放动效资源
binding.effectView.add(SVGAEffectEntity("rose.svga", PathType.ASSERT))

//pause设置动效播放为暂停状态,暂停状态会完整当前正在播放动效,不会再启动下个动效播放,但可以动效队列可以继续接收动效
binding.effectView.pause()

//stop设置动效播放为停止状态,停止状态会立即终止动效播放,同时清空当前动效队列,并且不会再继续接收新动效
binding.effectView.stop()

全局动效播放控制

val effect: IEffect by lazy { Effect.create(EffectConfig()) }
effect.play() //启动所有动效播放
effect.pause() //暂停所有动效播放,不会清空所有播放队列
effect.stop() //停止所有动效播放,会清空所有播放队列

动效播放优先级控制

动效播放框架集成了动效播放队列管理,并提供了动效优先级管理能力

//EffectEntity提供了priority动效优先级控制字段
abstract class IEffectEntity {
    /**
     * priority为20位字符串,按字典顺序排序,前10位为小写英文字母,可用于外部定义动效分类优先级,后10位使用generatePrioritySuffix()方法生成的递增数字序列,用于同类优先级动效按先后顺序入队
     */
    open val priority: String = defaultPriority
}

//优先级示例
"aaaaaaaaaa0000000000" > "aaaaaaaaaa0000000001" > "bbbbbbbbbb0000000002" > "bbbbbbbbbb0000000003"

拓展动效类型

动效播放框架支持在不修改动效框架的前提下,拓展支持任意类型的动效播放,下面以SVGA动效支持为例进行说明

实现支持具体动效播放的EffectView

package com.adealink.frame.effect.svga

//实现IEffectView接口,实现类需要keep不能混淆
@Keep
class SVGAEffectView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : SVGAImageView(context, attrs, defStyleAttr), IEffectView

实现具体动效类型描述实体

enum class PathType {
    ASSERT,
    URL
}

//实现IEffectEntity接口,定义effectViewClazz路径,用于反射实例具体视图
data class SVGAEffectEntity(
    override val path: String,
    val pathType: PathType,
    val loopCount: Int = 1, //播放次数,<=0表示无限次
    override val priority: String = defaultPriority
) : IEffectEntity<SVGAEffectView>() {

    override fun createEffectView(
        ctx: Context,
        attrs: AttributeSet?,
        defStyleAttr: Int
    ): SVGAEffectView {
        return SVGAEffectView(ctx, attrs, defStyleAttr)
    }

}

IEffectView和IEffectEntity会作为动效框架基础包提供,具体动效类型拓展包基于该base构建,项目只需要增加拓展包依赖即可完成新动效类型支持