# 动效播放框架
功能说明
* 提供统一的动效播放接口,方便集成svga、webp、mp4等动效播放集成
* 提供动效播放优先级队列管理能力
## 框架使用说明
### 动效视图
```xml
//动效视图统一使用EffectView
```
### 动效播放控制
#### 特定动效视图动效播放控制
EffectView提供了add、play、pause、stop共4个动效播放控制方法
```kotlin
//play是默认的动效播放状态,用于启动动效播放
binding.effectView.play()
//add不修改播放状态,用于往动效队列增加待播放动效资源
binding.effectView.add(SVGAEffectEntity("rose.svga", PathType.ASSERT))
//pause设置动效播放为暂停状态,暂停状态会完整当前正在播放动效,不会再启动下个动效播放,但可以动效队列可以继续接收动效
binding.effectView.pause()
//stop设置动效播放为停止状态,停止状态会立即终止动效播放,同时清空当前动效队列,并且不会再继续接收新动效
binding.effectView.stop()
```
#### 全局动效播放控制
```kotlin
val effect: IEffect by lazy { Effect.create(EffectConfig()) }
effect.play() //启动所有动效播放
effect.pause() //暂停所有动效播放,不会清空所有播放队列
effect.stop() //停止所有动效播放,会清空所有播放队列
```
### 动效播放优先级控制
动效播放框架集成了动效播放队列管理,并提供了动效优先级管理能力
```kotlin
//EffectEntity提供了priority动效优先级控制字段
abstract class IEffectEntity {
/**
* priority为20位字符串,按字典顺序排序,前10位为小写英文字母,可用于外部定义动效分类优先级,后10位使用generatePrioritySuffix()方法生成的递增数字序列,用于同类优先级动效按先后顺序入队
*/
open val priority: String = defaultPriority
}
//优先级示例
"aaaaaaaaaa0000000000" > "aaaaaaaaaa0000000001" > "bbbbbbbbbb0000000002" > "bbbbbbbbbb0000000003"
```
### 拓展动效类型
动效播放框架支持在不修改动效框架的前提下,拓展支持任意类型的动效播放,下面以SVGA动效支持为例进行说明
#### 实现支持具体动效播放的EffectView
```kotlin
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
```
#### 实现具体动效类型描述实体
```kotlin
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() {
override fun createEffectView(
ctx: Context,
attrs: AttributeSet?,
defStyleAttr: Int
): SVGAEffectView {
return SVGAEffectView(ctx, attrs, defStyleAttr)
}
}
```
IEffectView和IEffectEntity会作为动效框架基础包提供,具体动效类型拓展包基于该base构建,项目只需要增加拓展包依赖即可完成新动效类型支持