• 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);
  • 相关阅读:
    selenium ide 录制回放link链接报错
    如何打造个人技术影响力
    如何打造个人技术影响力
    三个Bootstrap免费字体和图标库
    程序媛,坚持这几个好习惯让你越来越美
    程序媛,坚持这几个好习惯让你越来越美
    程序媛,坚持这几个好习惯让你越来越美
    程序媛,坚持这几个好习惯让你越来越美
    [慕课笔记]mongodb入门篇
    [慕课笔记]mongodb入门篇
  • 原文地址:https://www.cnblogs.com/qianduanjingying/p/6197561.html
Copyright © 2020-2023  润新知