天气温度折线图canvas完整案例

本文介绍了一种使用HTML5 Canvas和jQuery实现的天气温度折线图绘制方法。该图表展示了未来一周内每天的最高温和最低温变化趋势,并通过不同颜色区分高低温。通过计算每个温度点的位置并绘制连接线,最终呈现直观的温度走势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>天气温度折线图</title>
</head>
<body>
    <canvas style="border:1px solid #ccc;" id="canvas"></canvas>
   <script src="http://code.jquery.com/jquery-1.8.0.min.js"></script><!--引入一份jquery文件,可以自行引用-->
    <script>
        $(function(){
            //温度走势图start
            var forecast=new Array();
            forecast[0]=new Array();
            forecast[1]=new Array();
            forecast[2]=new Array();
            forecast[3]=new Array();
            forecast[4]=new Array();
            forecast[5]=new Array();
            forecast[6]=new Array();
            forecast[0]['high']=25;
            forecast[0]['low']=13;
            forecast[1]['high']=24;
            forecast[1]['low']=10;
            forecast[2]['high']=23;
            forecast[2]['low']=11;
            forecast[3]['high']=25;
            forecast[3]['low']=16;
            forecast[4]['high']=27;
            forecast[4]['low']=18;
            forecast[5]['high']=29;
            forecast[5]['low']=20;
            forecast[6]['high']=22;
            forecast[6]['low']=10;
            var maxTemp=forecast[0]['high'];
            var minTemp=forecast[0]['low'];
            
            var high_tep_arr=[];
            for(x=0;x<forecast.length;x++){
                var high_tep=forecast[x]['high'];
                if(high_tep>maxTemp){maxTemp=high_tep;}
                high_tep_arr.push(high_tep);
            }
            var low_tep_arr=[];
            for(x=0;x<forecast.length;x++){
                var low_tep=forecast[x]['low'];
                if(low_tep<minTemp){minTemp=low_tep;}
                low_tep_arr.push(low_tep);
            }
            var canvas=document.getElementById("canvas");
            var context=canvas.getContext("2d");
            canvas.style.width='832px';
            canvas.style.height='174px';
            canvas.width=832;
            canvas.height=174;
            var item_width = 120;
            var wencha=maxTemp-minTemp;
            var tem_pexi=(80/(maxTemp-minTemp));//计算每度对应的px。80是自己设定的,这里画布总高是174,所以我设定这几天最高温度和最低温度之间间距为80。
            context.translate(53,maxTemp*tem_pexi+40);//画布的偏移量,53是画布x轴从左向右方向偏移。后面的值是y轴(细说一下:web里面的坐标轴和我们数学知识上学习的坐标系,y轴是相反的。故这里画点为了让温度高的点显示在温度低的上面,我们要取反。取反以后这个点就跑到画布以外去了,所以我们要向正方向偏移出来。偏移的数值,我这里是选择了最高温度所占对应px加上每个点上要写文字的距离,从而计算出来)。
            //折线走势
            var new_high_x=[];
            var new_high_y=[];
            function draw_line(a,high_color_line){
                new_high_x=[];
                new_high_y=[];
                for(var j=0;j<a.length;j++){//a温度数组
                    //画点
                context.beginPath();
                var high_y=parseInt(Number(a[j])*tem_pexi);
                var high_x=j * item_width;
               context.arc(high_x,-high_y,3,0,2*Math.PI,true);
               context.strokeStyle=high_color_line;
               context.stroke();
               context.fillStyle=high_color_line;
               context.fill();
               context.closePath();
               //画线
               new_high_x.push(high_x);
               new_high_y.push(-high_y);
                //写文字
                if(a==high_tep_arr){
                context.beginPath();
                context.font = "18px 微软雅黑";  
                context.fillStyle = "#333";
                context.fillText(a[j]+"°",high_x-10,-high_y-20,50);  
                context.stroke();
                context.closePath();
                }else{
                context.beginPath();
                context.font = "18px 微软雅黑";  
                context.fillStyle = "#333";
                context.fillText(a[j]+"°",high_x-10,-high_y+30,50);  
                context.stroke();
                context.closePath();
                }
            }
                for(var z=0;z<14;z++){
                    if(z == 6){
                        continue;
                    }
                    context.beginPath();
                    context.moveTo(new_high_x[z],new_high_y[z]);
                    context.lineTo(new_high_x[z+1],new_high_y[z+1]);
                    context.strokeStyle=high_color_line;
                    context.lineWidth=3;
                    context.stroke();
                    context.closePath();

                  }
            }
            draw_line(high_tep_arr,'#fcc370');
            draw_line(low_tep_arr,'#94ccf9');
                //温度走势图end
        })
    </script>
</body>
</html>

### 如何在鸿蒙系统中开发与天气相关的应用程序并实现曲线图 #### 1. 鸿蒙系统的北向开发基础 鸿蒙系统的北向开发主要涉及应用层的构建,开发者可以利用其提供的API来创建各种类型的移动应用。对于天气类的应用程序开发而言,可以通过Canvas组件绘制动态图形,例如折线图用于展示气温变化趋势[^1]。 #### 2. 使用Canvas绘制折线图的具体方法 为了实现在天气应用中的数据可视化效果,比如温度随时间的变化情况,可以采用如下方式: - **初始化画布** 通过`@Entry`装饰器定义页面入口函数,在其中设置Canvas对象作为绘图区域的基础环境。 ```javascript import uiAbility from '@ohos.app.ability.ui'; export default class WeatherChart extends uiAbility { onWindowStageCreate(windowStage) { let canvasContext; windowStage.createMainWindow({ onReady() { const canvas = this.$element('myCanvas'); // 获取 Canvas 元素 canvasContext = canvas.getContext('2d'); drawLineGraph(canvasContext); } }); } } ``` - **绘制逻辑编写** 调用Canvas上下文的相关方法完成具体线条描绘工作,包括但不限于设定路径起点、终点以及样式属性等操作。 ```javascript function drawLineGraph(ctx){ ctx.beginPath(); // 开始新路径 ctx.moveTo(50, 200); // 移动到起始坐标 var points = [[70,180], [90,160], ...]; // 数据点集合 for(let i=0;i<points.length;i++){ ctx.lineTo(points[i][0], points[i][1]); // 连接各点形成连续线路 } ctx.strokeStyle="#FF5733"; // 设置描边颜色 ctx.lineWidth=2; // 定义宽度大小 ctx.stroke(); // 执行实际渲染动作 } ``` 上述代码片段展示了如何借助JavaScript语言配合HarmonyOS框架下的Canvas API达成基本折线图呈现目标。 #### 3. 结合实际案例分析 以一个具体的项目为例——即“鸿蒙开发实战案例--天气App”,它不仅实现了常规的功能模块如当前气象状况查询等功能外,还特别加入了针对未来几天预报信息的趋势展现部分。这部分正是运用到了前面提到过的Canvas技术手段去制作直观易懂的日间最高最低温对比图表[^2]。 另外值得注意的是,在设计界面布局的时候还可以考虑加入一些特色化的小插件或者附加服务项,像文中所描述的那种融合传统农历文化概念而来的“黄历卡片”。这种创新形式既满足了大众日常出行规划的需求同时也增添了趣味性实用性价值[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值