使用canvas编写时间轴插件

背景

项目中有一个视频广场的功能,需要一个时间轴类似视频播放中进度条功能一样显示录像情况,并且可以点击、拖动、放大缩小展示时间轴,获取到时间轴的某个时间。原来的时间轴是使用了timeslider 这个插件,原插件中是使用原生的js 绘制dom节点来显示时间轴,后面使用起来发现每一次重绘就要操作上百个dom节点,性能很差,所以决定采用canvas来重写时间轴。

效果如下

实现的功能

1. 绘制时间轴:

上面包括刻度、录像段、时间点

2. 点击/拖动时间轴:

可以返回释放的时间点,控制台有打印值

3. 放大缩小:

在时间轴上滚动鼠标滚轮可以放大缩小时间轴

4. 设置时间点:

demo界面上有一个setTime 按钮可以设置 "2018-03-02 15:00:00" 这样格式的时间让时间轴的中间跳到这个点

5. 显示播放点:

中间是播放点,因为原来项目是要求直播和回放在同一时间轴显示,所以以中间来划分

6. 改变录像段:

demo界面上是有一个toggleCell这个按钮进行切换成另一段录像段

7. hover显示时间:

鼠标放在时间轴上可以显示时间

代码说明

因为整篇主要是说canvas绘制,所以这里就简单说一下我使用到的canvas相关方法有哪些。

时间轴主要是由刻度、刻度时间、长方形录像段

刻度:

主要是add_graduations 这个方法,在这个方法中绘制是调用了drawLine方法,其实就是绘制一条线,如下:


TimeSlider.prototype.drawLine = function(beginX,beginY,endX,endY,color,width){
this.ctx.beginPath();
this.ctx.moveTo(beginX,beginY);
this.ctx.lineTo(endX,endY);
this.ctx.strokeStyle = color;
this.ctx.lineWidth = width;
this.ctx.stroke();
}

刻度时间:


this.ctx.fillText(middle_date,graduation_left-20,30);
this.ctx.fillStyle = "rgba(151,158,167,1)";

录像段:

主要是add_cells这个方法,在这个方法中绘制是调用了draw_cell方法,其实就是绘制一个长方形,如下:


this.ctx.fillStyle = cell.style.background;
this.ctx.fillRect(beginX,0,cell_width,15);

其他基本上如果要绘制线例如中间红线、整体的框架线、hover的线都是调用drawLine方法

遇到的困难

1、因为里面的刻度和录像段的绘制都是需要x轴距离,即距离左边的距离,所以这里可以通过

距离=开始的偏移距离+格数*px/格

这样的思想一个个值算出来,这里需要说明的一点是开始的偏移距离是因为最左边的那一个刻度不一定会和左侧边界重合,可能会向右一些,所以这一段距离需要算出来,通过下面得出


var ms_offset = _this.ms_to_next_step(start_timestamp,min_per_step*60*1000); /**
* 左侧开始时间的偏移,返回单位ms
* @param {*} timestamp
* @param {*} step
*/
TimeSlider.prototype.ms_to_next_step = function(timestamp, step) {
var remainder = timestamp % step;
return remainder ? step - remainder : 0;
}

2、canvas绑定事件是通过addEventListener这个方法实现,因为这个时间轴没进行一次操作都是重绘canvas所以原来的绑定事件方法add_events都写在重绘方法里导致事件累加,浏览器内存爆了,然后就卡顿了。后面发现只要canvas初始化第一次绑定之后,其他的重绘不需要再绑定了,以此在init方法中会看到redrawFlag这个变量,是判断是否添加事件的,只有初始化需要添加

最后说明

最后说一下这个插件里面现在总共有两个版本,带有1的是封装之后的版本,没有带1是最初简单版可以直接写入业务文件调用的。另外,因为这只是个demo,所以界面上setTime这个按钮的功能并没有对输入框时间做格式限制,只能输入“2018-03-02 15:00:00”这样的才有效,其余格式会出现NAN-NAN-NAN NAN:NAN:NAN的bug

使用canvas编写时间轴插件的更多相关文章

  1. JQuery+HTML5+CSS3制作时间轴插件,支持响应式布局

    一.效果图预览 (图一) (图二) 附注说明: 图一是浏览器宽度像素大于560px下的展示效果,图二是在浏览器宽度像素小于560px下的展现效果.使用的是CSS3的Media Query(媒体查询)实 ...

  2. jQuery时间轴插件:jQuery Timelinr

    前言 这是一款可用于展示历史和计划的时间轴插件,尤其比较适合一些网站展示发展历程.大事件等场景.该插件基于jQuery,可以滑动切换.水平和垂直滚动.支持键盘方向键.经过扩展后可以支持鼠标滚轮事件. ...

  3. 看看我做的一款 时间轴 插件 timegliderJs

    TimegliderJs 是一款基于jQuery的时间轴插件.完成后效果. 介绍 Timeglider JS是一个由javascript支持缩放,数据驱动的时间轴组件.非常适合显示项目历史,项目计划及 ...

  4. jQuery时间轴插件timeline.js

    http://www.jq22.com/jquery-info13695 http://www.jq22.com/jquery-info13357 简要教程 timeline.js是一款jQuery时 ...

  5. jQ效果:jQuery时间轴插件jQuery Timelinr

    前言 这是一款可用于展示历史和计划的时间轴插件,尤其比较适合一些网站展示发展历程.大事件等场景.该插件基于jQuery,可以滑动切换.水平和垂直滚动.支持键盘方向键.经过扩展后可以支持鼠标滚轮事件. ...

  6. 推荐5款实用的jQuery时间轴插件

    1.使用CSS3和jQuery制作的水平时间轴 这是一个可以在PC和移动端表现非常棒的水平时间轴,它由上部水平滑块和下部时间点对应的内容区块,点击时间轴上的时间点,下部内容会滑动到对应的内容区块.使用 ...

  7. 企业级时间轴插件Vue-timelinepick

    简介 时间范围选择插件 取当前时间之前一段时间范围 按刻,小时,天分类 在线演示及下载 在线演示:https://yelingfeng.github.io/vue-timelinepick/ 本地下载 ...

  8. 超炫的时间轴jquery插件Timeline Portfolio

    Timeline Portfolio是一款按时间顺序专业显示事件的jquery时间轴插件,可以根据时间的先后嵌入各种媒体包括微博,视频和地图等.这个展现的模式非常适合设计师的作品集和个人简历的展示.T ...

  9. Qt编写自定义控件64-垂直时间轴

    一.前言 垂直时间轴控件,主要用来描述企业发展历程大事件,或者软件版本迭代历史等,通过时间节点和事件描述来直观的展示发展的过程,一般在web网页或者app中经常看到此类控件,尤其是公司的官网关于公司部 ...

随机推荐

  1. 使用Botkit和Rasa NLU构建智能聊天机器人

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 我们每天都会听到关于有能力涉及旅游.社交.法律​​.支持.销售等领域的新型机器人推出的新闻.根据我最后一次查阅的数据,单单Facebook Me ...

  2. junit4X系列--Assert与Hamcrest

    原文出处:http://www.blogjava.net/DLevin/archive/2012/05/12/377960.html.感谢作者无私分享 到目前,JUnit4所有的核心源码都已经讲解过了 ...

  3. JDOJ-P1260 VIJOS-P1083 小白逛公园

    首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec  Memor ...

  4. 日常API之图灵聊天机器人

    机器人是什么?可以吃吗? 嗯,他可以和你聊天,不能吃哦. 首先需要到www.tuling123.com注册一只KEY,你才能调用机器人API哦 一.布局 (控制台程序可以跳过这一步)本文以WPF为示例 ...

  5. JAVA并发编程学习笔记------锁顺序死锁

    一.需求描述: 将资金从一个账户转移到另一个账户. 二.程序实现: (1)账户类: public class Account { private long account; public Accoun ...

  6. jQuery选择器概述

    1.基本选择器:1) #id : 根据给定的id匹配一个元素:2) .class: 根据给定的类名匹配元素:3)element: 根据给定的元素名匹配元素:4)* : 匹配所有元素:5)selecto ...

  7. 史上最全的JFinal源码分析(不间断更新)

    打算 开始 写 这么 一个系列,希望 大家 喜欢,学习 本来就是 一个查漏补缺的过程,希望大家能提出建议.本篇 文章 是整个目录的向导,希望 大家 喜欢.本文 将以 包的形式跟大家做向导. Handl ...

  8. iOS-状态栏字体颜色【白色】【Xcode9.1】

    Xcode9之前 设置状态栏颜色首先在info.plist文件中,加入UIViewControllerBasedStatusBarAppearance = false: <key>UIVi ...

  9. NIO基础篇(二)

    Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 传统的 ...

  10. 微信小程序开发《一》:阿里云tomcat免费配置https

    小狼咕咕最近开启了微信小程序开发的征程,由于微信小程序的前后台通信必须通过https协议,所以小狼咕咕第一件要做的事就是配置一个能够通过https访问的后台服务.小狼咕咕用的是阿里云ECS服务器,Li ...