Canvas 文本填充线性渐变的使用详解

所属分类: 网页制作 / html5 阅读数: 1494
收藏 0 赞 0 分享

前言

在 Canvas 中对文本填充水平或垂直的线性渐变可以轻易实现,而带角度的渐变就复杂很多;就好像下面这样,假设文本矩形宽为 W, 高为 H, 左上角坐标为 X, Y

猜想与答案

给出两个答案:

正确答案是图二,因为这样得出来的坐标生成的渐变最紧接文本矩形边界,它的运动轨迹如下动图:

(图来源:Do you really know CSS linear-gradients)

渐变起点与终点坐标的计算

所以,渐变的起点与终点坐标该怎么计算呢?答:

  1. 先求得起点与终点的长度(距离)。
  2. 根据长度与文本矩形的中心点坐标分别计算出起点与终点坐标。

线性渐变长度的计算 W3C 给出了一个公式(A 表示角度):

gradientLineLength = abs(W * sin(A)) + abs(H * cos(A))

不过,该公式主要应用于 CSS 的线性渐变设置,即以 12 点钟方向为 0°,顺时针旋转。

而我们需要的是以 3 点钟方向为 0°,逆时针旋转,即公式为:

gradientLineLength = abs(W * cos(A)) + abs(H * sin(A))

// 半长:
halfGradientLineLength = (abs(W * cos(A)) + abs(H * sin(A))) / 2

那么这个公式是怎么来的呢?以下是笔者的求解:

由图可得以下方程组:

因此可推导出:

化简后为:

所以 c1 + c2 为:

由三角函数平方公式知:cos(A) * cos(A) = 1 - sin(A) * sin(A), 代入 c1 + c2

第一步化简后:

最后的结果就是:

因为 sin, cos 在函数周期内存在负值(见下面角度对应的三角函数周期图),所以线性渐变的长度需要取绝对值。

至此,我们知道了线性渐变长度,文本矩形的中心点坐标很好算,即:

centerX = X + W / 2
centerY = Y + H / 2

所以,起点与终点的坐标分别为:

startX = centerX - cos(A) * halfGradientLineLength
startY = centerY + sin(A) * halfGradientLineLength

endX = centerX + cos(A) * halfGradientLineLength
endY = centerY - sin(A) * halfGradientLineLength

看看最终效果

经验注释

进行三角函数计算时,应尽量避免先用 tan, 因为 tan 在其周期内存在无穷值,需要做特定的条件判断,而 sin, cos 没有此类问题,代码书写更为简洁清晰并且不会因疏忽产生错误,见下面三角函数与角度的对应关系周期图。

参阅

Do you really know CSS linear-gradients?

MDN linear-gradient

W3C - CSS Images Module Level 3 # linear-gradients

到此这篇关于Canvas 文本填充线性渐变的使用详解的文章就介绍到这了,更多相关Canvas文本填充线性渐变内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

更多精彩内容其他人还在看

HTML5 Convas APIs方法详解

这篇文章主要介绍了HTML5 Convas APIs方法详解,本文罗列了Convas APIs中的大部份方法,给出这些方法的中文注释,需要的朋友可以参考下
收藏 0 赞 0 分享

HTML5 Canvas中绘制椭圆的4种方法

这篇文章主要介绍了HTML5 Canvas中绘制椭圆的4种方法,本文讲解了参数方程法、均匀压缩法、三次贝塞尔曲线法、光栅法等4种方法,需要的朋友可以参考下
收藏 0 赞 0 分享

HTML5 Video标签的属性、方法和事件汇总介绍

这篇文章主要介绍了HTML5 Video标签的属性、方法和事件汇总介绍,本文讲解了标签的属性、获取video对象、Media方法和属性、网络状态 、准备状态 、回放状态、相关事件行装内容,需要的朋友可以参考下
收藏 0 赞 0 分享

HTML5 video标签(播放器)学习笔记(一):使用入门

这篇文章主要介绍了HTML5 video标签(播放器)学习笔记(一):使用入门,本文讲解了使用标签、比如播放视频的路径、是否显示控制条、让视频自动播放或自动加载、让播放器规范一点等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

HTML5 video标签(播放器)学习笔记(二):播放控制

这篇文章主要介绍了HTML5 video标签(播放器)学习笔记(二):播放控制,本文讲解了获取影片总时长、播放、暂停、获取影片的播放时间和设置播放点、音量的获取和设置等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

HTML5 video播放器全屏(fullScreen)方法实例

这篇文章主要介绍了HTML5 video播放器全屏(fullScreen)方法实例,本文直接给出一个完整代码实例,需要的朋友可以参考下
收藏 0 赞 0 分享

HTML5全屏(Fullscreen)API详细介绍

这篇文章主要介绍了HTML5全屏(Fullscreen)API详细介绍,本文给出了启动全屏模式和退出全屏模式代码示例,同时讲解了Fullscreen 属性与事件,需要的朋友可以参考下
收藏 0 赞 0 分享

HTML5 audio标签使用js进行播放控制实例

这篇文章主要介绍了HTML5 audio标签使用js进行播放控制实例,本文直接给出代码实例,演示了获取播放时间、播放、暂停、静音等控制方法,需要的朋友可以参考下
收藏 0 赞 0 分享

HTML5 Canvas的事件处理介绍

这篇文章主要介绍了HTML5 Canvas的事件处理介绍,本文讲解了Canvas的限制、给Canvas元素绑定事件、isPointInPath方法、循环重绘和事件冒泡等内容,需要的朋友可以参考下
收藏 0 赞 0 分享

Html5+JS实现手机摇一摇功能

这篇文章主要介绍了Html5+JS实现手机摇一摇功能,本文使用HTML5的DeviceOrientation实现监听手机方向传感器数据,实现摇一摇功能雏形,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多