Skip to content

Plugin 插件系统

Mine Motion 的插件系统允许库轻松地扩展以支持各种数据类型的动画。插件是连接 Timeline 和 Handler 的桥梁,负责为不同类型的数据创建合适的 Handler。

MinePlugin

MinePlugin 是所有插件的基类,用于创建能处理特定数据类型动画的组件。

核心概念

每个 MinePlugin 都实现了一个 handle 方法,该方法尝试根据提供的配置创建适当的 MineHandler。插件系统遵循"责任链"模式 - 当需要创建动画时,Mine Motion会依次尝试已注册的插件,直到找到能处理该数据类型的插件。

属性

属性类型描述
weightnumber插件的优先级,数值越高越先被尝试

方法

handle(config: MineHandlerConfig<any>): MineHandler | CanNotAnimateErr

尝试创建一个Handler来处理指定的动画配置。

  • 参数: 包含动画起始值、结束值、持续时间等信息的配置对象
  • 返回值: 成功时返回一个Handler实例,失败时返回 CanNotAnimateErr(即false

插件实现示例

下面是处理数字类型动画的 MNumberPlugin 的简化实现:

typescript
class MNumberPlugin extends MinePlugin<number> {
  // 设置较高优先级
  weight = 10;
  
  handle(config) {
    // 检查是否能处理这种类型
    if (typeof config.start !== 'number' || typeof config.end !== 'number') {
      return false; // CanNotAnimateErr
    }
    
    // 创建并返回适当的Handler
    return new MNumberHandler(config);
  }
}

MinePluginManager

MinePluginManager 是一个单例,负责管理所有注册的插件并为动画请求找到合适的Handler。

方法

register(plugin: MinePlugin)

注册一个新插件到管理器。

  • 参数: 要注册的插件实例

getHandler(config: MineHandlerConfig<any>): MineHandler | CanNotAnimateErr

尝试为指定的动画配置找到合适的Handler。

  • 参数: 包含动画配置信息的对象
  • 返回值: 成功时返回一个Handler实例,失败时返回 CanNotAnimateErr

使用示例

typescript
// 注册自定义插件
class MyColorPlugin extends MinePlugin<Color> {
  handle(config) {
    if (config.start instanceof Color && config.end instanceof Color) {
      return new ColorHandler(config);
    }
    return false;
  }
}

// 注册到管理器
MinePluginManager.register(new MyColorPlugin());

// 现在Mine Motion可以为Color类型创建动画了
timeline.animate(myObject, [
  { value: { color: new Color(255, 0, 0) } },
  { value: { color: new Color(0, 0, 255) } }
]);

内置插件

Mine Motion内置了以下插件:

  • MNumberPlugin: 处理数字类型动画(如位置、不透明度、大小等)

你可以根据需要创建自定义插件来扩展Mine Motion支持更多的数据类型,如颜色、路径、复杂对象等。