一个轻量级且功能强大的 Flutter 图形动画库

4,477 阅读2分钟

大家好,我是前端实验室的老鱼!一名资深的互联网玩家,专注分享大前端领域技术、面试宝典、学习资料等~

今天给大家推荐一个简单又灵活的 flutter canvas 图形动画库:Zerker

image.png

使用场景

使用 Zerker,您可以创建许多看似麻烦的动画效果,例如 app 出入场动画,弹窗动画,点赞动画,烟花特效等。

image.png

当然您也可以使用 Zerker 来创建 app 小游戏。Zerker 中包含精灵(Sprite)、滚动背景(scrolling backgrounds)和地图等元素,可以轻松创建游戏世界。

安装

向项目包的 pubspec.yaml 文件中添加依赖:

dependencies:
  zerker: <latest_version_here>

接着,执行命令:flutter pub get

$ flutter pub get

快速开始

我们以一个例子来说明下如何使用。
首先,导入需要的包。

import 'package:zerker/zerker.dart';

创建 zerker 小部件

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        AppBarAppBar(
          titleText(widget.title),
        ),
        bodyCenter(
          childZerker(appMyZKApp(), clip: true, interactive: true, width350height350),
        ));
  }
}

创建从 ZKApp 继承的 Zerker 类

class MyZKApp extends ZKApp {

  @override
  init() {
    super.init();
    /// init zerker scene
    preload();
  }

  @override
  update(int time) {
    super.update(time);
  }
}

在init 方法中预加载资源,初始化场景。

preload () {
    stage.color = Colors.blueGrey;

    Map<Stringdynamic> urls = {
      "boy": {"json""assets/boy.json""image""assets/boy.png"},
      "bg""assets/bg.png",
    };

    // preload all assets
    ZKAssets.preload(
        urls: urls,
        onProgress: (scale) {
          print("Assets loading ${scale * 100}%");
        },
        onLoad: () {
          initScene();
          _loaded = true;
          print("Assets load Complete");
        });
}

initScence()就是初始化场景的具体内容。

// add title
    title = ZKText()
      ..position.x = appWidth / 2
      ..position.y = 20
      ..text = "Please click anywhere"
      ..setStyle(
        color: Colors.blueGrey, 
        backgroundColor: Colors.greenAccent, 
        textAlign: TextAlign.center);
    stage.addChild(title);

    // add boy
    boy = ZKSprite(key: "boy")
      ..setScale(1)
      ..anchor.y = 1
      ..position.x = size.width / 2
      ..position.y = appHeight - 16
      ..animator.make("run", ["Run ({1-15}).png"])
      ..animator.make("jump", ["Jump ({1-15}).png"])
      ..animator.make("dead", ["Dead ({1-15}).png"])
      ..animator.play("run", 25, true);
    stage.addChild(boy);
    
    // add bg
    bg = ZKScrollBg(key: "bg", time: 4 * 1000)
      ..setScale(0.5)
      ..position.y = appHeight
      ..anchor.y = 1;
    stage.addChildAt(bg!, 0);

    _addAction();

增加互动事件

_addAction() {
    boy.onTapDown = (event) {
      bg.stop();
      _jumping = false;
      boy.animator.play("dead", 20);
    };

    stage.onTapDown = (event) {
      if (event.target == boy) return;
      if (_jumping) return;

      bg.play();
      _jumping = true;
      boy.animator.play("jump", 20);
      ZKTween(boy)
          .to({"y": appHeight - 120}, 500)
          .easing(Ease.circ.easeOut)
          .chain(ZKTween(boy).to({"y": appHeight - 16}, 500).easing(Ease.circ.easeIn).onComplete((obj) {
                boy.animator.play("run", 25, true);
                _jumping = false;
              }))
          .start();
    };
}

Ok.你的第一个游戏就完成了。

image.png

重点

Zerker 的使用,主要是两个部分:一是,引入资源并进行场景初始化;二是,给ZK上下文中的元素绑定事件。事件,就是交互的主要内容,这是比较复杂的地方。大家可以多参考官网的文档和例子。

image.png

官方地址 github.com/flutterkit/…

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情