Jquery 使png可拖动的最佳方法忽略透明区域

Jquery 使png可拖动的最佳方法忽略透明区域,jquery,css,html,canvas,Jquery,Css,Html,Canvas,我有一些不规则形状的“png”文件。我需要使它们可拖动,但只有非透明区域应该作为鼠标事件的处理程序。请让我知道什么是最好的方式来实现相同的 我已经用“map”尝试过了,但draggable不适用于map。如果您的png图像是在画布上绘制的,您可以检查单击的像素 假设你点击了(x,y) 此解决方案假定背景也是透明的,因此您不能在背景后面绘制任何其他内容。如果您的png图像是在画布上绘制的,您可以检查单击的像素 假设你点击了(x,y) 此解决方案假定背景也是透明的,因此您不能在背景后面绘制任何其他内

我有一些不规则形状的“png”文件。我需要使它们可拖动,但只有非透明区域应该作为鼠标事件的处理程序。请让我知道什么是最好的方式来实现相同的


我已经用“map”尝试过了,但draggable不适用于map。

如果您的png图像是在画布上绘制的,您可以检查单击的像素

假设你点击了(x,y)


此解决方案假定背景也是透明的,因此您不能在背景后面绘制任何其他内容。

如果您的png图像是在画布上绘制的,您可以检查单击的像素

假设你点击了(x,y)


此解决方案假定背景也是透明的,因此您不能在背景后面绘制任何其他内容。

如果您的png图像是在画布上绘制的,您可以检查单击的像素

假设你点击了(x,y)


此解决方案假定背景也是透明的,因此您不能在背景后面绘制任何其他内容。

如果您的png图像是在画布上绘制的,您可以检查单击的像素

假设你点击了(x,y)


此解决方案假定背景也是透明的,因此您不能在背景后面绘制任何其他内容。

只有当鼠标开始拖动图像的非透明部分时,才能开始拖动图像:

  • 使用
    context.getImageData
    获取有关图像的像素信息
  • 创建一个数组,用于保存有关图像的alpha信息
  • 要启动拖动事件,请侦听mousedown事件并检查alpha数组,以查看是否在图像中按下鼠标。如果是,则开始拖动
这里是带注释的示例代码和演示:

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var cw=画布宽度;
var ch=画布高度;
函数reOffset(){
var BB=canvas.getBoundingClientRect();
offsetX=BB.left;
offsetY=BB.top;
}
var offsetX,offsetY;
reOffset();
onscroll=函数(e){reOffset();}
onresize=函数(e){reOffset();}
var isDown=假;
var startX,startY;
var hitArray
var draggables=[];
var testImg=新图像();
testImg.crossOrigin='anonymous';
testImg.onload=启动;
testImg.src=”https://dl.dropboxusercontent.com/u/139992952/multple/pikachu.png";
函数start(){
推({
img:testImg,
x:50,
y:50,
宽度:mg.width,
高度:mg.height,
hitarray:makeHitArray(testImg),
IsDraging:错,
});
推({
img:testImg,
x:150,
y:50,
宽度:mg.width,
高度:mg.height,
hitarray:makeHitArray(testImg),
IsDraging:错,
});
//侦听鼠标事件
$(“#canvas”).mousedown(函数(e){handleMouseDown(e);});
$(“#canvas”).mousemove(函数(e){handleMouseMove(e);});
$(“#canvas”).mouseup(函数(e){handleMouseUp(e);});
$(“#canvas”).mouseout(函数(e){handleMouseOut(e);});
drawAll();
}
函数drawAll(){
ctx.clearRect(0,0,cw,ch);
对于(var i=0;i0){
//鼠标位于图像的不透明部分上
返回(真);
}否则{
//鼠标不在图像的不透明部分上
返回(假);
}
}
功能手柄向下(e){
//告诉浏览器我们正在处理此事件
e、 预防默认值();
e、 停止传播();
//获取鼠标位置
startX=parseInt(e.clientX-offsetX);
startY=parseInt(e.clientY-offsetY);
//如果鼠标落在上方,则设置拖动标志
//可拖动图像的不透明部分
isDown=假;

对于(var i=0;i,以下是仅当鼠标开始拖动图像的不透明部分时,如何开始拖动图像:

  • 使用
    context.getImageData
    获取有关图像的像素信息
  • 创建一个数组,用于保存有关图像的alpha信息
  • 要启动拖动事件,请侦听mousedown事件并检查alpha数组,以查看是否在图像中按下鼠标。如果是,则启动拖动
这里是带注释的示例代码和演示:

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var cw=画布宽度;
var ch=画布高度;
函数reOffset(){
var BB=canvas.getBoundingClientRect();
offsetX=BB.left;
offsetY=BB.top;
}
var offsetX,offsetY;
reOffset();
onscroll=函数(e){reOffset();}
onresize=函数(e){reOffset();}
var isDown=假;
var startX,startY;
var hitArray
var draggables=[];
var testImg=新图像();
testImg.crossOrigin='anonymous';
testImg.onload=启动;
testImg.src=”https://dl.dropboxusercontent.com/u/139992952/multple/pikachu.png";
函数start(){
推({
img:testImg,
x:50,
y:50,
宽度:mg.width,
高度:mg.height,
hitarray:makeHitArray(testImg),
IsDraging:错,
});
推({
img:testImg,
x:150,
y:50,
宽度:mg.width,
高度:mg.height,
hitarray:makeHitArray(testImg),
IsDraging:错,
});
//侦听鼠标事件
$(“#canvas”).mousedown(函数(e){handleMouseDown(e);});
$(“#canvas”).mousemove(函数(e){handleMouseMove(e);});
$(“#canvas”).mouseup(函数(e){handleMouseUp(e);});
$(“#canvas”).mouseout(函数(e){handleMouseOut(e);});
drawAll();
}
函数drawAll(){
ctx.clearRect(0,0,cw,ch);
对于(var i=0;i0){
//鼠标位于图像的不透明部分上
返回(真);
}否则{
//鼠标不在图像的不透明部分上
返回(假);
}
}
功能手柄向下(e){
//告诉浏览器我们正在处理此事件
e、 预防默认值();
e、 停止传播();
//获取鼠标位置
startX=parseInt(e.clientX-offsetX);
startY=parseInt(e.clientY-offsetY);
//如果鼠标落在上方,则设置拖动标志
//可拖动图像的不透明部分
isDown=fal
var currentCanvas = ctx.getImageData(x, y, 1, 1);
var pix = currentCanvas.data;

if (pix[3] > 0) { //0 is transparent, 255 is fully visible
    //clicked a non-transparent area and thus it is draggable
}