• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 手把手教你在微信小程序中使用canvas绘制天气折线图(附代码)

手把手教你在微信小程序中使用canvas绘制天气折线图(附代码)

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了微信小程序开发,小程序canvas绘制,canvas天气折线图等相关知识,希望对您有所帮助

微信小程序中如何绘制天气折线图?下面本篇文章就来给大家介绍一下在微信小程序中使用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
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 手把手教你在微信小程序中使用canvas绘制天气折线图(附代码)
  • 浅析微信小程序中自定义组件的方法

相关文章

  • Laravel中三种中间件的作用
  • 可以同时删除字符串前导和尾部空白的函数是什么
  • 利用图层样式及素材制作漂亮的火焰字
  • 修改phpMyAdmin导入数据库文件大小限制的解决方法
  • ThinkPHP5框架实现多数据库连接
  • PHP中mysql和mysqli的区别是什么
  • 如何解决strict standards php报错问题
  • dedecms栏目30个关键字限制解决方法
  • 怎么通过CakePHP内置模块发送邮件(Gmail)
  • 利用CSS如何实现全兼容的毛玻璃效果?

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • Day.js :一个非常好用的轻量的处理时间和日期库
    • Photoshop绘制金属质感的指南针
    • 利用纹理素材及图层样式制作个性的金色纹理字
    • uniapp怎么实现小程序页面的自由拖拽功能
    • javascript怎么判断是否为null
    • Illustrator结合PS制作质感的3D标志教程
    • Thinkphp5.1 + layui时间范围设置方法
    • 一起聊聊MySQL中blob和text数据类型(示例详解)
    • PhotoShop设计制作梦幻炫彩光斑文字效果教程
    • PHP怎么去掉富文本样式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有