一、Canvas 画布

canvas 组件 提供了绘制界面,可以在之上进行任意绘制

功能描述
Canvas 画布。2.9.0 起支持一套新 Canvas 2D 接口(需指定 type 属性),同时支持同层渲染,原有接口不再维护。

二、Canvas 和Canvas 2D 区别

  • Canvas 2D 需指定 type 属性
  • Canvas 属性 canvas-id ,Canvas 2D改成 id
  • Canvas 标签默认宽度300px、高度150px
  • Canvas 2D(新接口)需要显式设置画布宽高,默认:300*150,最大:1365*1365
<canvas class="pie-chart" canvas-id="chartOrg"></canvas>
<canvas class="pie-chart" type="2d" id="chart2d"></canvas>

API的区别

Canvas新版 Canvas 2D
canvasContext.draw()canvasContext接口没有 draw 方法
canvasContext.setFillStyle(“#000000”)canvasContext.fillStyle = “#000000”
canvasContext.setFontSize(16)canvasContext.font = ‘16px PingFang SC’
canvasContext.setTextAlign(‘center’)canvasContext.textAlign = “center”

提醒:上面API的区别是下面示例用到的,还有其他API的变化,感兴趣的读者自行查阅。

三、示例用到的uni API

3.1 uni.createCanvasContext(canvasId, componentInstance)
3.1.1 定义

创建 canvas 绘图上下文(指定 canvasId)。在自定义组件下,第二个参数传入组件实例this,以操作组件内 组件

提醒: 需要指定 canvasId,该绘图上下文只作用于对应的

参数

参数类型说明
canvasIdString画布标识,传入定义在 的 canvas-id或id(支付宝小程序是id、其他平台是canvas-id)
componentInstanceObject自定义组件实例 this ,表示在这个自定义组件下查找拥有 canvas-id 的 ,如果省略,则不在任何自定义组件内查找

返回值:CanvasContext

3.2 uni.getSystemInfoSync()

获取系统信息的同步接口。调用参数和返回值和调用 uni.getSystemInfo() 一样。

3.3 uni.createSelectorQuery()

提醒

  • 使用 uni.createSelectorQuery() 需要在生命周期 mounted 后进行调用。
  • 默认需要使用到 selectorQuery.in 方法。

selectorQuery.in(component)
将选择器的选取范围更改为自定义组件 component 内,返回一个 SelectorQuery 对象实例。(初始时,选择器仅选取页面范围的节点,不会选取任何自定义组件中的节点)。

示例代码

const query = uni.createSelectorQuery().in(this);
query.select("#id").boundingClientRect((data) => {console.log("得到布局位置信息" + JSON.stringify(data));console.log("节点离页面顶部的距离为" + data.top);}).exec();

注意: 支付宝小程序不支持 in(component),使用无效果

四、微信小程序使用Canvas 和Canvas 2D绘制图形示例

示例效果图

在这里插入图片描述

testCanvas.vue代码

<template><view class="view-root-wrap"><view class="view-content-wrap"><view class="view-content"><text>使用canvas绘制</text><text>使用canvas 2D 绘制</text></view><view class="view-content"><canvas class="pie-chart" canvas-id="chartOrg"></canvas><canvas class="pie-chart"  type="2d" id="chart2d"></canvas></view></view></view>
</template>
<script>
export default {data() {return {isReady: false,}},onReady() {this.isReady = true// this.drawChartOrg()// this.startDrawChart2D()},onLoad(options) {this.drawChartOrg()this.startDrawChart2D()},methods: {// 绘制饼图drawChartOrg() {console.log(`执行了 drawChartOrg 方法  this.isReady = ${this.isReady}`)const canvasContext = uni.createCanvasContext('chartOrg', this)const centerX = 70 // 圆心x坐标const centerY = 70 // 圆心y坐标const innerRadius = 46;// 内圆半径const outerRadius = 70; // 外圆半径let chartData = [{ value: 3, color: '#7539f5', name: 'Fortran' },{ value: 4, color: '#91041c', name: 'Delphi/Object Pascal' },{ value: 4.5, color: '#0582a9', name: 'Visual Basic' },{ value: 5.5, color: '#39c8f5', name: 'Go' },{ value: 6, color: '#f2d407', name: 'JavaScript' },{ value: 7, color: '#480479', name: 'C#' },{ value: 9, color: '#f29707', name: 'Java' },{ value: 11, color: '#5620f3', name: 'C' },{ value: 15, color: '#0676c2', name: 'C++' },{ value: 35, color: '#339AF0', name: 'Python' },];const totalPercent = 100let startAngle = 1.5 * Math.PI // 起始角度// 绘制外圆chartData.forEach(item => {const sliceAngle = (2 * Math.PI * item.value) / totalPercentconst endAngle = startAngle + sliceAnglecanvasContext.beginPath()canvasContext.moveTo(centerX, centerY)canvasContext.arc(centerX, centerY, outerRadius, startAngle, endAngle)canvasContext.closePath()canvasContext.setFillStyle(item.color)canvasContext.fill()startAngle = endAngle})// 绘制内圆canvasContext.beginPath()canvasContext.arc(centerX, centerY, innerRadius, 0, 2 * Math.PI)canvasContext.setFillStyle('#FFFFFF')canvasContext.fill()// 添加中间文字canvasContext.setFontSize(16)canvasContext.setFillStyle('#000000')canvasContext.setTextAlign('center')canvasContext.fillText("编程语言", centerX, centerY + 8)canvasContext.draw()},startDrawChart2D() {console.log(`执行了 startDrawChart 方法  this.isReady = ${this.isReady}`)let delayTime = 500;if (this.isReady) {delayTime = 150}setTimeout(() => {this.drawChart2D()}, delayTime);},// 使用 Canvas2D 绘制饼图drawChart2D() {const query = uni.createSelectorQuery().in(this)query.select('#chart2d').fields({ node: true, size: true }).exec((res) => {try {let { node, width, height } = res[0];const canvas = nodeconst canvasContext = canvas.getContext('2d')const dpr = uni.getSystemInfoSync().devicePixelRatioconst tempWidth = width * dprcanvas.width = tempWidthcanvas.height = tempWidthcanvasContext.scale(dpr, dpr)const radius = width / 2const centerX = radius  // 圆心x坐标const centerY = radius // 圆心y坐标const outerRadius = radius; // 外圆半径const innerRadius = outerRadius * 0.65; // 内圆半径let chartData = [{ value: 3, color: '#7539f5', name: 'Fortran' },{ value: 4, color: '#91041c', name: 'Delphi/Object Pascal' },{ value: 4.5, color: '#0582a9', name: 'Visual Basic' },{ value: 5.5, color: '#39c8f5', name: 'Go' },{ value: 6, color: '#f2d407', name: 'JavaScript' },{ value: 7, color: '#480479', name: 'C#' },{ value: 9, color: '#f29707', name: 'Java' },{ value: 11, color: '#5620f3', name: 'C' },{ value: 15, color: '#0676c2', name: 'C++' },{ value: 35, color: '#339AF0', name: 'Python' },];const totalPercent = 100let startAngle = 1.5 * Math.PI // 起始角度// 绘制外圆chartData.forEach(item => {const sliceAngle = (2 * Math.PI * item.value) / totalPercentconst endAngle = startAngle + sliceAnglecanvasContext.beginPath()canvasContext.moveTo(centerX, centerY)canvasContext.arc(centerX, centerY, outerRadius, startAngle, endAngle)canvasContext.closePath()canvasContext.fillStyle = item.colorcanvasContext.fill()startAngle = endAngle})// 绘制内圆canvasContext.beginPath()canvasContext.arc(centerX, centerY, innerRadius, 0, 2 * Math.PI)canvasContext.fillStyle = "#FFFFFF"canvasContext.fill()// 添加中间文字canvasContext.font = '16px PingFang SC'canvasContext.fillStyle = "#000000"canvasContext.textAlign = "center"canvasContext.fillText("编程语言", centerX, centerY + 8)} catch (error) {console.log("drawChart2D 绘制发生异常: " + error)}})},}
}
</script>
<style scoped>
.view-root-wrap {padding: 12px;
}.view-content-wrap {display: flex;flex-direction: column;justify-content: center;background-color: white;padding: 28rpx;border-radius: 16rpx;
}.view-content {display: flex;flex-direction: row;justify-content: space-around;margin-top: 32rpx;
}.pie-chart {width: 140px;height: 140px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96136.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96136.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96136.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word如何转换为pdf

pip install pywin32import os import win32com.client import pythoncom # 新增&#xff1a;用于处理COM线程 import sysdef docx_to_pdf(docx_path, pdf_pathNone):"""将Word文档转换为PDF格式&#xff0c;修复退出时的COM错误"""if not os.p…

服务器Linux防火墙怎样实现访问控制

在互联网世界里&#xff0c;Linux服务器就像一座城池&#xff0c;而防火墙便是城池的守卫者。没有防火墙&#xff0c;外部的任何流量都能毫无阻拦地进入服务器;而有了防火墙&#xff0c;就可以像设关卡一样&#xff0c;对进出城门的人进行盘查和控制。对企业运维人员来说&#…

【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架

【原创理论】Stochastic Coupled Dyadic System (SCDS)&#xff1a;一个用于两性关系动力学建模的随机耦合系统框架 作者&#xff1a;[望月&#xff0c;GPT5,GPT-O3,Gemini2.5pro] 分类&#xff1a; 人工智能 理论模型 交叉学科 系统科学 人性 爱情 标签&#xff1a; 关系动力…

星图云开发者平台新功能速递 | 微服务管理器:无缝整合异构服务,释放云原生开发潜能

在构建现代数字化应用的过程中&#xff0c;开发者常常面临一个关键挑战&#xff1a;如何高效、安全地集成和复用既有的复杂服务或自有业务系统&#xff1f;这些服务可能是核心算法引擎、遗留业务逻辑模块&#xff0c;或是特定的SaaS能力。传统方式下&#xff0c;将它们融入新的…

数据结构:构建 (create) 一个二叉树

目录 问题的本质——什么信息才能唯一确定一棵树&#xff1f; 推导“最佳拍档”——哪两种遍历序列能行&#xff1f; 递归思想——如何构建一棵树&#xff1f; 第1步&#xff1a;确定整棵树的根节点 第2步&#xff1a;划分左右子树的成员 第3步&#xff1a;递归构建左右子…

【STM32】HAL库中的实现(五):ADC (模数转换)

什么是 ADC&#xff08;模数转换器&#xff09; ADC&#xff08;Analog to Digital Converter&#xff09;是将 模拟信号&#xff08;电压&#xff09;转换成数字信号&#xff08;数值&#xff09; 的器件。 在 STM32 中&#xff0c;ADC 通常具有以下特性&#xff1a;特性描述分…

智慧校园中IPTV融合对讲:构建高效沟通新生态

在智慧校园的建设浪潮里&#xff0c;IPTV融合对讲系统宛如一颗璀璨的新星&#xff0c;以其独特的功能和强大的优势&#xff0c;为校园的沟通与管理带来了全新的变革&#xff0c;构建起一个高效、便捷、智能的沟通新生态。从日常沟通层面来看&#xff0c;IPTV融合对讲系统打破了…

智能合约里的 “拒绝服务“ 攻击:让你的合约变成 “死机的手机“

你有没有遇到过手机突然卡死&#xff0c;点什么都没反应的情况&#xff1f;在区块链世界里&#xff0c;智能合约也可能遭遇类似的 "罢工"—— 这就是 "拒绝服务攻击"&#xff08;Denial of Service&#xff0c;简称 DoS&#xff09;。今天用大白话讲讲合约…

安全设计-防止非法移机

前言我们的设备在实际使用过程中&#xff0c;在我们的巡查机制粒度下&#xff0c;发现依然有设备被非法移动到其他非计划点位。因此&#xff0c;我们需要设计一套及时预警&#xff0c;但是对客户无感&#xff0c;不影响业务办理的防范机制。1.方案设计交互图2.方案说明 2.1方案…

OpenHarmony之三方库适配深度实践:从移植到合规的全链路指南

1. 为什么要做三方库适配?——更深层的价值分析 维度 现状痛点 预期收益 深度价值 生态 成熟开源库无法直接运行 复用 10+ 年开源沉淀,提升功能覆盖率 避免生态碎片化:通过标准化适配流程,确保不同厂商对同一库的实现一致 性能 JS 层重实现耗 CPU 原生 C/C++ 加速 3~10 倍 …

2025年09月计算机二级MySQL选择题每日一练——第一期

计算机二级中选择题是非常重要的&#xff0c;所以开始写一个每日一题的专栏。 答案及解析将在末尾公布&#xff01; 今日主题&#xff1a;MySQL 基础概念 1、以下关于数据库的特点中&#xff0c;描述正确的是&#xff08; &#xff09; A. 数据无冗余 B. 数据不可共享&#xff…

JAVA字符串操作——在蓝桥杯的基本应用

我们来系统地梳理一下 Java 中的字符串操作。Java 的字符串操作非常丰富&#xff0c;主要涉及到 String、StringBuilder 和 StringBuffer 这三个核心类。 目录 一、核心类简介 二、String 类的常用操作 1. 创建字符串 2. 获取基本信息 3. 比较字符串 4. 查找与判断 5. 转…

【深度学习基础】PyTorch Tensor生成方式及复制方法详解

目录PyTorch Tensor生成方式及复制方法详解一、Tensor的生成方式&#xff08;一&#xff09;从Python列表/元组创建&#xff08;二&#xff09;从NumPy数组创建&#xff08;三&#xff09;特殊初始化方法&#xff08;四&#xff09;从现有Tensor创建&#xff08;五&#xff09;…

动态规划:入门思考篇

1. 简单类比 假如我们要求全国人数&#xff0c;那么我们只要知道各个省的人数&#xff0c;然后将各个省的人数相加即可&#xff0c;要想知道各个省的人数&#xff0c;只要将这个省下面所有的市人数相加即可&#xff0c;同样&#xff0c;如果想要知道各个市的人数&#xff0c;只…

小杨的 X 字矩阵(举一反三)-洛谷B3865 [GESP202309 二级]

题目描述 小杨想要构造一个 X 字矩阵&#xff08; 为奇数&#xff09;&#xff0c;这个矩阵的两条对角线都是半角加号 &#xff0c;其余都是半角减号 - 。例如&#xff0c;一个 55 的 X 字矩阵如下&#xff1a; --- --- ---- --- --- 请你帮小杨根据给定的 打印出对应的“X …

数据组合与合并:Pandas 数据整合全指南 +缺失值处理

数据组合与合并&#xff1a;Pandas 数据整合全指南在进行数据分析之前&#xff0c;数据清洗与整合是关键步骤。 遵循“整洁数据”&#xff08;Tidy Data&#xff09;原则&#xff1a; 每个观测值占一行每个变量占一列每种观测单元构成一张独立的表格 整理好数据后&#xff0c;常…

c#联合halcon的基础教程(案例:亮度计算、角度计算和缺陷检测)(含halcon代码)

目录 1.环境配置 2.案例一&#xff1a;亮度计算 halcon代码&#xff1a; 主界面代码&#xff1a; 3.案例二&#xff1a; 角度计算 halcon代码&#xff1a; 主界面代码&#xff1a; 4.案例三&#xff1a;缺陷检测 halcon代码&#xff1a; 主界面代码&#xff1a; 通过…

大数据云原生是什么

"云原生"&#xff08;Cloud Native&#xff09;指的是‌利用云计算原生优势&#xff08;弹性、按需服务、自动化、分布式等&#xff09;来设计、构建、部署和运行大数据应用和工作负载的方法论与技术体系‌。它不是简单地“把大数据平台搬到云上”&#xff0c;而是从…

Pytest项目_day16(yaml和parametrize结合)

查询手机号归属地 我们首先可以在YAML文件中定义测试数据 方式一&#xff0c;使用- 注意&#xff1a;当我们需要一次传入两个参数时&#xff0c;需要定义两层迭代&#xff0c;即两层列表不够直观&#xff0c;容易写错 输出的结果为&#xff1a; 然后我们可以将测试数据传入test…

【Nginx指南】从核心原理到生产实践

目录Nginx指南&#xff1a;从核心原理到生产实践引言&#xff1a;Nginx在现代架构中的核心地位一、Nginx核心能力与应用场景1.1 多场景适配的全能型中间件1.2 技术优势&#xff1a;Nginx成为行业标准的关键二、Nginx安装部署&#xff1a;源码编译与包管理方案2.1 源码编译&…