如何在画布中进行Ctrl + Z键盘事件?

威利安

我正在尝试执行Ctrl+的“撤消”操作Z

我做了一个简单的画布绘制示例,以使其更容易理解我想要的内容。当用户在不释放mouse1的情况下移动鼠标时,将在画布上绘制一些内容。然后,当他们停止按mouse1时,图形结束。Ctrl+Z快捷方式将撤消这些附图。

这是代码:

//var
const canvas = document.getElementById('canvas');

const cC = canvas.getContext('2d');

//trigger for write or not
var pressedQ = false;

//

function getMousePosition(evt) {    
  var rect = canvas.getBoundingClientRect();
  var root = document.documentElement;
  var mouseX = evt.clientX - rect.left - root.scrollLeft;
  var mouseY = evt.clientY - rect.top - root.scrollTop;
  return {
    x: mouseX,
    y: mouseY
  };
}

function writeCircle(posX, posY, size, color) {
  cC.fillStyle = 'black';
  cC.beginPath();
  cC.arc(posX, posY, size, 0, Math.PI*2, true);
  cC.fill();
}

function pencil(evt) { 
  if (pressedQ == true) {
    var mousePos = getMousePosition(evt);
    writeCircle(mousePos.x, mousePos.y, 50);
  }
  else{}
}

function activate(textmode, evt) {
  pressedQ = true;
  console.log('start');
}

function deactivate() {
  pressedQ = false;
  console.log('finish');
}

window.onload = function() {
  cC.clearRect(0, 0, canvas.width, canvas.height);
  canvas.addEventListener('mousedown', activate);
  canvas.addEventListener('mousemove', pencil);
  canvas.addEventListener('mouseup', deactivate);
}
<canvas id="canvas" width="700" height="490"></canvas>

谢谢!

注意:我无法理解ES2015 +语法

德威特

您正在寻找的是命令设计模式由于您在这里使用函数,因此只需要存储函数名称及其参数。然后,您可以使用该数据稍后再调用该函数。以下示例并不完美,但应演示基本思想。(我尝试避免在2015年更新之后添加的任何JavaScript语法)

var canvas = document.getElementById('canvas');
var cC = canvas.getContext('2d');

var pressedQ = false; //trigger for write or not

var commands = [];

var commandTypes = {
  drawCircle: function (posX, posY, size, color) {
    cC.fillStyle = 'black';
    cC.beginPath();
    cC.arc(posX, posY, size, 0, Math.PI * 2, true);
    cC.fill();
  }
};

function execute() {
  var commandType = arguments[0];
  var data = Array.prototype.slice.call(arguments, 1);
  
  if (!commandTypes.hasOwnProperty(commandType))
    throw new Error(commandType + ' is not a real command');

  commandTypes[commandType].apply(null, data);
}

function pushAndExecute() {
  commands.push(arguments);
  execute.apply(null, arguments);
}

function getMousePosition(evt) {
  var rect = canvas.getBoundingClientRect();
  var root = document.documentElement;
  return {
    x: evt.offsetX - rect.left - root.scrollLeft,
    y: evt.offsetY - rect.top - root.scrollTop
  };
}

function pencil(evt) { 
  if (!pressedQ) return;
  var mousePos = getMousePosition(evt);
  pushAndExecute('drawCircle', mousePos.x, mousePos.y, 50);
}

function activate(evt) {
  pressedQ = true;
  // console.log('start');
  pencil(evt);
}

function deactivate() {
  pressedQ = false;
  // console.log('finish');
}

function handleKeys(evt) {
  if (evt.ctrlKey && evt.key === 'z') {
    // console.log('undo');

    // Remove the most recent command from the list
    commands.splice(-1, 1);

    // Clear canvas
    cC.clearRect(0, 0, canvas.width, canvas.height);

    // Re-play all commands (re-draw canvas from scratch)
    commands.forEach(function (command) {
      execute.apply(null, command);
    });
  }
}

window.onload = function() {
  cC.clearRect(0, 0, canvas.width, canvas.height);
  canvas.addEventListener('mousedown', activate);
  canvas.addEventListener('mousemove', pencil);
  canvas.addEventListener('mouseup', deactivate);
  window.addEventListener('keydown', handleKeys);
}
<canvas id="canvas" width="700" height="490"></canvas>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Polymer中进行onchange事件

来自分类Dev

如何在OpenStreetMap Android中进行触摸事件

来自分类Dev

如何在事件处理程序中进行异步调用

来自分类Dev

如何在量角器中进行$ rootScope。$ broadcast事件

来自分类Dev

如何在事件队列中进行异步jsonp调用

来自分类Dev

我如何在Fullcalendar中进行不同类型的事件?

来自分类Dev

如何在量角器中进行$ rootScope。$ broadcast事件

来自分类Dev

如何在 Angular 中进行事件冒泡?

来自分类Dev

如何从键盘事件更改为鼠标事件

来自分类Dev

如何在CodeMirror中触发键盘事件?

来自分类Dev

如何在SVG上监听键盘事件

来自分类Dev

如何在ruby中触发键盘事件?

来自分类Dev

如何在VSIX中处理键盘事件?

来自分类Dev

如何在ruby中触发键盘事件?

来自分类Dev

触发功能-键盘绑定CTRL + Z

来自分类Dev

Python/Kivy:如何在 ctrl+a 键盘事件上调用函数

来自分类Dev

Python:如何知道串行端口设备事件(例如键盘事件)

来自分类Dev

如何在键盘上更改Z和Y

来自分类Dev

如何在Cycle.js中捕获键盘事件?

来自分类Dev

如何在gnome Shell扩展中处理键盘事件?

来自分类Dev

如何在键盘事件上打开选择输入模式

来自分类Dev

如何在键盘事件上遍历数组

来自分类Dev

如何在键盘事件上使scrollToRow在UITableView中工作?

来自分类Dev

fabric.js画布监听键盘事件吗?

来自分类Dev

我可以让iOS Simulator监听键盘事件以进行调试吗?

来自分类Dev

如何在vuejs中检测ctrl + z和ctrl + y?

来自分类Dev

如何交换键盘上的Z和Y键?

来自分类Dev

如何交换键盘上的Z和Y键?

来自分类Dev

如何将事件绑定到Cordova中的键盘显示

Related 相关文章

热门标签

归档