H5 canvas基础入门到捕鱼达人小游戏实现(2)-矩形,柱状图,饼图绘制

学习canvas是一个不长不短的过程,但是需要大量的实践,才能深入学习到canvas的精髓,所以看标题应该就知道canvas是一个系列文章,上一篇文章主要讲解了,canvas的如何画直线等一些基础的内容,那么这边文章,我们主要来学习下以下几点:

基础:
- 矩形
- 圆弧
- 柱状图
- 饼图

画矩形

var canvas= document.getElementById('canvas');
var context= canvas.getContext('2d');
context.beginPath();
context.strokeStyle='red';
context.fillStyle = 'blue';
context.lineWidth = 10;
context.strokeRect(100,100,300,300);
context.fillRect(200,200,300,200);

看看画出的效果:
这里写图片描述

canvas api

context.strokeRect(x,y,w,h);
context.fillRect(x,y,w,h);
x:画布x
y:画布y
w:矩形宽
h:矩形高

其实会绘制矩形的话,那么绘制柱状图也就是水到渠成的事情了,我们先把画弧的基础api讲解完,在一并来绘制动态的柱状图和饼图

先来看看api

弧形api

context.arc(x,y,radius,starAngle,endAngle,anticlockwise);
x:圆心的x坐标
y:圆心的y坐标
radius:半径
straAngle:开始角度(弧度计算)
endAngle:结束角度(弧度计算)
anticlockwise:(true)为逆时针,(false)为顺时针

看一个图片帮助理解
这里写图片描述

画一个简单的弧形

var canvas= document.getElementById('canvas');
var context= canvas.getContext('2d');
context.arc(300,200,100,0,90*(Math.PI/180),true);//Math.PI/180*deg 是角度转弧度的公式
context.stroke();

画出的样子
这里写图片描述

好了,矩形和圆弧的基础api已经讲完了,那么现在我们先来看看饼状图是如何实现的。

var oC = document.getElementById('c1');
    var gd = oC.getContext('2d');

    var cx = oC.width/2;//设置饼图的x坐标为画布的宽度一半的位置
    var cy = oC.height/2;//设置饼图的y坐标为画布的宽度一半的位置
    var r = 100;//半径为100

    var arr = [50,32,66,87,91,26,100,40,50];//饼图的每个块的数据
    var color = ["#eee","red","blue","#egegeg","#eee","red","blue","#egegeg","black"];//每个块的颜色
    var iSum = 0;//声明变量,会的是计算出所有值的总和
    for(var i=0;i<arr.length;i++){
        iSum+=arr[i];
    }
    var aD = [];
    for(var i=0;i<arr.length;i++){
        //计算出每个值占总值的比例*360deg = 饼图比例
        aD.push(arr[i]/iSum*360);
    }
    var d = 0;
    function drawCake(){
        //画图之前,先清除下画布
        gd.clearRect(0,0,oC.width,oC.height);
        for(var i=0;i<aD.length;i++){
            gd.beginPath();//开始绘图
            gd.moveTo(cx,cy);//起始点
            gd.arc(cx,cy,r,d2a(d-90),d2a(aD[i]+d-90),false);//画圆弧
            gd.closePath();//结束路径
            gd.fillStyle = color[i];//设置每个块的颜色
            gd.fill();//填充绘制
            gd.stroke();//描边绘制
            d = d + aD[i];//关键点:初始角度每次循环都增加至上次的结束角度
        }
    }
    drawCake();

先看看图片效果:
这里写图片描述

一个简单的饼图就绘制出来了,如果有什么不懂的可以看看代码注释。

再来看看柱状图的代码:

var oC = document.getElementById('c1');
    var gd = oC.getContext('2d');

    var arr = [40,70,10,80,23,60];//柱状图数据(每根柱子的数据)

    var iMax = Math.max.apply(null,arr);//找出最大值

    var aHeight = [];
    for(var i=0;i<arr.length;i++){
        //计算出每根柱子的高度比例 ( 柱子高/最大柱子高 )*画布的高度    
        aHeight.push(arr[i]/iMax*oC.height);
    }
    //柱子宽度=画布的宽度/柱子的数量*3-2 (这只是计算的公式,也可以根据实际需求自行设计)
    var w = oC.width/(arr.length*3-2);
    var space = 2*w;//柱子之间的间距
    var member = 1;//运动的初始值
    var number = 100;//运动的峰值
    function drawBarAnimate(){
        //动态不断调用,需要先清空画布再渲染画布,达到动态效果
        gd.clearRect(0,0,oC.width, oC.height);
        for(var i=0;i<aHeight.length;i++){
            //柱子的高度*(运动比例)
            var h = aHeight[i]*(member/number);
            var y = oC.height - h;//y轴的位置(画布高度-柱子的高度)
            var x = i*w+i*space; //x轴的位置
            gd.beginPath();
            gd.fillStyle = "blue";
            gd.fillRect( x, y, w, h );
        }
        member++;
        if(member<number){
            requestAnimationFrame(drawBarAnimate);//这个如果不太清楚可以自行百度下
        }else{
            //运动结束回调
            console.log("运动结束");
        }
    }
    drawBarAnimate();

看下图片效果
这里写图片描述

图片颜色什么的都特别丑,这里只是实现了柱形图一部分的核心功能,当然也可以自行修改下。

好了本节内容基础结束了,总结下。
我们学习,如何绘制矩形,圆弧,已经两个简单的应用:饼图和柱状图。通过练习,相信已经对canvas能有一个基础的了解了,但是这离我们写扑鱼效果还有一段距离。不要紧慢慢来,下节继续。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值