canvas-isPointPath

含义: Canvas中很多交互的行为离不开这个属性,isPointInPath(x , y)是Canvas 2D API用于检测某点是否在路径的描边内(包括路径上)的方法,返回值是布尔值

语法:
isPointInPath(x , y): x代表的横坐标,y代表的纵坐标

注意: 要记住其方法是针对路径的,canvas中绘制路径 arc rect方法都是可以使用该方法,判断鼠标是否位于该路径范围内,包括路径上
isPointInPath()不支持canvas自带的两个方法fillRect(),strokeRect();
可以使用下面两种方法替换

ctx.rect(x,y,w,h);
ctx.stroke(); //替代strokeRect();

ctx.rect(x,y,w,h);
ctx.fill(); //替代fillRect();

栗子:
我们来一个饼状图,每一块都是一个闭合的路径区域,当鼠标移动至某一块区域内则,填充色为红色


isPointPath.gif

JS

  1. 初始
var canvas = document.createElement('canvas');

canvas.width = 500;
canvas.height = 500;
canvas.style.border = '1px solid #ccc';
document.body.appendChild(canvas);

var ctx = canvas.getContext('2d');
  1. 假想一个数据
var data = [1, 2, 3, 4];
var colors = ['green', 'blue', 'orange', 'yellow'];
  1. 预备阶段
// 求和
var sum = data.reduce((pre, cur) => pre + cur);
// 总角度为360
var deg = 2 * Math.PI / sum;
// 默认起始角度为 0 当循环到下一个角时,为前一个区域的结束角度
var beforeDeg = 0;
for (var i = 0; i < data.length; i++) {
    // 开启新路径
    ctx.beginPath();
    // 移动至中心点
    ctx.moveTo(250, 250);
    // 结束角度
    var endDeg = deg * data[i] + beforeDeg;
    // 画路径
    ctx.arc(250, 250, 100, beforeDeg, endDeg);
    // 闭合路径
    ctx.closePath();
    // 设置颜色
    ctx.fillStyle = colors[i];
    // 填充颜色
    ctx.fill();
    // 更新角度
    beforeDeg = endDeg;
}
  1. 监听鼠标移动事件
canvas.addEventListener('mousemove', move);

function move(event) {
    // 获取鼠标位置
    var x = event.clientX - canvas.getBoundingClientRect().x;
    var y = event.clientY - canvas.getBoundingClientRect().y;
    // 清除画布
    ctx.clearRect(0, 0, 500, 500);
    // 默认起始角度为 0 当循环到下一个角时,为前一个区域的结束角度
    var beforeDeg = 0;

    // 重新绘制路径
    for (var i = 0; i < data.length; i++) {
        // 开启新路径
        ctx.beginPath();
        // 移动至中心点
        ctx.moveTo(250, 250);
        // 结束角度
        var endDeg = deg * data[i] + beforeDeg;
        // 画路径
        ctx.arc(250, 250, 100, beforeDeg, endDeg);
        // 闭合路径
        ctx.closePath();
        // 如果鼠标处于当前路径区域 则为红色
        if (ctx.isPointInPath(x, y)) {
            ctx.fillStyle = 'red';
        } else {
            // 否则会原来色
            ctx.fillStyle = colors[i];
        }
        // 填充颜色
        ctx.fill();
        // 更新角度
        beforeDeg = endDeg;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • canvas元素的基础知识 在页面上放置一个canvas元素,就相当于在页面上放置了一块画布,可以在其中进行图形的...
    oWSQo阅读 10,364评论 0 19
  •   HTML5 添加的最受欢迎的功能就是 元素。这个元素负责在页面中设定一个区域,然后就可以通过 JavaScri...
    霜天晓阅读 3,097评论 0 2
  • 一、什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像 画布是...
    EndEvent阅读 736评论 0 1
  • 我国发行的流通纪念币和现代贵金属币,钱币设计图案精美,重在彰显传统文化,具有文化传播属性和收藏价值,其中贵...
    半两道阅读 504评论 0 0
  • 貌侵不入仙人眼,难与青鸾舞窈娆。 露重霜寒愁复苦,翅沉风惨暮还朝。 但忧云兽遮乡路,岂惧烟波卷怒飙。 多少天涯游冶...
    阿满_d6bf阅读 680评论 0 3