好程序员:前端JavaScript全解析——Canvas绘制形状(下)
myzbx 2025-05-08 03:33 12 浏览
接着上一篇,好程序员继续讲解前端技术文章!
绘制椭圆
●canvas 也提供了绘制椭圆的 API
●语法 : 工具箱.ellipse( x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise )
○x : 椭圆中心点的 x 轴坐标
○y : 椭圆中心点的 y 轴坐标
○radiusX : 椭圆在 x 轴方向上的半径
○radiusY : 椭圆在 y 轴方向上的半径
○rotation : 旋转弧度
○startAngle : 弧线开始弧度
○endAngle : 弧线结束弧度
○antiClockwise : 方向, false 表示逆时针绘制(默认), true 表示顺时针绘制
●注意 :
○计算弧度的方式和之前我们画圆的时候是一样的
○旋转弧度是指讲该椭圆进行旋转
●语法有了, 我们现在开始试一下
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
ctx.strokeStyle = '#000'
ctx.lineWidth = 2
// 2. 绘制椭圆
ctx.ellipse( 300, 150, 200, 100, 0, 0, Math.PI * 2, false )
// 3. 描边
ctx.stroke()
复制代码
●这样我们一个椭圆就出来了, 咱们来详细解释一下这些内容的意义
●旋转弧度, 就是在现在的基础上, 让整个图形进行旋转
绘制阴影
●canvas 中也是可以绘制阴影的
●不管是描边还是填充, 都可以绘制阴影
●但是要在 描边 或者 填充 之前, 进行阴影设置就好
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
ctx.strokeStyle = '#000'
ctx.lineWidth = 2
// 2. 绘制椭圆
ctx.ellipse( 300, 150, 200, 100, 0, 0, Math.PI * 2, false )
// 3. 设置阴影
// 3-1. 设置阴影颜色
ctx.shadowColor = 'red'
// 3-2. 设置阴影模糊成都
ctx.shadowBlur = 20
// 3-3. 设置阴影 x 轴方向偏移量
ctx.shadowOffsetX = 50
// 3-4. 设置阴影 y 轴方向偏移量
ctx.shadowOffsetY = 50
// 4. 描边
ctx.stroke()
复制代码
●阴影就出来了, 填充的图形, 阴影也是一个道理
绘制虚线
●canvas 中绘制虚线比较简单, 只要配置好虚线方案即可
●但是在配置虚线方案的时候, 我们需要多一些思考
●语法 : 工具箱.setDashLine([ 第一段长度, 第二段长度, ... ])
这个解释起来稍微复杂一些
我们都知道虚线就是一段有一段没有
按照有和没有区分, 我们可以把一个虚线分成一段一段的
●先来看一个例子
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 设置虚线方案
// 其实就是 5px 和 10px 重复出现
ctx.setLineDash([ 5, 10 ])
// 3. 绘制线段
ctx.moveTo( 100, 100 )
ctx.lineTo( 400, 100 )
ctx.strokeStyle = '#000'
ctx.lineWidth = 10
ctx.stroke()
复制代码
●现在看起来很简单, 但是我们讲方案稍作修改
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 设置虚线方案
// 其实就是 5px 和 10px 和 15px 重复出现
ctx.setLineDash([ 5, 10, 15 ])
// 3. 绘制线段
ctx.moveTo( 100, 100 )
ctx.lineTo( 400, 100 )
ctx.strokeStyle = '#000'
ctx.lineWidth = 10
ctx.stroke()
复制代码
●我们会看到出现了一个奇奇怪怪的图形, 这是为什么呢
其实我们先来看虚线方案
ctx.setLineDash([ 5, 10, 15 ])
也就是说, 在描述这个虚线的时候, 是 5px, 10px, 15px, 5px, 10px, 15px, ... 这样重复
在一个虚线的绘制过程中, 第一段是 有内容, 第二段是 空白, 第三段是 有内容, ... 重复
所以,
第一段有内容的就是 5px
第二段空白的就是 10px
第三段又是有内容, 那么就是 15px
第四段是空白内容, 回到 5px 重复
第五段是有内容, 就到了 10px
第六段是空白内容, 就是 15px
至此, 才是一个完整的 虚线方案 和 虚线绘制 配套的第一个重复片段
●建议 : 如果不是特殊需要, 一般来说, 虚线绘制方案我们进行采取两个数字重复绘制文本
●canvas 内可以直接绘制文本的, 不需要我们用线条去绘制
●而且我们绘制字体的时候可以有两种
○描边字体
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 开始绘制文本
// 2-1. 准备一段要绘制的文本内容
const text = '千锋 - 数字智慧大前端'
// 2-2. 设置字体内容
// 语法: 工具箱.font = '字号大小 字体'
ctx.font = '30px Arial'
// 2-3. 设置描边颜色
ctx.strokeStyle = '#000'
// 2-4. 绘制描边字体
// 语法: 工具箱.strokeText( 文本, 文本开始 X 坐标, 文本开始 Y 坐标 )
ctx.strokeText(text, 100, 100)
// 2-5. 设置填充颜色
ctx.fillStyle = 'skyblue'
// 2-6. 绘制填充字体
// 语法: 工具箱.fillText( 文本, 文本开始 X 坐标, 文本开始 Y 坐标 )
ctx.fillText(text, 100, 220)
复制代码
●这样我们的文字就绘制出来了
●接下来就是绘制一些文字相关的细节绘制文字阴影
●和刚才我们的绘制阴影是一样的
●只要在绘制之前把阴影属性设置好即可
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 设置阴影信息
ctx.shadowColor = 'red'
ctx.shadowBlur = 5
ctx.shadowOffsetX = 50
ctx.shadowOffsetY = 50
// 2. 开始绘制文本
// 2-1. 准备一段要绘制的文本内容
const text = '千锋 - 数字智慧大前端'
// 2-2. 设置字体内容
ctx.font = '30px Arial'
// 2-3. 设置描边颜色
ctx.strokeStyle = '#000'
// 2-4. 绘制描边字体
ctx.strokeText(text, 100, 100)
// 2-5. 设置填充颜色
ctx.fillStyle = 'skyblue'
// 2-6. 绘制填充字体
ctx.fillText(text, 100, 220)
复制代码
设置文字对其方式
●在 canvas 内, 对于文字的对其方式修饰就是两种
○水平方向
○垂直方向
●水平方向对其
○语法 : 工具箱.textAlign = '值'
○值
start : 默认, 文本在指定的位置开始
end : 文本在指定的位置结束
center : 文本的中心被放置在指定的位置
left : 文本左对齐
right : 文本右对齐
○注意 : 这里指定的值是指你在使用 fillText 或者 strokeText 时设置的 x 轴坐标位置
●垂直对其方式
○语法 : 工具箱.testBaseline = '值'
○值
alphabetic:默认,文本基线是普通的字母基线
top:文本基线是 em 方框的顶端
hanging:文本基线是悬挂基线
middle:文本基线是 em 方框的正中
ideographic: 文本基线是 em 基线
bottom:文本基线是 em 方框的底端
○其实和我们学习 css 的时候的对其方式是一样的
获取文本信息
●有的时候, 我们可能需要给文本加一个下划线
●或者在某些时候, 我们需要把文本包裹在一个矩形框内
●那么这个时候, 我们就要拿到你写的这一段文本, 在画布上占多宽
●这个时候, 我们就可以获取文本信息了
●当你已经设置好文本信息以后, 不需要绘制的时候, 就可以拿到将来文本会在画布上占据多少信息
●语法 : 工具箱.measureText( 文本内容 )
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 开始绘制文本
// 2-1. 准备一段要绘制的文本内容
const text = '千锋 - 数字智慧大前端'
// 2-2. 设置字体内容
ctx.font = '30px Arial'
// 2-3. 设置描边颜色
ctx.strokeStyle = '#000'
// 获取字体信息
const textInfo = ctx.measureText(text)
console.log(textInfo) // 完整字体信息
console.log(textInfo.width) // 字体在画布上所占据的宽度
复制代码虚线文本
●其实就是在绘制一个描边文本的时候
●在绘制之前, 把虚线方案给到 canvas 即可
// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')
// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')
console.log(ctx)
// 2. 开始绘制文本
// 2-1. 准备一段要绘制的文本内容
const text = '千锋 - 数字智慧大前端'
// 2-2. 设置字体内容
ctx.font = '30px Arial'
// 2-3. 设置描边颜色
ctx.strokeStyle = '#000'
// 2-4. 添加虚线方案
ctx.setLineDash([ 5 ])
// 3. 描边绘制文本
ctx.strokeText(text, 100, 100)
复制代码
关注小源,为您解答更多前端和Java技术相关文章!
相关推荐
- 怎么恢复7z文件 7z文件删除了怎么恢复
-
7z是一种压缩格式的文件,它运用LZMA压缩算法,该压缩算法的输出稍后被算数编码进行处理以便后续进一步压缩,压缩比十分高。我们可以将文件压缩成这种格式,便于传输,保存,占空间少。了解更多7z文件知识...
- 郎酒让消费者喝得明明白白 算术题里有答案
-
日前,『郎酒酱香产品企业内控准则』颁布,郎酒首次公开酱香产品生产全过程,公布酱香产品产能、储能及投放计划。随后,郎酒官微向消费者发出「品控算术题」有奖问答。郎酒亮出家底,消费者踊跃留言。8天后,谜底揭...
- 学龄前,比识字、算术更重要的是这三件事
-
“为了给孩子选择一家合适的幼儿园,我曾穿梭于纽约各家幼儿园的开放日,这些幼儿员既包括主流的公立幼儿园,还包括那些遥不可及的私人幼儿园。我的目的就是想了解他们的教育理念是什么,到底厉害在哪里,看看对于我...
- 参加CSP-J信奥赛需要掌握数学知识
-
在C++语法的学习中需要储备的数学知识如下①数据类型:需要知道整数、正整数、负整数、小数、判断对错②算术运算符:加法、减法、乘法、除法、取模运算③关系表达式:大于、大于等于、小于、小...
- 1g米饭能做多少深蹲?今天我们来算一算
-
减重我们都知道3分在练,7分在吃,吃这件事情上,真的是每一口都算数。今天我们来算一笔账,1粒米饭可以做多少事情?本着认真负责的态度,今天在食物秤上称了1g米饭,是16粒。根据能量换算:100g米饭是4...
- web 自动化测试,一定得掌握的 8 个核心知识点
-
使用cypress进行端对端测试,和其他的一些框架有一个显著不同的地方,它使用JavaScript作为编程语言。传统主流的selenium框架是支持多语言的,大多数QA会的pytho...
- 大话C语言:赋值运算符(c语言中赋值运算符是什么)
-
赋值运算符是最基本的运算符之一,用于将右侧的值或表达式的计算结果赋给左侧的变量。它是一个二元运算符,意味着它需要两个操作数:一个是目标变量(左侧),另一个是要赋给该变量的值或表达式(右侧)。赋值运算符...
- Vue进阶(幺幺伍):js 将字符串转换为boolean
-
Boolean();参数为0、null和无参数返回false,有参数返回true。Boolean("");//输出为:falseBoolean(null);//输出为...
- mongodb查询的语法(大于,小于,大于或等于,小于或等于等等)
-
1).大于,小于,大于或等于,小于或等于$gt:大于$lt:小于$gte:大于或等于$lte:小于或等于例子:db.collection.find({"field":{$gt:valu...
- Python学不会来打我(21)python表达式知识点汇总
-
在Python中,表达式是由变量、运算符、函数调用等组合而成的语句,用于产生值或执行特定操作。以下是对Python中常见表达式的详细讲解:1.1算术表达式涉及数学运算的表达式。例如:a=5b...
- C|数据存储地址与字节偏移、数据索引
-
话说C是面向内存的编程语言。数据要能存得进去,取得出来,且要考虑效率。不管是顺序存储还是链式存储,其寻址方式总是很重要。顺序存储是连续存储。同质结构的数组通过其索引表示位置偏移,异质结构的结构体通过其...
- 下班后累懵?4 个 JS 手写题帮你搞定前端面试高频考点
-
打工人下班后最痛苦的事,莫过于拖着疲惫的身子还要啃前端面试题吧?看着那些密密麻麻的JS代码,脑子都快转不动了!别担心,今天咱就用轻松的方式,带你吃透4道高频手写题,让你在面试时自信满满,再也不...
- 嵌入式数据库sqlite3【进阶篇】-子句和函数的使用,小白一文入门
-
sqlite在《嵌入式数据库sqlite3命令操作基础篇-增删改查,小白一文入门》一文中讲解了如何实现sqlite3的基本操作增删改查,本文介绍一些其他复杂一点的操作。比如where、orderby...
- 前缀表达式与后缀表达式(前缀表达式后缀表达式中缀表达式计算)
-
昨天晚上和儿子一起学习了前缀表达式和后缀表达式。这应该是字符串算式如何被计算机识别并计算的2种方法。本来是想先给他讲一个逆波兰式(后缀表达式),以后再讲前缀表达式。没想到他还挺聪明,很快就把2个都掌握...
- Python快速入门教程1:基本语法、数据类型、运算符、数字字符串
-
Python3的基础教程,涵盖了基本语法、数据类型、类型转换、解释器、注释、运算符、数字和字符串等内容,并附有使用实例场景。Python3的基础教程,涵盖了基本语法、数据类型、类型转换、解释器、注释、...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)