首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按住shift键时在画布中绘制一条直线

按住shift键时在画布中绘制一条直线
EN

Stack Overflow用户
提问于 2015-07-28 23:53:34
回答 1查看 958关注 0票数 0

我正在使用HTML画布构建一个黑板应用程序。

我希望能够按住shift键并让它沿着用户拖动鼠标的任一轴绘制一条直线。

我已经设置了一个变量来知道何时按住shift,我只是不知道如何限制绘图的方向。

该项目的源代码可以在这里找到:

https://github.com/dashedstripes/blackboard

我很感谢你的帮助,这让我很头疼。

代码

代码语言:javascript
复制
var Blackboard = {
  WIDTH: window.innerWidth,
  HEIGHT: window.innerHeight,

  canvas: "",
  ctx: "",

  color: "#fff",
  lineWidth: 5,

  init: function() {
    this.canvas = document.createElement("canvas");
    this.canvas.width = this.WIDTH;
    this.canvas.height = this.HEIGHT;
    this.ctx = this.canvas.getContext("2d");
    document.body.appendChild(this.canvas);

    this.Event.init();
    this.setBackground();
    this.ColorPicker.init();
  },

  setBackground: function() {
    this.ctx.fillRect(0, 0, this.WIDTH, this.HEIGHT);
  },

  canvasResize: function() {
    var data = this.ctx.getImageData(0, 0, this.WIDTH - this.ColorPicker.width, this.HEIGHT);

    this.WIDTH = window.innerWidth;
    this.HEIGHT = window.innerHeight;
    this.canvas.width = this.WIDTH;
    this.canvas.height = this.HEIGHT;
    this.setBackground();
    this.ColorPicker.colorPos.x = [];
    this.ColorPicker.colorPos.y = [];
    this.ColorPicker.init();

    Blackboard.ctx.putImageData(data, 0, 0);
  },

  ColorPicker: {
    width: 100,
    margin: 10,
    colorWidth: 0,
    colorHeight: 0,
    colorStartX: 0,
    colorStartY: 0,

    colors: ["#D56C75", "#7DC0D5", "#58D598", "#B3D56C", "#D5A972", "#D568AD", "#8472D5", "#FFFFFF"],

    colorPos: {
      x: [],
      y: [],
    },

    init: function() {

      Blackboard.ctx.fillStyle = "#202122";
      Blackboard.ctx.fillRect(Blackboard.WIDTH - this.width, 0, this.width, Blackboard.HEIGHT);

      this.colorWidth = this.width - 20;
      this.colorHeight = 80;
      this.colorStartX = (Blackboard.WIDTH - this.width) + 10;
      this.colorStartY = 10;

      this.fillColorPicker();
    },

    createColor: function() {
      Blackboard.ctx.fillRect(this.colorStartX, this.colorStartY, this.colorWidth, this.colorHeight);
      this.colorPos.x.push(this.colorStartX);
      this.colorPos.y.push(this.colorStartY);
    },

    fillColorPicker: function() {
      for (var i = 0; i < this.colors.length; i++) {
        Blackboard.ctx.fillStyle = this.colors[i];
        this.colorHeight = ((Blackboard.HEIGHT - 10) / this.colors.length) - this.margin;
        this.createColor();
        this.colorStartY += this.colorHeight + this.margin;
      }
    },
  },

  Event: {
    isMouseDown: false,
    isInBounds: false,
    lastEvent: "",

    isShiftDown: false,

    init: function() {
      window.addEventListener('mousedown', this.mouseDownListener);
      window.addEventListener('mouseup', this.mouseUpListener);
      window.addEventListener('mousemove', this.mouseMoveListener);
      window.addEventListener('resize', this.windowResize);

      window.addEventListener('keydown', this.keyDownListener);
      window.addEventListener('keyup', this.keyUpListener);
    },

    // Mouse Events
    mouseDownListener: function(e) {
      for (var i = 0; i < Blackboard.ColorPicker.colors.length; i++) {
        if (e.clientX >= Blackboard.ColorPicker.colorPos.x[i] &&
          e.clientX <= Blackboard.ColorPicker.colorPos.x[i] + Blackboard.ColorPicker.colorWidth &&
          e.clientY >= Blackboard.ColorPicker.colorPos.y[i] &&
          e.clientY <= Blackboard.ColorPicker.colorPos.y[i] + Blackboard.ColorPicker.colorHeight) {
          Blackboard.color = Blackboard.ColorPicker.colors[i]
        }
      }

      this.isMouseDown = true;
      this.lastEvent = e;

      if (e.clientX >= 0 && e.clientX <= (Blackboard.WIDTH - Blackboard.ColorPicker.width)) {
        this.isInBounds = true;
      }

    },

    mouseUpListener: function() {
      this.isMouseDown = false;
      this.isInBounds = false;
    },

    mouseMoveListener: function(e) {
      if (this.isMouseDown && this.isInBounds) {
        if (!this.isShiftDown) {
          Blackboard.ctx.beginPath();
          Blackboard.ctx.moveTo(this.lastEvent.clientX, this.lastEvent.clientY);
          Blackboard.ctx.lineTo(e.clientX, e.clientY);
          Blackboard.ctx.lineCap = 'round';
          Blackboard.ctx.lineWidth = Blackboard.lineWidth;
          Blackboard.ctx.strokeStyle = Blackboard.color;
          Blackboard.ctx.stroke();
          this.lastEvent = e;
        }

      }

    },

    // Window Events
    windowResize: function(e) {
      Blackboard.canvasResize();
    },

    // Keyboard Events
    keyDownListener: function(e) {
      var keyCode = e.keyCode;
      switch (keyCode) {
        case 16:
          this.isShiftDown = true;
          break;
      };
    },
    keyUpListener: function(e) {
      var keyCode = e.keyCode;
      switch (keyCode) {
        case 16:
          this.isShiftDown = false;
          break;
      };
    }
  }
};

Blackboard.init();
代码语言:javascript
复制
body {
  margin: 0;
  padding: 0;
  overflow: hidden;
}
代码语言:javascript
复制
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Blackboard</title>

谢谢,

亚当

EN

回答 1

Stack Overflow用户

发布于 2015-07-29 00:30:25

谢谢你的帮助。

我在mouseMoveListener中使用下面的代码让它工作

代码语言:javascript
复制
mouseMoveListener: function(e){

        if(this.isMouseDown && this.isInBounds){

            if(e.pageX < this.lastEvent.clientX || e.pageX > this.lastEvent.clientX) {
      Blackboard.Event.direction = 1;
      this.lastEvent.clientX = e.pageX;
    }else if(e.pageY < this.lastEvent.clientY || e.pageY > this.lastEvent.clientY){
        Blackboard.Event.direction = 0;
        this.lastEvent.clientY = e.pageY;
    }

            if(!this.isShiftDown){
                Blackboard.ctx.beginPath();
                Blackboard.ctx.moveTo(this.lastEvent.clientX, this.lastEvent.clientY);
                Blackboard.ctx.lineTo(e.clientX, e.clientY);
                Blackboard.ctx.lineCap = 'round';
                Blackboard.ctx.lineWidth = Blackboard.lineWidth;
                Blackboard.ctx.strokeStyle = Blackboard.color;
                Blackboard.ctx.stroke();
                this.lastEvent = e;
            }else if(Blackboard.Event.direction == 0){
                Blackboard.ctx.beginPath();
                Blackboard.ctx.moveTo(this.lastEvent.clientX, this.lastEvent.clientY);
                Blackboard.ctx.lineTo(this.lastEvent.clientX, e.clientY);
                Blackboard.ctx.lineCap = 'round';
                Blackboard.ctx.lineWidth = Blackboard.lineWidth;
                Blackboard.ctx.strokeStyle = Blackboard.color;
                Blackboard.ctx.stroke();
            }else if(Blackboard.Event.direction == 1){
                Blackboard.ctx.beginPath();
                Blackboard.ctx.moveTo(this.lastEvent.clientX, this.lastEvent.clientY);
                Blackboard.ctx.lineTo(e.clientX, this.lastEvent.clientY);
                Blackboard.ctx.lineCap = 'round';
                Blackboard.ctx.lineWidth = Blackboard.lineWidth;
                Blackboard.ctx.strokeStyle = Blackboard.color;
                Blackboard.ctx.stroke();
            }

        }

    },
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31681384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档