Git Product home page Git Product logo

time-gallery's Introduction

Time-Gallery 2X

功能新增

  1. 新增 mask 基础属性
  2. 新增 loop 动画属性

基于 CreateJs 实现长图滑动加动画的效果,整段长图可想象成是一段时间轴,在时间轴上自定义各种动画,通过滑动或自定义交互控制时间轴播放。

前言

之前公司要开发一个长图加动画的H5项目,我看到很多类似的案例是基于白鹭来开发,但因为本人没接触过白鹭,于是自己就基于 CreateJs 扩展开发一个长图滑动加动画的框架。

因为后来很多同事问我拿源码开发类似的项目,所以就决定把源码分享出来一起学习。

在这里不需要掌握 CreateJs,如果想做类似项目的朋友可直接使用。

当然,如果熟悉 CreateJs 的朋友,可基于源码 SRC 扩展更多满足自己想要的功能。

案例参考

使用

HTML

<body>
    <canvas id="gallery-canvas" style="width:100%"></canvas>
</body>

<script src="easeljs.min.js"></script>
<script src="time-gallery.2.0.0.min.js"></script>

JS

var timeGallery = new TimeGallery({
    id: 'gallery-canvas',                                   // 定义画布的 ID(必选)
    width: 750,                                             // 定义画布的宽度,根据设计稿定义(可选)
    height: window.innerHeight/window.innerWidth * 750,     // 定义画布的高度,默认是全屏高度(可选)
    resourcesPath: 'assets/images/',                        // 定义资源文件的默认路劲(可选)
    resources: [                                            // 定义资源文件(必选)
        { src: 'demo.png', id: 'demo' },
        { src: 'demo-sprite.png', id: 'demo-sprite' },
    ],
    data: [],                                               // 定义画布元素(必选)
});

timeGallery.play();

这里我们就成功的创建了一个空白的画布,下一步我们需要建立画布元素。

创建元素

TimeGallery 是通过遍历 data 属性的数组对象的来创建画布元素,data 可定义为函数并接收 TimeGallery 实例作为参数。

可能当你往下看的时候,你可能会觉得贴的代码很多,有点复杂。其实你主要了解如何创建元素,元素有哪些类型与属性,然后练练手,你就大概知道怎样创建。

// 定义画布元素函数
// 返回数组对象
function canvasData(timeGallery) {
    return [
        {
            id: 'demo-container',
            prop: {
                x: 0,
                y: 0,                
            },
            children: [
                {
                    id: 'demo-bitmap',
                    type: 'bitmap',
                    image: timeGallery.getImage('demo'),
                    prop: {
                        x: 100,
                        y: 100,
                    }
                }
            ]
        }
    ]
}

// 把定义函数传给 data 属性
var timeGallery = new TimeGallery({
    id: 'gallery-canvas',                                   
    width: 750,                                             
    height: window.innerHeight/window.innerWidth * 750,     
    resourcesPath: 'assets/images/',                        
    resources: [                                            
        { src: 'demo.png', id: 'demo' },
        { src: 'demo-sprite.png', id: 'demo-sprite' },
    ],
    data: canvasData, // 这里
});

timeGallery.play();

这里我们定义了一个 ID 为 demo-container 的容器, 位于画布 x: 0,y: 0 的位置,容器内定义了一个为 Bitmap 的子类型,位于 demo-container 容器 x: 100, y: 100的位置。

把函数 canvasData 定义的元素传给 data 属性。

这时候,你应该看到一张静态的图片在画面上。

元素类型

数据类型分别有 Container, Bitmap, Sprite, Shape, Text,以下是各类型的基本属性:

{
    id: 'name',             // 为元素指定 ID,
    type: '',               // 为元素指定类型,默认是 Container

    // 可定义基础属性
    prop: {
        x: 0,               // 基于父元素定义初始 X 位置 
        y: 0,               // 基于父元素定义初始 Y 位置 
        regX: 0,            // 定义元素 X 中心点
        regY: 0,            // 定义元素 Y 中心点
        scaleX: 1,          // 定义元素初始 Scale X
        scaleY: 1,          // 定义元素初始 Scale Y
        skewX: null,        // 定义元素初始 Skew X 
        skewY: null,        // 定义元素初始 Skew Y
        rotation: 0,        // 定义元素初始旋转度数
        alpha: 1,           // 定义元素初始透明度(0-1)
        visible: true,      // 定义元素是否可见
        index: 0            // 定义元素在当前父元素层次位置
        mask: []            // 定义元素遮罩层,可接受3种遮罩方式,圆形[x, y, radius], 矩形[0, 0, width, height], 圆角矩形[0, 0, width, height,radius],
    },

    // 可定义方法
    method: {
      cache: [x, y, width, height] // 为定义的对象定义缓存区域,有效提供渲染性能, 特别是 Bitmap 用到大图情况
    }

    // 可定义动画属性
    animation: {
        startById: '',      // 与指定 ID 元素同步执行动画,不能与 afterById、endById 共用,ID 元素必须已创建。
        endById: '',        // 与指定 ID 元素同步结束动画,不能与 afterById、startById 共用,ID 元素必须已创建。
        afterById: '',      // 在指定 ID 元素结束后执行动画,不能与 startById、endById 共用,ID 元素必须已创建。
        musicById: '',      // 当动画开始执行时,播放指定 HTML 里音频ID <audio id="demo" src="demo.mp3" />
        musicStopById: '',  // 当动画开始执行时,停止指定 HTML 里音频ID <audio id="demo" src="demo.mp3" />
        x: 0,               // 动画结束后的 X 位置
        y: 0,               // 动画结束后的 Y 位置
        delay: 0,           // 延迟动画播放,例如 delay:100, 则元素在执行动画的时候延迟 100 像素
        scaleX: 1,          // 动画结束后的 Scale X
        scaleY: 1,          // 动画结束后的 Scale Y
        skewX: null,        // 动画结束后的 Skew X 
        skewY: null,        // 动画结束后的 Skew Y
        rotation: 0,        // 动画结束后的旋转度数 
        alpha: 1,           // 动画结束后透明度
        sprite: [],         // 动画组,根据执行进度按索引替换图片
        loop: true,         // 等同下面
        // loop: {             // 定义循环播放,动画以 0% ~ 100% 区间循环执行动画
            // speed: 1,       // 定义循环播放的速度
            // reverse: false  // 是否来回循环播放
        // },
        duration: 0,        // 动画执行长度
    },

    // 可定义事件
    on: {
        event: 'click',     // 可自定义事件,默认'click'。 可以数组方式['click', () => {}]
        handle: (e) => {
            console.log(e)
        }
    }
}

类型 Container

// 可理解是空的 DIV 容器,可多层封装
{
    type: 'container',  // 可不写,默认是 Container
    children: [
        // 定义子元素
    ]
}

图片 Bitmap

{
    type: 'bitmap',
    image: 'image.jpg',  // 建议通过 timeGallery.getImage(id) 获取 resources 定义的资源
}

矢量图 Shape

{
  type: 'shape',
  graphics: {
      beginFill: '#04014e',
      beginStroke: '#ffffff',
      // beginBitmapStroke: ['image.jpg', 'no-repeat'],
      setStrokeStyle: 10,
      drawRect: [0, 0, 200, 200],
      // drawRoundRect: [0, 0, 100, 100, 10],
      // drawCircle: [0, 0, 200],
      // drawEllipse: [0, 0, 100, 200],
      // beginLinearGradientFill: [["#000","#FFF"], [0, 1], 0, 20, 0, 120],
  }
}

精灵图 Sprite

// 创建序列帧动画
{
    type: 'sprite',
    sheet: {
        images:[timeGallery.getImage('demo')], // [图片路径]
        frames: {'height': 292, 'width': 165, 'count': 64, 'regX': 0,  'regY': 0}, // 每帧的尺寸,count是总帧数
        animations: {
            run: [0, 5, 'jump', 0.05],  // [开始帧,结束帧,动画完成后的动作,速度]
            jump: [26]
        }
    },
    method: {
        gotoAndPlay: ['run'] // 执行 run 帧动画
    }
}

// 利用序列帧,模拟创建雪碧图
{
    type: 'sprite',
    sheet: {
        images:[timeGallery.getImage('sprites')], // [图片路径]
        frames: [                                 // [x, y, width, height]
            [0, 1032, 489, 103],       
            [0, 944, 489, 67],
            [0, 817, 489, 48],
        ],
        animations: {                             // 指定每组动作对应 frames 帧
            sprite_1: [0],
            sprite_2: [1],
            sprite_3: [2],
        }
    },
    method: {
        gotoAndPlay: ['sprite_1']
    }
}

文字 Text

{
    type: 'text',
    prop: {
         text: '你输入的文字内容',
         font: 'normal 36px Arial',  // 定义文字样式,大小,字体,必须按顺序填写,空格隔开
         color: '#000',              // 定义文字颜色
         align: 'center'             // 定义文字对齐位置,可定义 'left', 'center', 'right'
    }
}

以上都是比较常用,更多属性可参考 http://www.createjs.cc/src/docs/easeljs/classes/Container.html

  • 可通过 prop 定义对象的 Properties, 如 prop: {name: 'name'}
  • 可通过 method 定义对象 Methods 方法,通过 [] 传参,如method: {cache: [0, 0, 100, 100]}

Basic

  • width: window.innerWidth 定义画布宽度

  • height: window.innerHeight 定义画布高度

  • isStats: false 是否启动 Stats.js 用于测试FPS, 须引入 stats.js 文件

  • isLog: false 是否打印 data 数据结构,方便了解

  • isTouch: true 是否启动滑动事件, 若 false 你可通过获取 canvas 属性自定义事件

  • resourcesPath: '' 图片资源加载的默认路劲

  • resources: [] 图片资源列表,可 'name.png' 、['name.png', 'name-2.png'] 或 { id: 'name', src: 'name.png'}

  • sprites: [] 存放 Sprite 数据,在创建 sprite 类型对象时候可通过 TimeGallery 实例获取,适合重复调用与统一管理

  • data: [] 定义时间轴数据结构,通过遍历数据渲染画面

  • direction: vertical 定义时间轴滑动方向,可设置水平(horizontal)或垂直(vertical)

  • delayTime: 0 定义时间轴延迟时间

  • activeTime: 0 定义时间轴当前时间

  • endTime: 0 定义时间轴结束时间(默认取最后一个动画结束位置或画布的高度/宽度中的最大值)

  • playLine: width 或 height 定义动画播放线(如垂直方向则动画从屏幕底部出现的时候执行动画,水平方向则屏幕右边)

  • touchSpeed:1 定义用户滑动速度

  • autoPlay:false 定义是否自动播放

  • autoSpeed:1 定义自动播放的速度

  • autoUpdate:false 定义是否自动刷新画面,默认滑动的时候才刷新

Properties

  • canvas 获取 Canvas 对象
  • sprites 获取 sprites 定义信息
  • autoSpeed 获取或定义 autoPlay 的播放速度
  • autoUpdate 获取或定义是否自动更新

CallBack

  • onInit() 渲染完成后的回调,接收 TimeGallery 实例作为参数
  • onEnd() 滑动到最底后的回调,接收 TimeGallery 实例作为参数
  • onTickStart(timeGallery) 每一帧的开始前回调,接收 TimeGallery 实例作为参数
  • onTickEnd(timeGallery) 每一帧的结束后回调,接收 TimeGallery 实例作为参数
  • onTimeToStart(timeGallery) onTimeTo 开始前回调,接收 TimeGallery 实例作为参数
  • onTimeToEnd(timeGallery) onTimeTo 结束后回调,接收 TimeGallery 实例作为参数

Methods

  • play() 开始动画
  • stop() 停止动画
  • replay() 重新开始
  • destroy() 摧毁实例
  • remove(id) 删除指定的数据对象,包括它的子对象
  • getActiveTime() 获取时间轴的当前时间位置
  • getEndTime() 获取时间轴的总时间
  • getObject(id) 获取 Data 定义的数据类型信息
  • getImage(id) 获取 Resources 定义的图片资源信息
  • getSprite(id) 获取 Sprites 定义的精灵图数据信息
  • timeTo(number, time, callback)滑动到指定位置,可传绝对位置 number、相对位置 '+number'、'-number'。time(单位ms) 可选,默认是 0

NPM

全局安装 Gulp

npm install --global gulp
npm install
gulp

time-gallery's People

Contributors

chenliangwulin avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.