Letter spacing in canvas element

前端 未结 10 2350
攒了一身酷
攒了一身酷 2020-12-24 06:46

The question says it all pretty much. I\'ve been searching around and starting to worry that it\'s impossible.

I\'ve got this canvas element that I\'m drawing text t

10条回答
  •  攒了一身酷
    2020-12-24 07:09

    here's some coffeescript that allows you to set kerning to your context like so

    tctx = tcanv.getContext('2d')
    tctx.kerning = 10
    tctx.fillStyle = 'black'
    tctx.fillText 'Hello World!', 10, 10
    

    the supporting code is:

    _fillText = CanvasRenderingContext2D::fillText
    CanvasRenderingContext2D::fillText = (str, x, y, args...) ->
    
      # no kerning? default behavior
      return _fillText.apply this, arguments unless @kerning?
    
      # we need to remember some stuff as we loop
      offset = 0
    
      _.each str, (letter) =>
    
        _fillText.apply this, [
          letter
          x + offset + @kerning
          y
        ].concat args # in case any additional args get sent to fillText at any time
    
        offset += @measureText(letter).width + @kerning
    

    The javascript would be

    var _fillText,
      __slice = [].slice;
    
    _fillText = CanvasRenderingContext2D.prototype.fillText;
    
    CanvasRenderingContext2D.prototype.fillText = function() {
      var args, offset, str, x, y,
        _this = this;
    
      str = arguments[0], x = arguments[1], y = arguments[2], args = 4 <= arguments.length ? __slice.call(arguments, 3) : [];
      if (this.kerning == null) {
        return _fillText.apply(this, arguments);
      }
      offset = 0;
    
      return _.each(str, function(letter) {
        _fillText.apply(_this, [letter, x + offset + _this.kerning, y].concat(args));
        offset += _this.measureText(letter).width + _this.kerning;
      });
    };
    

提交回复
热议问题