实现说明:

在 JS 中 canvas 原生没有支持对文字间距的调整,我们可以通过将文字的每个字符单独渲染来实现。本案例从 CanvasRenderingContext2D 对象的原型链上扩展了一个用于绘制带间距的函数 fillTextWithSpacing(),使用方式与原生 fillText() 一致,除了多一个用于设置文字间距的参数。下面展示了详细用法。

效果展示:

在线演示 https://bi.cool/bi/ObU1xOY

实现代码:

html

<canvas id="canvas" width='440' height="130"></canvas>

javascript

/**
* 绘制带间距的文字
* @param text 要绘制的文字
* @param x 绘制的位置 x
* @param y 绘制的位置 y
* @param spacing 文字间距
*/
CanvasRenderingContext2D.prototype.fillTextWithSpacing =
function(text,x,y,spacing=0){
// 如果间距为0,则不用对每个字符单独渲染以节省性能
if(spacing === 0){
this.fillText(text,x,y);
return;
} let totalWidth = 0; // 已渲染字符所占用的宽度
// 对每个字符单独渲染
for(let i=0; i<text.length; i++){
this.fillText(text[i],totalWidth,y);
//累计已占用宽度
totalWidth += ctx.measureText(text[i]).width + spacing;
}
} //创建画布
let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d'); //定义文字样式
ctx.font = "bold 40px caption";
ctx.fillStyle = "#54a8eB"; //绘制文字
ctx.fillText('正常间距 - 阳光知道', 0, 40);
ctx.fillTextWithSpacing('扩大间距 - 阳光知道', 0, 80, 6);
ctx.fillTextWithSpacing('缩小间距 - 阳光知道', 0, 120, -5);

代码说明:

我们是直接从原型链上实现的绘制带间距的文字函数,所以可以直接通过 ctx.fillTextWithSpacing() 的方式调用。

其中变量 ctx 是一个 CanvasRenderingContext2D对象,我们用到它的以下属性与函数:

  • fontfillStyle 用来设置设置字体样式与颜色
  • measureText()函数 用于获取文字所占用的宽高信息
  • fillText()函数 用于在画布上绘制文字

版权声明:[自由转载-注明出处-非商用-非衍生](知识共享许可协议)

在 JS 中调整 canvas 里的文字间距的更多相关文章

  1. JS中的柯里化(currying) 转载自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]

    JS中的柯里化(currying) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpr ...

  2. JS中的柯里化(currying)

    何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参 ...

  3. 在JS中调用CS里的方法(PageMethods)

    在JS中调用CS里的方法(PageMethods) 2014年04月28日 11:18:18 被动 阅读数:2998   最近一直在看别人写好的一个项目的源代码,感觉好多东西都是之前没有接触过的.今天 ...

  4. JS中的柯里化及精巧的自动柯里化实现

    一.什么是柯里化? 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 C ...

  5. js中的柯里化

    概述 今天查询事件绑定资料的时候偶然遇到了柯里化这个词,很感兴趣,于是记录下来供以后开发时参考,相信对其他人也有用. 定义 柯里化是函数式编程里面的术语,它是把接受多个参数的函数变换成接受一个单一参数 ...

  6. 从bind函数看js中的柯里化

    以下是百度百科对柯里化函数的解释:柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.概念太抽象,可能 ...

  7. android中向bitmap里写入文字

    public static Bitmap drawText2Bitmap(String text, int imgResourceId, Context mContext) { try { Resou ...

  8. JS中的柯里化与反柯里化

    先占个位 看了一天折资料,感觉清楚多了

  9. js中实现输入框类似百度搜索的智能提示效果

    说明:我这里显示的数据采用词典(词典在js中自定义的,看下面文字),主要显示key. 页面元素: <style type="text/css">.search { le ...

  10. 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法

    前段时间开发了一款微信小程序,运行了也几个月了,在index.js中的onLoad生命周期里获取app.js中onLaunch生命周期中在接口里动态设置的globalData一直没有问题,结果昨天就获 ...

随机推荐

  1. #树状数组,并查集#CF920F SUM and REPLACE

    题目 分析 由于\(a_i=1或2\)时\(d(a_i)=a_i\),且其余情况修改后答案只会越来越小, 考虑用树状数组维护区间和,用并查集跳过\(a_i=1或2\)的情况 代码 #include & ...

  2. 关于pwn题的栈平衡中ret的作用

    以nssctf里的where_is_my_shell为例 题目提供了一个system函数,和一个buf数组.数组的栈空间如图所示,这里不讨论怎么解题,只说明payload里的ret的作用. 假设没有r ...

  3. 【中秋国庆不断更】OpenHarmony多态样式stateStyles使用场景

    @Styles和@Extend仅仅应用于静态页面的样式复用,stateStyles可以依据组件的内部状态的不同,快速设置不同样式.这就是我们本章要介绍的内容stateStyles(又称为:多态样式). ...

  4. OpenHarmony集成OCR三方库实现文字提取

    1. 简介 Tesseract(Apache 2.0 License)是一个可以进行图像OCR识别的C++库,可以跨平台运行 .本样例基于Tesseract库进行适配,使其可以运行在OpenAtom ...

  5. Qt5自带的日志功能,将日志输出到文件

    #include "QtWidgetsApplication1.h" #include <QtWidgets/QApplication> #include <Qt ...

  6. npm,registry,镜像源,npm切换源,yarn,cnpm,taobao,nrs

    描述 我们在使用 node 的 npm 下载依赖的时候,往往下载速度很慢,那是因为 npm 默认的是 npm 处于国外的官方镜像源.所以需要切换到国内的镜像源来加速依赖下载.所以本文推荐一款简单好用 ...

  7. mysql 简单进阶 ———— 重构查询[二]

    前言 简单整理一下重构查询. 正文 为什么我们需要重构查询,原因也很简单,那就是查询慢. 为什么会查询慢? 查询性能慢底下的最基本的原因是访问的数据太多. 某些查询不可避免地需要筛选大量的数据,但这并 ...

  8. Redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

    面试官心理分析 这个也是线上非常常见的一个问题,就是多客户端同时并发写一个 key,可能本来应该先到的数据后到了,导致数据版本错了:或者是多客户端同时获取一个 key,修改值之后再写回去,只要顺序错了 ...

  9. 推荐一个计算Grad-CAM的Python库

    前言 类激活图CAM(class activation mapping)用于可视化深度学习模型的感兴趣区域,增加了神经网络的可解释性.现在常用Grad-CAM可视化,Grad-CAM基于梯度计算激活图 ...

  10. 力扣570(MySQL)-至少有5名直接下属的经理(简单)

    题目: Employee 表包含所有员工和他们的经理.每个员工都有一个 Id,并且还有一列是经理的 Id. 给定 Employee 表,请编写一个SQL查询来查找至少有5名直接下属的经理.对于上表,您 ...