zoukankan      html  css  js  c++  java
  • canvas事件处理机制

    可以查看demo:http://sandbox.runjs.cn/show/hjb2hzzx(建议查看console查看点击后的改变)

    具体原理是每次点击的时候去判断当前的鼠标坐标是属于哪一个路径下的,对当前的这个形状改变状态。

    for (var i = 0; i < drawData.length; i++) {
       drawSingleCircle(i);
       if (ctx.isPointInPath(x, y)) {
          changeStatus(i);
       }
    }

    参考:http://www.imooc.com/video/4320/227

    关键代码:

    (function(window) {
            var document = window.document;
            var clientW = window.innerWidth;
            var clientH = window.innerHeight;
    
            var canvas = document.getElementById('canvas');
            var ctx = canvas.getContext('2d');
    
            canvas.width = clientW;
            canvas.height = clientH;
    
            var drawData = [];  // 存数据
    
            // 添加数据
            function addData() {
                for (var i = 0; i < 10; i++) {
                    var data = {
                        id: i,
                        type: 'arc',
                        x: Math.random() * canvas.width,
                        y: Math.random() * canvas.height,
                        radius: Math.random() * 50 + 20
                    };
                    drawData.push(data);
                }
            }
    
            // 画圆
            function drawCircle() {
                addData();
                ctx.clearRect(0,0,canvas.width,canvas.height);
                for (var i = 0; i < drawData.length; i++) {
                    drawSingleCircle(i);
                }
            }
            drawCircle();
    
            // 画单个圆
            function drawSingleCircle(i){
                ctx.beginPath();
                ctx.arc(drawData[i].x, drawData[i].y, drawData[i].radius, 0, Math.PI * 2, true);
                ctx.fillStyle = '#000';
                ctx.fill();
                ctx.closePath();
            }
    
            // 重新绘制(点击事件中需要用到)
            function reDraw(x, y) {
                ctx.clearRect(0,0,canvas.width,canvas.height);
                for (var i = 0; i < drawData.length; i++) {
                    drawSingleCircle(i);
                    if (ctx.isPointInPath(x, y)) {
                        changeStatus(i);
                    }
                }
            }
    
            // 如果在事件触发的范围内,可以做一些事情来改变状态
            function changeStatus(i){
                ctx.fillStyle = "#f00";
                ctx.fill();
                console.log(drawData[i].type);
                console.log('你点击了第' + i + '个');
            }
    
            // 点击事件处理函数
            function onClick(event) {
                var e = event || window.event;
                var x = e.clientX - canvas.getBoundingClientRect().left;
                var y = e.clientY - canvas.getBoundingClientRect().top;
                reDraw(x, y);
            }
            
            // 注册点击事件
            canvas.addEventListener('click',onClick,false);
        })(window);
  • 相关阅读:
    服务器中一个进程kill不掉,如何处理?
    JVM基本概念
    Redis安装以及常见问题
    JVM---类加载器
    lambda表达式
    maven学习(3)pom.xml文件说明以及常用指令
    maven学习(2)仓库和配置
    maven学习(1)下载和安装和初步使用(手动构建项目和自动构建项目)
    JMicro微服务之超时&重试
    JMicro微服务Hello World
  • 原文地址:https://www.cnblogs.com/qianduanjingying/p/6197561.html
Copyright © 2011-2022 走看看