javascript轻量级库createjs使用Easel实现拖拽效果


Posted in Javascript onFebruary 19, 2016

我就把我学习Createjs的一些心得体会向大家分享下:

一.什么是CreateJS?

createjs是一个轻量级的javascript库,是一套可以构建丰富交互体验的 HTML5 游戏的开源工具包,利用createjs可以构建出许多有趣的动画游戏。例如围住神经猫,看你有多色等Html5游戏。

二.CreateJS有哪几款工具?

createjs里面共有四大引擎:

  • EaselJS:主要用于动画、向量及位图的绘制。提供支持移动设备触控的一系列方法(click、mousedown、pressup、pressmove分别为鼠标点击、按下、松开以及移动的事件,不过在之前要加上createjs.Touch.enable(<舞台对象>))。
  • TweenJS:是一个制作补间动画的引擎,可生成一种连续变化的效果。(用过flash的童鞋应该知道什么是补间动画哈)
  • SoundJS:是一个音频播放的引擎,可根据浏览器兼容性及性能选择音频格式播放,可随时加载和卸载。
  • PreloadJS:是一个资源预加载的引擎,还可以指定加载顺序及按优先级分组加载资源。

三.如何利用Easel制作一个简单的拖拽?

那么假如现在需要用EaselJs实现可任意拖拽一张图片,并通过单击该图片使图片处于选中或未选中状态,选中状态即为可拖拽状态,未选中状态即为不可拖拽状态。且最多有一张图片可以处于拖拽状态。那么如何利用EaselJs实现这个需求且支持移动端设备呢?废话不多说,上源码。

HTML代码:

<html>

<head>
  <meta charset="utf-8">
  <script src="https://code.createjs.com/easeljs-0.8.2.min.js"></script>
  <script type="text/javascript">
    function Init() {
      var canvas = document.getElementById("dragCanvas");
      canvas.width = 600; //定义画布大小
      canvas.height = 400;
      var stage = new createjs.Stage(canvas);
      createjs.Touch.enable(stage); //允许设备触控
      var selectBool = []; //控制状态
      drawImgs();
      stage.update();

      function drawImgs() {
        var oX = 0,
          oY = 0;
        var fzmx, fzmy, sx, sy; //辅助变量
        for (var i = 0; i < 4; i++) {
          var randomColor = Math.floor(Math.random() * 16777215).toString(16);
          var con = new createjs.Container();
          var bitmap = new createjs.Bitmap(i + '.jpg');
          selectBool[i] = false;
          con.x = oX;
          con.y = oY;
          oX += 125;
          con.addChild(bitmap);
          con.addEventListener("mousedown", function (event) {
            var Mindex = stage.getChildIndex(event.target.parent);
            sx = event.stageX;
            sy = event.stageY;
            fzmx = event.stageX - event.target.parent.x;
            fzmy = event.stageY - event.target.parent.y;
            if (selectBool[Mindex]) {
              event.target.parent.addEventListener('pressmove', pressMove, false);
            } else {
              event.target.parent.removeEventListener('pressmove', pressMove, false);
            }
            stage.update();
          });
          //        添加鼠标"松开"事件
          con.addEventListener("pressup", function (event) {
            var Pindex = stage.getChildIndex(event.target.parent);
            if (Math.abs(event.stageX - sx) < 3 && Math.abs(event.stageY - sy) < 3) {
              selectBool[Pindex] = !selectBool[Pindex];
              shadowUr(selectBool[Pindex], event.target.parent, randomColor);
            }
            stage.update();
          });

          //        切换状态方法
          function shadowUr(bool, con, randomColor) {
            if (bool) {
              con.shadow = new createjs.Shadow("#" + randomColor, 0, 0, 10);
              var fIndex = con.parent.getChildIndex(con);
              for (var i = 0; i < con.parent.numChildren; i++) {
                if (i == fIndex)
                  continue;
                con.parent.getChildAt(i).shadow = null;
                selectBool[i] = false;
              }
            } else
              con.shadow = null;
          }
          //        图片拖动
          function pressMove(event) {
            var self = event.target.parent;
            if (event.stageX - fzmx < 0)
              self.x = 0;
            else if (event.stageX - fzmx + self.getBounds().width > stage.canvas.width)
              self.x = stage.canvas.width - self.getBounds().width;
            else
              self.x = event.stageX - fzmx;
            if (event.stageY - fzmy < 0)
              self.y = 0;
            else if (event.stageY - fzmy + self.getBounds().height > stage.canvas.height)
              self.y = stage.canvas.height - self.getBounds().height;
            else
              self.y = event.stageY - fzmy;
            stage.update();
          }
          stage.addChild(con);
        }

      }
    }
  </script>
</head>

<body onload="Init();">
  <canvas id="dragCanvas" style="border:#333 1px solid"></canvas>
</body>

</html>

由于浏览器的同源策略,需要开一个本地服务器,否则无法正常加载。好了,这就是上述所要求的图片拖拽效果啦

Javascript 相关文章推荐
基于jquery的动态创建表格的插件
Apr 05 Javascript
JS实现div内部的文字或图片自动循环滚动代码
Apr 19 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
Jun 09 Javascript
jQuery fadeOut 异步实例代码详解
Aug 18 Javascript
canvas绘制环形进度条
Feb 23 Javascript
js实现图片加载淡入淡出效果
Apr 07 Javascript
js实现城市级联菜单的2种方法
Jun 23 Javascript
webpack打包react项目的实现方法
Jun 21 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
Aug 30 Javascript
详解jQuery设置内容和属性
Apr 11 jQuery
详解Vue依赖收集引发的问题
Apr 22 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
Feb 19 #Javascript
谈一谈javascript中继承的多种方式
Feb 19 #Javascript
多种js图片预加载实现方式分享
Feb 19 #Javascript
JS实现1000以内被3或5整除的数字之和
Feb 18 #Javascript
ECharts仪表盘实例代码(附源码下载)
Feb 18 #Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
Feb 18 #Javascript
用canvas 实现个图片三角化(LOW POLY)效果
Feb 18 #Javascript
You might like
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
PHP children()函数讲解
2019/02/03 PHP
js字符编码函数区别分析
2008/06/05 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
python 实现归并排序算法
2012/06/05 Python
浅谈Python peewee 使用经验
2017/10/20 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
python实现超级玛丽游戏
2020/03/18 Python
德国高性价比网上药店:medpex
2017/07/09 全球购物
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
自荐信结尾
2013/10/27 职场文书
历史专业毕业生的自我鉴定
2013/11/15 职场文书
学校门卫管理制度
2014/01/30 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
如何使用SQL Server语句创建表
2022/04/12 SQL Server
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript