【canvas系列】canvas实现拖动矩形

            <canvas id="ca">
                您的浏览器不支持canvas,请更换浏览器!
            </canvas>

实现拖动主要靠三个事件

mousemove,mousedown,mouseup

我们备注一个状态,canDrag,可拖动的意思,鼠标按下,可拖动为true,鼠标抬起,可拖动为false,当鼠标移动时,如果可拖动为true,就随鼠标移动,下面来看如何动

const ca = document.getElementById('ca')
const ctx = ca.getContext('2d')
const container = document.getElementsByClassName('canvas')[0]
const posit = ca.getBoundingClientRect()//获取canvas这个div到网页边缘的距离

container.addEventListener('mousedown', function(e) {
    canDrag=true
    this.startX = e.clientX - posit.left
    this.startY = e.clientY - posit.top
})

 

container.addEventListener('mouseup', function(e) {
      canDrag=false
})

我们用obj来存储一个图形的数据,如obj=[//0-形状类型 , 1-x ,2-y ,3-width, 4-height]

container.addEventListener('mousemove', function(e) {
 
                obj[1] = e.clientX - posit.left - obj[3] / 2   //移动后的x坐标,-obj[3]/2表示坐标以中心点为基准
                obj[2] = e.clientY - posit.top - obj[4] / 2    //同上,y坐标

    
    
    draw(e.clientX - posit.left, e.clientY - posit.top)
})

draw函数中实现图形绘制

这里假设多个图形在shapeList中,obj为其中之一

注意reset()清空画布

function reset() {//清空画布
ca.width = ca.width
ca.height = ca.height

}

function draw(x = 9999, y = 0) {
    reset()
    let hover_type = 'none' //鼠标在哪种类型元素上none,img,border,link
    let cursor = 'auto' //鼠标状态
    ctx.font = "bold 13px Arial"; //画笔样式
    let title = ''


    

    ctx.beginPath()

    ctx.rect(0, 0, ca.width, ca.height);
    ctx.closePath()
    if (ctx.isPointInPath(x, y)) {
        cursor = 'auto'
        title = ''
        hover_type = 'none'
    }
//清空状态 shapeList.forEach((item, i)
=> { if (item[0] === 1) { //线 ctx.beginPath(); ctx.moveTo(item[1], item[2]); ctx.lineTo(item[1] + item[3], item[2] + item[4]); ctx.setLineDash([10, 10, 10]); ctx.lineWidth = 5 ctx.closePath() ctx.strokeStyle =“yellow” ctx.stroke() } else if (item[0] === 2) { //椭圆 ctx.beginPath() ctx.setLineDash([10, 10, 10]); ctx.strokeStyle = "yellow" ctx.fillStyle = "pink" ctx.ellipse(item[1] + item[3] / 2, item[2] + item[4] / 2, item[3] / 2, item[4] / 2, 0, 0, Math.PI * 2) ctx.closePath() ctx.fill() ctx.stroke() } else if (item[0] === 3) { //矩形 ctx.beginPath() ctx.setLineDash([10, 10, 10]); ctx.strokeStyle = “yellow” ctx.rect(item[1], item[2], item[3], item[4]); ctx.fillStyle = "pink" // ctx.fillRect(item[1], item[2], item[3], item[4]); ctx.closePath() ctx.fill() ctx.stroke() } if (ctx.isPointInPath(x, y)) { hover_type = 'shape' }
//isPointInxxxxx来判断鼠标当前是否在xx上
if (ctx.isPointInStroke(x, y)) { cursor = 'crosshair' title = '鼠标在边框上' ctx.strokeStyle = "red" ctx.stroke() } }) //这里有个状态,鼠标在边框上时,和鼠标在其它地方时,这里状态变化提示可连线等,连线将在其它文章中讲到 $(ca).css({ cursor: cursor, })
//鼠标放在该图案上显示的提示文字 $(ca).attr({ title: title }) }

思路大概是这样,代码在我的项目中提取出来的,可能有些不完善,后续会继续更新

canvas实现绘制拓扑图功能

 

posted @ 2021-06-16 10:49  A-zero  阅读(1249)  评论(0编辑  收藏  举报