百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

JavaScript全解析——canvas 绘制变换和渐变

toyiye 2024-05-19 19:35 15 浏览 0 评论

绘制变换
●在 cancas 内, 也可以向 css 中一样, 出现一些 2d 变换的效果
●先来绘制一个基本矩形


// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 绘制一个填充矩形
ctx.fillRect(100, 100, 200, 100)


绘制位移
●可以将你要绘制的内容进行位移操作
●语法 : 工具箱.transform( x 方向位移尺寸, y 方向位移尺寸 )
●注意 : 一定要先设置位置在进行填充或者描边的操作

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 进行位移设置
ctx.translate(50, 50)

// 3. 绘制一个填充矩形
ctx.fillRect(100, 100, 200, 100)


绘制缩放
●可以将你要绘制的图形进行缩放操作
●语法 : 工具箱.scale( x 轴方向缩放, y 轴方向缩放 )
●注意 : 一定要先设置缩放在进行填充或者描边的操作
●注意 : canvas 的缩放不仅仅是对内容的缩放, 更是对画布的缩放

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 进行位移设置
ctx.scale(2, 2)

// 3. 绘制一个填充矩形
ctx.fillRect(100, 100, 200, 100)


●我们会发现他已经出界了
因为我们原先预设的 100 100 的坐标位置开始
这个画布放大了, 那么就相当于在 200 200 的位置开始了这个矩形
我们预设的 200 * 100 的矩形
变成了 400 * 200 的矩形

绘制旋转
●可以将你要绘制的内容进行旋转操作
●语法 : 工具箱.rotate( 旋转的弧度 )
●注意 : 一定要先设置缩放在进行填充或者描边的操作
●注意 : canvas 中的旋转中心点只能是画布的左上角, 相当于是在旋转画布

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 进行旋转, 因为是弧度, 换算以后是 30deg 角度
ctx.rotate(Math.PI / 180 * 30)

// 3. 绘制一个填充矩形
ctx.fillStyle = '#000'
ctx.fillRect(100, 100, 200, 100)


●可能不太好看的出来是如何计算的 30deg
●看看下面这个例子

●这样可能就更明确了一些

绘制渐变
●canvas 中也是可以绘制渐变颜色的
●而且相对比较简单, 我们只需要制定好渐变方案即可

线性渐变
●要完成一个线性渐变
○要现制定一个渐变方案
○向渐变方案内填充颜色
●然后我们在填充或者描边的时候, 使用这个渐变方案即可
●指定渐变方案
○语法 : 工具箱.createLinearGranient(起点x坐标, 起点y坐标, 终点x坐标, 终点y坐标)


// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const linearGradient = ctx.createLinearGradient(100, 100, 500, 200)

○注意 : 这个坐标位置都是以画布原点开始计算的
○这时是看不到渐变颜色的, 因为我们还没有添加渐变颜色

○根据我们上面的预设, 这个红框圈出来的位置才是真实的完整渐变
○超出红框的位置会自动填充
■左侧超出的全部是开始渐变的颜色
■右侧超出的全部是结束渐变的颜色
■上下超出的按照渐变方向进行统一调整
●接下来我们来给这个渐变方案添加一些渐变的颜色
○语法 : 渐变方案.addColorStop( 位置, 颜色 )

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const linearGradient = ctx.createLinearGradient(100, 100, 500, 200)
// 2-2. 添加渐变颜色
linearGradient.addColorStop(0, 'red')
linearGradient.addColorStop(1, 'orange')

○这里的位置关系是从 0 到 1, 0 表示指定范围开始坐标, 1 表示指定范围结束坐标
○咱们就从红色渐变过渡到橘黄色


○目前我们的渐变颜色还是没有出现在画布上, 这个是我模拟的形式
○其实只有我们确定的, 100 100 到 500 200 的位置( 黑框圈出来 )是一个完整渐变
○超出的位置都是由 canvas 自动判断填充的颜色
●现在, 这个渐变方案就完成了
●剩下的就是使用这个渐变方案了
●直接把渐变方案设置给 fillStyle 或者 strokeStyle 就可以了


// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const linearGradient = ctx.createLinearGradient(100, 100, 500, 200)
// 2-2. 添加渐变颜色
linearGradient.addColorStop(0, 'red')
linearGradient.addColorStop(1, 'orange')

// 3. 绘制一个矩形
// 3-1. 设置填充矩形的填充颜色, 使用渐变
ctx.fillStyle = linearGradient
// 3-2. 绘制矩形
ctx.fillRect(100, 100, 400, 100)

●这样渐变颜色就出现了
●接下来我们缩小矩形范围

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const linearGradient = ctx.createLinearGradient(100, 100, 500, 200)
// 2-2. 添加渐变颜色
linearGradient.addColorStop(0, 'red')
linearGradient.addColorStop(1, 'orange')

// 3. 绘制一个矩形
// 3-1. 设置填充矩形的填充颜色, 使用渐变
ctx.fillStyle = linearGradient
// 3-2. 绘制矩形
ctx.fillRect(100, 100, 300, 100)


●我们会看到, 我们只能看到完整渐变的一部分了
●注意 : 渐变不是根据你的图形而制定的, 而是根据画布制定的
●文本内容也是可以使用线性渐变的

径向渐变
●和刚才的线性渐变是一样的
○先要制定渐变方案
○然后向渐变方案内添加颜色
●剩下的就是在使用的时候直接使用渐变方案即可
●语法 : ctx.createRadialGradient(x1, y1, r1, x2, y2, r2)
○x1 : 起始圆圆心 x 轴坐标
○y1 : 起始圆圆心 y 轴坐标
○r1 : 起始圆半径
○x2 : 终止圆圆心 x 轴坐标
○y2 : 终止圆圆心 y 轴坐标
○r2 : 终止圆半径

// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const radialGradient = ctx.createRadialGradient(100, 100, 100, 500, 200, 50)
// 2-2. 向渐变方案内填充颜色
radialGradient.addColorStop(0, 'red')
radialGradient.addColorStop(1, 'orange')

●这个渐变方案是什么样子的内, 不太好用文字描述
●其实就是两个圆的切线相连, 绘制的区域为渐变区域
●看下面这个例子

●这样可能更明确一些
●注意 : 渐变是包含开始圆位置, 但是不包含终止圆的位置的
●按照切线相连的区域, 超出去的部分会用纯色填充, 由 canvas 自己计算
●按照我们刚才绘制的渐变方案, 咱们绘制一个和画布一样大小的矩形就能看出效果了


// 0. 获取到页面上的 canvas 标签元素节点
const canvasEle = document.querySelector('#canvas')

// 1. 获取当前这个画布的工具箱
const ctx = canvasEle.getContext('2d')

// 2. 制定渐变方案
// 2-1. 生成一个渐变方案
const radialGradient = ctx.createRadialGradient(100, 100, 100, 500, 200, 50)
// 2-2. 向渐变方案内填充颜色
radialGradient.addColorStop(0, 'red')
radialGradient.addColorStop(1, 'orange')

// 3. 绘制矩形
// 3-1. 使用渐变方案
ctx.fillStyle = radialGradient
// 3-2. 绘制矩形
ctx.fillRect(0, 0, 600, 300)



●这就是径向渐变
●文本内容也是可以使用径向渐变的



相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码