【发布时间】:2014-03-10 21:32:47
【问题描述】:
在 stackoverflow 的帮助下,我得到了一个简单的画布签名指令。问题是它适用于鼠标事件(mousedown、mouseup、mousemove),但不适用于触摸事件(touchstart、touchmove、touchend)。我的主应用程序模块和包含指令的模块中有 ngTouch。我希望你能帮助我。代码如下:
var sig = angular.module('signature', ['ngTouch']);
sig.directive("mjav", ['$document', function ($document) {
return {
restrict: "A",
link: function (scope, element) {
var ctx = element[0].getContext('2d');
ctx.canvas.width = window.innerWidth - 20;
var tempCanvas = document.createElement('nanavas');
// variable that decides if something should be drawn on mousemove
var drawing = false;
// the last coordinates before the current move
var lastX;
var lastY;
element.on('touchstart', function (event) {
if (event.offsetX !== undefined) {
lastX = event.offsetX;
lastY = event.offsetY;
} else {
lastX = event.layerX - event.currentTarget.offsetLeft;
lastY = event.layerY - event.currentTarget.offsetTop;
}
// begins new line
ctx.beginPath();
drawing = true;
});
element.on('touchmove', function (event) {
if (drawing) {
// get current mouse position
if (event.offsetX !== undefined) {
currentX = event.offsetX;
currentY = event.offsetY;
} else {
currentX = event.layerX - event.currentTarget.offsetLeft;
currentY = event.layerY - event.currentTarget.offsetTop;
}
draw(lastX, lastY, currentX, currentY);
// set current coordinates to last one
lastX = currentX;
lastY = currentY;
}
});
$document.on('touchend', function (event) {
// stop drawing
drawing = false;
});
// canvas reset
function reset() {
element[0].width = element[0].width;
}
function draw(lX, lY, cX, cY) {
// line from
ctx.moveTo(lX, lY);
// to
ctx.lineTo(cX, cY);
// color
ctx.strokeStyle = "#000";
// draw it
ctx.stroke();
}
}
};
}]);
【问题讨论】:
-
画布在移动设备上也能很好地工作,为什么需要触摸事件?
-
这是用于简单签名的。我需要触摸事件,以便我可以在画布上绘图。上面的代码适用于鼠标事件(绘图适用于桌面),但不适用于触摸事件。
-
好的,我已经确定 TOUCH 事件确实有效!麻烦在于绘图。但是什么?当我使用鼠标事件时,一切正常。是否为触摸事件添加了不同的 offsetx 属性?
标签: angularjs angularjs-directive