# 动效播放框架 功能说明 * 提供统一的动效播放接口,方便集成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构建,项目只需要增加拓展包依赖即可完成新动效类型支持