我想使用kineticjs使用钢笔工具(如照相馆), 我对如何实现这一目标一无所知。
是否有可能?如果可能,请帮助我找出解决方案。
我正在使用kinetic-v5.0.1.min.js和kinetic-v5.0.1.js文件。
提前致谢。
答案 0 :(得分:1)
你尝试了什么?你搜索后发现了什么?无论如何,你必须在舞台上听鼠标事件然后画一个Kinetic.Line
。 Stackoverflow上的这两个问题可以帮助您,以防您没有看到它们。
答案 1 :(得分:0)
这是一个完整的解决方案。
工作演示:http://jsfiddle.net/JSdc2/LjJ8W/
document.body.addEventListener( 'mousedown', startListening, false );
// -- /init
// add ins for testing
var stage = new Kinetic.Stage({
width: window.innerWidth - 30,
height: window.innerHeight - 70,
container: 'container'
});
var freeHandLayer = new Kinetic.Layer({
x:0,
y:0,
width: window.innerWidth/2,
height: window.innerHeight/2
});
var background = new Kinetic.Rect({
width: window.innerWidth - 30,
height: window.innerHeight - 70,
fill: '#DDDDDD'
});
freeHandLayer.add( background );
stage.add( freeHandLayer );
// -- /add ins
var ctx = freeHandLayer.getContext('2d');
// ------- freeHand Functions
// thanks to http://nick.zoic.org/
function draw_marker(x, y, r) {
ctx.beginPath();
ctx.arc(x, y, r, 0, Math.PI*2);
ctx.closePath();
ctx.fillStyle = "#0F0";
ctx.fill();
}
function draw_segment(x1, y1, x2, y2) {
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.strokeStyle = "#0F0";
ctx.stroke();
ctx.closePath();
}
// -----
var pos, ox, oy, xys, nx, ny, dx, dy, dd;
var points = [];
var xnums = [];
var ynums = [];
function startListening() {
points=[]; // clear array
xnums=[];
ynums=[];
pos = stage.getPointerPosition();
ox = pos.x;
oy = pos.y;
xnums[0] = ox;
ynums[0] = oy;
document.body.removeEventListener( 'mousedown', startListening );
document.body.addEventListener( 'mousemove', handleMovement, false );
}
function handleMovement() {
document.body.addEventListener('mouseup', finalizeSpline, false );
pos = stage.getPointerPosition();
nx = pos.x;
ny = pos.y;
dx = nx - ox;
dy = ny - oy;
dd = Math.sqrt(dx*dx + dy*dy);
if (dd > 10) {
draw_segment(ox, oy, nx, ny);
xnums.push(nx);
ynums.push(ny);
ox = nx;
oy = ny;
}
}
var ID = 0;
var customShape = [];
function finalizeSpline() {
ID++;
document.body.removeEventListener('mousemove', handleMovement );
document.body.removeEventListener('mouseup', finalizeSpline );
for ( var i = 0; i < xnums.length; i++ ) {
points.push (xnums[ i ]);
points.push (ynums[ i ]);
}
// Create a Group for the new shape to live inside
customShape[ID] = new Kinetic.Group({
x: 0,
y: 0,
rotationDeg: 0
});
customShape[ID].id = 'L06customShape' + ID;
customShape[ID].attrs.id = 'L06customShape' + ID;
customShape[ID].selectable = true;
customShape[ID].selectStyle = "group" ;
customShape[ID].colorable = true;
customShape[ID].colorStyle = "single" ;
customShape[ID].description = "A custom shape." ;
customShape[ID].difficulty = 1;
// Create the shape from user input
var spline = new Kinetic.Line({
id:'L06spline' + ID,
points: points, // uses the points we collected from user pointer movement
tension: 0, // TO DO: don't like the range Kinetic offers 0 to 1, create something better.
closed: false,
fill: '#ccc',
draggable: true
});
// add some tweaks
customShape[ID].on('mousedown touchstart', function( e ) { signals.mouseDown.dispatch( this, e ); });
customShape[ID].on('mouseup touchend', function( e ) { signals.mouseUp.dispatch( this, e ); });
customShape[ID].add( spline );
customShape[ID].className = 'Blob';
freeHandLayer.add( customShape[ID] );
document.body.addEventListener( 'mousedown', startListening, false );
}
function getPointerPos( e ) {
var position = ctx.getBoundingClientRect();
return {
x: e.clientX - position.left,
y: e.clientY - position.top
};
}