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 相关文章推荐
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
Aug 15 Javascript
基于jquery的一个浮动框(扩展性比较好 )
Aug 27 Javascript
13 个JavaScript 性能提升技巧分享
Jul 26 Javascript
10分钟学会写Jquery插件实例教程
Sep 06 Javascript
javascript实现iframe框架延时加载的方法
Oct 30 Javascript
javascript获取网页宽高方法汇总
Jul 19 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
Jan 04 Javascript
Node.JS更改Windows注册表Regedit的方法小结
Aug 18 Javascript
ES6基础之展开语法(Spread syntax)
Feb 21 Javascript
layui 实现自动选择radio单选框(checked)的方法
Sep 03 Javascript
JavaScript实现左右滚动电影画布
Feb 06 Javascript
jQuery HTML设置内容和属性操作实例分析
May 20 jQuery
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中创建和调用webservice接口示例
2014/07/25 PHP
php轻松实现文件上传功能
2016/03/03 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
Python编写电话薄实现增删改查功能
2016/05/07 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
Django celery异步任务实现代码示例
2020/11/26 Python
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
建筑工程专业毕业生自荐信
2013/10/19 职场文书
料理师求职信
2014/01/30 职场文书
汽车专业求职信
2014/06/05 职场文书
体育运动口号
2014/06/09 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
风之谷观后感
2015/06/11 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
AJAX学习笔记
2021/05/18 Javascript
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android