我们正在编写一个类似powerpoint的应用程序,我们正在考虑使用bacon.js。有些元素,如图片、文本等,可以拖到屏幕上,然后选择,使用鼠标拖动或触摸事件移动,并使用箭头键。
我使用以前的一些指南制作了这个简单的示例,使用鼠标:http://jsfiddle.net/5y6qqqg2/3/可以拖动2个div。
// allKeyUps :: Observable KeyEvent
var keyDown = $(document)
.asEventStream('keyDown')
.filter(function(ev){
return ev.keyCode==37 ||
ev.keyCode==38 ||
ev.keyCode==39 ||
ev.keyCode==40
}).log()
function xyFromEvent(v) {
return {
x: v.clientX,
y: v.clientY
}
}
function getDelta(t) {
var a = t[1];
var b = t[0];
return {
x: a.x - b.x,
y: a.y - b.y
};
}
function add(p1, p2) {
return {
x: p1.x + p2.x,
y: p1.y + p2.y
};
}
$().ready(function () {
var onMove = $("html").asEventStream('mousemove')
addDraggable($("#1"), onMove);
addDraggable($("#2"), onMove);
});
function addDraggable(block, onMove) {
var startDrag = block.asEventStream('mousedown')
var endDrag = block.asEventStream('mouseup')
var draggingDeltas = startDrag.flatMap(function () {
return onMove.map(xyFromEvent)
.slidingWindow(2, 2)
.map(getDelta)
.takeUntil(endDrag)
})
var blockPosition = draggingDeltas.scan({
x: 0,
y: 0
}, add);
blockPosition.onValue(function (pos) {
block.css({
top: pos.y + "px",
left: pos.x + "px"
});
});
}但是,我在bacon.js方面的经验还不够丰富,无法将事件流挂钩以使keydown只移动一个元素,而不是所有元素。
发布于 2014-10-09 08:05:58
我会这样做:
keyDown流映射到三角洲,如果它是{x: 0, y: -1},让我们称之为keyDelta{id: 37, delta: {x: 0, y: -1},让我们称之为keyDeltaskeyDeltas并拖动流,现在有一个包含所有对象所有移动的单一流onValue,执行呈现。https://stackoverflow.com/questions/26256854
复制相似问题