我最近在移动浏览器中测试了 Raphael 画布,我们可以使用平板电脑绘制线条等。
使用svg在浏览器上绘制时速度和精度不足,例如,即使在移动过程中没有停止触摸等,绘制时间线也会中断。
因此,我正在研究绘图应用程序中使用的哪些内容非常适用于触摸屏。
如果我们想在移动浏览器上安装最佳画布或svg的绘图应用程序,或者因为我们不希望在绘制时打破线条,那么这个应用程序是什么?
我可以开始研究更多关于绘制用于绘图的api的用于“笔记,S2和其他触摸应用程序”的用途。
已更新:请检查此jsfiddle
var canvas = $("#canvas");
paper = Raphael("canvas");
var clicking = false;
var line;
var pathArray = [];
canvas.bind("mousedown", _mousedownHandler);
canvas.bind("touchstart", _mousedownHandler);
function _mousedownHandler(event){
clicking = true;
// _drawArrowLineBegin(e);
if(event.type == "touchstart"){
event.preventDefault();
event = event.originalEvent.touches[0] || event.originalEvent.changedTouches[0];
}
_drawFreeLineBegin(event);
};
function _mousemoveHandler(event){
// _drawArrowLineMove(event);
if(event.type == "touchmove"){
event.preventDefault();
event = event.originalEvent.touches[0] || event.originalEvent.changedTouches[0];
}
_drawFreeLineMove(event);
};
function _mouseupHandler(event){
clicking = false;
};
function _enableEvents(){
canvas.bind("mousemove.mmu", _mousemoveHandler);
canvas.one("mouseup.mmu", _mouseupHandler);
canvas.bind("touchmove.mmu", _mousemoveHandler);
canvas.one("touchend.mmu", _mouseupHandler);
};
function _drawArrowLineBegin(e) {
clicking = true;
line = paper.path("M" + (e.offsetX || e.clientX) + " " + (e.offsetY || e.clientY) + "L" + (e.offsetX || e.clientX) + " " + (e.offsetY || e.clientY)).attr({stroke:'#FF0000', 'stroke-width': 2, 'arrow-end': 'classic-wide-long'});
pathArray = line.attr("path");
_enableEvents();
}
function _drawArrowLineMove(e){
if(clicking == false) return;
if (pathArray[1][1] != undefined) { // not IE 8
pathArray[1][1] = e.offsetX || e.clientX;
pathArray[1][2] = e.offsetY || e.clientY;
} else {
pathArray = pathArray.replace(/L\d+ \d+$/, "L" + e.offsetX + " " + e.offsetY);
}
line.attr({path: pathArray});
}
function _drawFreeLineBegin(e) {
clicking = true;
line = paper.path("M"
+ (e.pageX) + ","
+ (e.pageY)).attr({stroke:'#FF0000', 'stroke-width': 2});
pathArray = line.attr("path");
_enableEvents();
}
function _drawFreeLineMove(e){
if(clicking == false) return;
line.attr("path",line.attr("path")
+ "L"
+ (e.pageX)
+ ","
+ (event.pageY));
}
答案 0 :(得分:1)
关于速度和性能的问题对于SVG中使用的JavaScript库来说更为内在。在你的小提琴中,绘图中的性能问题主要是因为不断扩展的路径数组以及整个路径数组在每次触摸移动时被重新处理的事实。没有简单的方法来解决这个问题,而不是解决它。
我用纯Raphael(没有jQuery)重新创建了你的实现。 http://jsfiddle.net/shamasis/kUQ7E/
实施有两个方面:
attr
函数并使用doodle.node.setAttribute('d', pathstring);
直接设置元素的路径小提琴(截至修订版24)如下所示:
Raphael("canvas", function () {
var win = Raphael._g.win,
doc = win.document,
hasTouch = "createTouch" in doc,
M = "M",
L = "L",
d = "d",
COMMA = ",",
// constant for waiting doodle stop
INTERRUPT_TIMEOUT_MS = hasTouch ? 100 : 1,
// offset for better visual accuracy
CURSOR_OFFSET = hasTouch ? 0 : -10,
paper = this,
path = "", // hold doodle path commands
// this element draws the doodle
doodle = paper.path(path).attr({
"stroke": "rgb(255,0,0)"
}),
// this is to capture mouse movements
tracker = paper.rect(0, 0, paper.width, paper.height).attr({
"fill": "rgb(255,255,255)",
"fill-opacity": "0.01"
}),
active = false, // flag to check active doodling
repath = false, // flag to check if a new segment starts
interrupt; // this is to connect jittery touch
tracker.mousedown(function () {
interrupt && (interrupt = clearTimeout(interrupt));
active = true;
repath = true;
});
tracker.mousemove(function (e, x, y) {
// do nothing if doodling is inactive
if (!active) {
return;
}
// Fix for Raphael's touch xy bug
if (hasTouch &&
(e.originalEvent.targetTouches.length === 1)) {
x = e.clientX +
(doc.documentElement.scrollTop || doc.body.scrollTop || 0);
y = e.clientY +
(doc.documentElement.scrollLeft || doc.body.scrollLeft || 0);
e.preventDefault();
}
// Insert move command for a new segment
if (repath) {
path += M + (x + CURSOR_OFFSET) + COMMA +
(y + CURSOR_OFFSET);
repath = false;
}
path += L + (x + CURSOR_OFFSET) + COMMA +
(y + CURSOR_OFFSET); // append line point
// directly access SVG element and set path
doodle.node.setAttribute(d, path);
});
// track window mouse up to ensure mouse up even outside
// paper works.
Raphael.mouseup(function () {
interrupt && (interrupt = clearTimeout(interrupt));
// wait sometime before deactivating doodle
interrupt = setTimeout(function () {
active = false;
}, INTERRUPT_TIMEOUT_MS);
});
});