我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在微信小程序中如何使用canvas绘制天气折线图

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在微信小程序中如何使用canvas绘制天气折线图

今天小编给大家分享一下在微信小程序中如何使用canvas绘制天气折线图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

折线

效果图:

在微信小程序中如何使用canvas绘制天气折线图

自定义组件 line-chart

<canvas type="2d" id="line" class="line-class" style="width:{{width}}px;height:{{height}}px" />
Component({  externalClasses: ['line-class'],  properties: {    width: String,    height: String,    data: Array,  },  observers: {    width() {      // 这里监听 width 变化重绘 canvas      // 动态传入 width 好像只能这样了..      const query = this.createSelectorQuery();      query        .select('#line')        .fields({ node: true, size: true })        .exec(res => {          const canvas = res[0].node;          const ctx = canvas.getContext('2d');          const width = res[0].width; // 画布宽度          const height = res[0].height; // 画布高度          console.log(`宽度: ${width}, 高度: ${height}`);          const dpr = wx.getSystemInfoSync().pixelRatio;          canvas.width = width * dpr;          canvas.height = height * dpr;          ctx.scale(dpr, dpr);          // 开始绘图          this.drawLine(ctx, width, height, this.data.data);        });    },  },  methods: {    drawLine(ctx, width, height, data) {      const Max = Math.max(...data);      const Min = Math.min(...data);      // 把 canvas 的宽度, 高度按一定规则平分      const startX = width / (data.length * 2), // 起始点的横坐标 X        baseY = height * 0.9, // 基线纵坐标 Y        diffX = width / data.length,        diffY = (height * 0.7) / (Max - Min); // 高度预留 0.2 写温度      ctx.beginPath();      ctx.textAlign = 'center';      ctx.font = '13px Microsoft YaHei';      ctx.lineWidth = 2;      ctx.strokeStyle = '#ABDCFF';      // 画折线图的线      data.forEach((item, index) => {        const x = startX + diffX * index,          y = baseY - (item - Min) * diffY;        ctx.fillText(`${item}°`, x, y - 10);        ctx.lineTo(x, y);      });      ctx.stroke();      // 画折线图背景      ctx.lineTo(startX + (data.length - 1) * diffX, baseY); // 基线终点      ctx.lineTo(startX, baseY); // 基线起点      const lingrad = ctx.createLinearGradient(0, 0, 0, height * 0.7);      lingrad.addColorStop(0, 'rgba(255,255,255,0.9)');      lingrad.addColorStop(1, 'rgba(171,220,255,0)');      ctx.fillStyle = lingrad;      ctx.fill();      // 画折线图上的小圆点      ctx.beginPath();      data.forEach((item, index) => {        const x = startX + diffX * index,          y = baseY - (item - Min) * diffY;        ctx.moveTo(x, y);        ctx.arc(x, y, 3, 0, 2 * Math.PI);      });      ctx.fillStyle = '#0396FF';      ctx.fill();    },  },});

data 就是温度数组,如 [1, 2, ...]

因为不知道温度数值有多少个,因此这里的 width 动态传入

有个小问题,就是宽度过大的话真机不会显示...

 // 获取 scroll-view 的总宽度 wx.createSelectorQuery()      .select('.hourly')      .boundingClientRect(rect => {        this.setData({          scrollWidth: rect.right - rect.left,        });      })      .exec();
<view class="title">小时概述</view><scroll-view scroll-x scroll-y class="scroll" show-scrollbar="{{false}}" enhanced="{{true}}">    <view class="hourly">      <view wx:for="{{time}}" wx:key="index">{{item}}</view>    </view>    <line-chart line-class="line" width="{{scrollWidth}}" height="100" data="{{temp}}" /></scroll-view>

这里写 scroll-x 和 scroll-y,要不会出现绝对定位偏移的问题,也不知道为什么

在微信小程序中如何使用canvas绘制天气折线图

.scroll {  position: relative;  height: 150px;  width: 100%;}.hourly {  display: flex;  height: 150px;  position: absolute;  top: 0;}.hourly > view {  min-width: 3.5em;  text-align: center;}.line { // 折线图绝对定位到底部  position: absolute;  bottom: 0;}

这里使用绝对定位其实是想模拟墨迹天气这种折线图和每一天在一个块内的效果,所以 hourly 要和 scroll-view 等高,canvas 需要定位一下

主要是不知道墨迹天气怎么实现的,只能暂时这样

在微信小程序中如何使用canvas绘制天气折线图

三阶贝塞尔曲线

效果图

在微信小程序中如何使用canvas绘制天气折线图

emmm,好像并不怎么圆滑

计算控制点

首先写一个点类

class Point {  constructor(x, y) {    this.x = x;    this.y = y;  }}

在微信小程序中如何使用canvas绘制天气折线图

也就是使用 bezierCurveTo 的时候最后一个点是下一个点,前两个是控制点

浓缩一下就是

在微信小程序中如何使用canvas绘制天气折线图

这里的 a 和 b 可以是任意正数

因此定义一个计算某点的控制点 A 和 B 的方法

calcBezierControlPoints(  previousPoint,  currentPoint,  nextPoint1,  nextPoint2,  scale = 0.25) {  let x = currentPoint.x + scale * (nextPoint1.x - previousPoint.x);  let y = currentPoint.y + scale * (nextPoint1.y - previousPoint.y);  const controlPointA = new Point(x, y); // 控制点 A  x = nextPoint1.x - scale * (nextPoint2.x - currentPoint.x);  y = nextPoint1.y - scale * (nextPoint2.y - currentPoint.y);  const controlPointB = new Point(x, y); // 控制点 B  return { controlPointA, controlPointB };}

这里 scale 就是 a 和 b,不过将它们的取值相等

但是第一个点没有 previousPoint,倒数第二个点没有 nextPoint2

因此当点是第一个的时候,使用 currentPoint 代替 previousPoint

当倒数第二个点的时候,使用 nextPoint1 代替 nextPoint2

在微信小程序中如何使用canvas绘制天气折线图

至于最后一个点,不需要做任何事,因为 bezierCurveTo 第三个参数就是下一个点,只需要提供坐标就能连起来,不需要计算控制点

因此绘制三阶贝塞尔曲线的方法:

drawBezierLine(ctx, data, options) {  const { startX, diffX, baseY, diffY, Min } = options;  ctx.beginPath();  // 先移动到第一个点  ctx.moveTo(startX, baseY - (data[0] - Min) * diffY);  data.forEach((e, i) => {    let curPoint, prePoint, nextPoint1, nextPoint2, x, y;    // 当前点    x = startX + diffX * i;    y = baseY - (e - Min) * diffY;    curPoint = new Point(x, y);    // 前一个点    x = startX + diffX * (i - 1);    y = baseY - (data[i - 1] - Min) * diffY;    prePoint = new Point(x, y);    // 下一个点    x = startX + diffX * (i + 1);    y = baseY - (data[i + 1] - Min) * diffY;    nextPoint1 = new Point(x, y);    // 下下个点    x = startX + diffX * (i + 2);    y = baseY - (data[i + 2] - Min) * diffY;    nextPoint2 = new Point(x, y);    if (i === 0) {      // 如果是第一个点, 则前一个点用当前点代替      prePoint = curPoint;    } else if (i === data.length - 2) {      // 如果是倒数第二个点, 则下下个点用下一个点代替      nextPoint2 = nextPoint1;    } else if (i === data.length - 1) {      // 最后一个点直接退出      return;    }    const { controlPointA, controlPointB } = this.calcBezierControlPoints(      prePoint,      curPoint,      nextPoint1,      nextPoint2    );    ctx.bezierCurveTo(      controlPointA.x,      controlPointA.y,      controlPointB.x,      controlPointB.y,      nextPoint1.x,      nextPoint1.y    );  });  ctx.stroke();},

以上就是“在微信小程序中如何使用canvas绘制天气折线图”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在微信小程序中如何使用canvas绘制天气折线图

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

在微信小程序中如何使用canvas绘制天气折线图

今天小编给大家分享一下在微信小程序中如何使用canvas绘制天气折线图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。折线效果
2023-06-29

微信小程序开发中如何使用canvas绘制坐标图

这篇文章主要为大家展示了“微信小程序开发中如何使用canvas绘制坐标图”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序开发中如何使用canvas绘制坐标图”这篇文章吧。1、线图func
2023-06-26

微信小程序如何使用canvas绘制钟表

这篇文章给大家分享的是有关微信小程序如何使用canvas绘制钟表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。模拟时钟利用canvas绘制时钟,实现模拟时钟的功能,钟表时间与系统时间保持一致,刻度将24小时制转换
2023-06-15

微信小程序中怎么用Canvas绘制图形

在微信小程序中使用Canvas绘制图形需要以下步骤:在wxml文件中添加Canvas组件:在js文件中获取Canvas的上下文对象,并设置绘制参数:// 获取Can
微信小程序中怎么用Canvas绘制图形
2024-04-03

如何在微信小程序中使用echart

如何在微信小程序中使用echart?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先到ECharts官网下载我放的是tool文件夹下面,你们随意引入的时候注意路径就行2.使
2023-06-15

echart在微信小程序中如何使用

今天小编给大家分享一下echart在微信小程序中如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。echarts不显示在
2023-07-05

如何使用PHP实现微信小程序的绘图功能?

如何使用PHP实现微信小程序的绘图功能?随着小程序的普及,越来越多的开发者开始关注如何在微信小程序中实现绘图功能。PHP作为一种常用的服务器端脚本语言,可以与微信小程序结合,实现丰富的绘图功能。本文将具体介绍如何使用PHP实现微信小程序的绘
2023-10-27

在微信小程序中怎么使用canvas+Painter插件制作二维码

本篇内容介绍了“在微信小程序中怎么使用canvas+Painter插件制作二维码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、实现原理使
2023-06-25

如何在微信小程序中使用Echarts方法

如何在微信小程序中使用Echarts方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。xxx.json{ "usingComponents": { "ec-canvas":
2023-06-08

video组件如何在微信小程序中使用

video组件如何在微信小程序中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.app.json{ "pages":[ "pages/video/video"
2023-06-14

微信小程序中如何使用wx.getImageInfo()获取图片信息

本文将为大家详细介绍“微信小程序中如何使用wx.getImageInfo()获取图片信息”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“微信小程序中如何使用wx.getImageInfo()获取图片信息”能够给
2023-06-26

如何使用PHP开发微信小程序的在线课程功能?

如何使用PHP开发微信小程序的在线课程功能?随着移动互联网的快速发展,微信小程序正逐渐成为企业和个人开展业务的利器。在教育行业中,使用微信小程序开发在线课程功能已经成为了一个热门的需求。本文将介绍如何使用PHP来开发微信小程序的在线课程功能
2023-10-27

微信小程序开发中如何使用iconfont字体图标

本文小编为大家详细介绍“微信小程序开发中如何使用iconfont字体图标”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序开发中如何使用iconfont字体图标”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-06-26

如何使用PHP开发微信小程序的在线答题功能?

如何使用PHP开发微信小程序的在线答题功能?随着微信小程序的快速发展,越来越多的开发者开始关注如何在微信小程序中实现各种功能。其中,在线答题功能是一个非常常见且受欢迎的功能之一。本文将以PHP为基础,介绍如何使用PHP开发微信小程序的在线答
2023-10-27

如何使用PHP实现微信小程序的在线测评功能?

如何使用PHP实现微信小程序的在线测评功能?微信小程序已成为许多企业和开发者推广产品和服务的首选平台之一。其中,实现在线测评功能是小程序中常见的需求之一。本文将为大家介绍如何使用PHP编写后端代码,实现微信小程序中的在线测评功能,并提供具体
2023-10-27

如何使用PHP实现微信小程序的在线投票功能?

如何使用PHP实现微信小程序的在线投票功能?随着微信小程序的普及,越来越多的企业和个人选择在微信小程序中开展各类活动,其中包括在线投票功能。本文将介绍如何使用PHP语言来实现微信小程序的在线投票功能,并提供具体的代码示例。在开始之前,我们需
2023-10-27

如何使用PHP开发微信小程序的在线讨论功能?

如何使用PHP开发微信小程序的在线讨论功能?随着微信小程序的普及,越来越多的开发者开始关注如何在小程序中添加在线讨论功能。本文将介绍如何使用PHP开发微信小程序的在线讨论功能,并提供具体的代码示例。一、准备工作在开始之前,我们需要准备以下工
2023-10-26

如何使用PHP实现微信小程序的在线考试功能?

如何使用PHP实现微信小程序的在线考试功能?随着微信小程序的迅速发展,越来越多的开发者开始关注如何使用PHP来实现微信小程序的功能。其中,在线考试功能是很多教育培训机构或企业所关注的一个重点。本文将介绍如何使用PHP来实现微信小程序的在线考
2023-10-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录