广告
返回顶部
首页 > 资讯 > 精选 >在微信小程序中如何使用canvas绘制天气折线图
  • 853
分享到

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

2023-06-29 03:06:37 853人浏览 八月长安
摘要

今天小编给大家分享一下在微信小程序中如何使用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绘制天气折线图”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: 在微信小程序中如何使用canvas绘制天气折线图

本文链接: https://www.lsjlt.com/news/322390.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 在微信小程序中如何使用canvas绘制天气折线图
    今天小编给大家分享一下在微信小程序中如何使用canvas绘制天气折线图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。折线效果...
    99+
    2023-06-29
  • 微信小程序开发中如何使用canvas绘制坐标图
    这篇文章主要为大家展示了“微信小程序开发中如何使用canvas绘制坐标图”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序开发中如何使用canvas绘制坐标图”这篇文章吧。线图functi...
    99+
    2023-06-26
  • 微信小程序如何使用canvas绘制钟表
    这篇文章给大家分享的是有关微信小程序如何使用canvas绘制钟表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。模拟时钟利用canvas绘制时钟,实现模拟时钟的功能,钟表时间与系统时间保持一致,刻度将24小时制转换...
    99+
    2023-06-15
  • 微信小程序中如何使用canvas制作K线
    这篇文章主要介绍了微信小程序中如何使用canvas制作K线,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言:我们目的是想要一条平滑的曲线来...
    99+
    2022-10-19
  • 如何使用PHP实现微信小程序的绘图功能?
    如何使用PHP实现微信小程序的绘图功能?随着小程序的普及,越来越多的开发者开始关注如何在微信小程序中实现绘图功能。PHP作为一种常用的服务器端脚本语言,可以与微信小程序结合,实现丰富的绘图功能。本文将具体介绍如何使用PHP实现微信小程序的绘...
    99+
    2023-10-27
    绘图 PHP 微信小程序
  • 在微信小程序中怎么使用canvas+Painter插件制作二维码
    本篇内容介绍了“在微信小程序中怎么使用canvas+Painter插件制作二维码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、实现原理使...
    99+
    2023-06-25
  • echart在微信小程序中如何使用
    今天小编给大家分享一下echart在微信小程序中如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。echarts不显示在...
    99+
    2023-07-05
  • 如何在微信小程序中使用echart
    如何在微信小程序中使用echart?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先到ECharts官网下载我放的是tool文件夹下面,你们随意引入的时候注意路径就行2.使...
    99+
    2023-06-15
  • 微信小程序中如何使用wx.getImageInfo()获取图片信息
    本文将为大家详细介绍“微信小程序中如何使用wx.getImageInfo()获取图片信息”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“微信小程序中如何使用wx.getImageInfo()获取图片信息”能够给...
    99+
    2023-06-26
  • 如何在微信小程序中使用Echarts方法
    如何在微信小程序中使用Echarts方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。xxx.json{ "usingComponents":...
    99+
    2023-06-08
  • video组件如何在微信小程序中使用
    video组件如何在微信小程序中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.app.json{  "pages":[&nb...
    99+
    2023-06-14
  • 如何使用PHP开发微信小程序的在线课程功能?
    如何使用PHP开发微信小程序的在线课程功能?随着移动互联网的快速发展,微信小程序正逐渐成为企业和个人开展业务的利器。在教育行业中,使用微信小程序开发在线课程功能已经成为了一个热门的需求。本文将介绍如何使用PHP来开发微信小程序的在线课程功能...
    99+
    2023-10-27
    PHP 微信小程序 在线课程
  • wx-charts中如何使用微信小程序图表插件
    小编给大家分享一下wx-charts中如何使用微信小程序图表插件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!微信小程序图表插件...
    99+
    2022-10-19
  • 如何使用PHP开发微信小程序的在线答题功能?
    如何使用PHP开发微信小程序的在线答题功能?随着微信小程序的快速发展,越来越多的开发者开始关注如何在微信小程序中实现各种功能。其中,在线答题功能是一个非常常见且受欢迎的功能之一。本文将以PHP为基础,介绍如何使用PHP开发微信小程序的在线答...
    99+
    2023-10-27
    PHP 微信小程序 在线答题功能
  • 如何使用PHP开发微信小程序的在线讨论功能?
    如何使用PHP开发微信小程序的在线讨论功能?随着微信小程序的普及,越来越多的开发者开始关注如何在小程序中添加在线讨论功能。本文将介绍如何使用PHP开发微信小程序的在线讨论功能,并提供具体的代码示例。一、准备工作在开始之前,我们需要准备以下工...
    99+
    2023-10-26
    PHP 微信小程序 在线讨论
  • 如何使用PHP开发微信小程序的在线教育功能?
    如何使用PHP开发微信小程序的在线教育功能?随着移动互联网的发展,微信小程序越来越受欢迎。作为一种轻量级的应用程序,微信小程序在市场上具有广阔的发展前景。尤其是随着在线教育的兴起,越来越多的人开始通过微信小程序来实现在线学习。那么,在这个快...
    99+
    2023-10-27
    PHP 微信小程序 在线教育功能
  • 如何使用PHP实现微信小程序的在线投票功能?
    如何使用PHP实现微信小程序的在线投票功能?随着微信小程序的普及,越来越多的企业和个人选择在微信小程序中开展各类活动,其中包括在线投票功能。本文将介绍如何使用PHP语言来实现微信小程序的在线投票功能,并提供具体的代码示例。在开始之前,我们需...
    99+
    2023-10-27
    PHP在线投票功能实现
  • 如何使用PHP实现微信小程序的在线考试功能?
    如何使用PHP实现微信小程序的在线考试功能?随着微信小程序的迅速发展,越来越多的开发者开始关注如何使用PHP来实现微信小程序的功能。其中,在线考试功能是很多教育培训机构或企业所关注的一个重点。本文将介绍如何使用PHP来实现微信小程序的在线考...
    99+
    2023-10-26
    PHP实现在线考试 - PHP在线考试
  • 如何使用PHP实现微信小程序的在线测评功能?
    如何使用PHP实现微信小程序的在线测评功能?微信小程序已成为许多企业和开发者推广产品和服务的首选平台之一。其中,实现在线测评功能是小程序中常见的需求之一。本文将为大家介绍如何使用PHP编写后端代码,实现微信小程序中的在线测评功能,并提供具体...
    99+
    2023-10-27
    PHP 微信小程序 在线测评功能
  • 如何使用PHP开发微信小程序的在线问卷功能?
    如何使用PHP开发微信小程序的在线问卷功能?微信小程序是一种非常流行的移动应用程序,许多企业和个人都使用它来开发自己的应用。其中一个常用的功能就是在线问卷。在本文中,我将详细介绍如何使用PHP开发微信小程序的在线问卷功能,并提供一些具体的代...
    99+
    2023-10-27
    快速 可用于开发Web应用程序。 具有轻便
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作