python Canvas,Canvas教程

  python Canvas,Canvas教程

  Canvas是HTML5的新组件。它就像一个幕布,你可以在上面绘制各种图表、动画等。用JavaScript。

  在没有画布的时代,绘图只能借助Flash插件来实现,页面要和JavaScript、Flash交互。有了Canvas,我们就不再需要Flash了,可以直接用JavaScript来完成绘制。

  画布定义了一个指定大小的矩形框,我们可以在其中随意绘制:

  由于浏览器对HTML5标准的支持并不一致,通常会在内部添加一些解释性的HTML代码。如果浏览器支持Canvas,它会忽略内部HTML。如果浏览器不支持Canvas,它将显示内部HTML:

  现价:25.51英镑

  在使用Canvas之前,使用Canvas.getContext测试浏览器是否支持Canvas:

  您的浏览器不支持画布。

  您的浏览器不支持画布。

  使用严格的;

  -

  var canvas=document . getelementbyid( test-canvas );

  if (canvas.getContext) {

  Console.log(您的浏览器支持Canvas!);

  }否则{

  Console.log(您的浏览器不支持画布!);

  }

  getContext(2d )方法让我们获得一个CanvasRenderingContext2D对象,所有的绘制操作都需要通过它来完成。

  var CTX=canvas . get context( 2d );

  如果需要画3D怎么办?5 HTML5还有一个WebGL规范,允许在画布上绘制3D图形:

  GL=canvas . get context( web GL );

  在这一节中,我们只着重画2D图形。

  绘制形状

  我们可以在画布上画出各种形状。在画图之前,我们需要知道画布的坐标系:

  Canvas的坐标以左上角为原点,水平右轴为X轴,垂直下轴为Y轴,像素为单位,所以每个点都是非负整数。

  CanvasRenderingContext2D对象有几种绘制图形的方法:

  使用严格的;

  定义变量

  canvas=document.getElementById(测试-形状-画布),

  CTX=canvas . get context( 2d );

  -

  ctx.clearRect(0,0,200,200);//在(0,0)位置擦除大小为200x200的矩形。擦除意味着使该区域透明。

  ctx.fillStyle= # dddddd//设置颜色

  ctx.fillRect(10,10,130,130);//用130x130的(10,10)位置大小对矩形进行着色。

  //用Path绘制复杂路径:

  var path=new path 2d();

  path.arc(75,75,50,0,数学。PI*2,真);

  path.moveTo(110,75);

  path.arc(75,75,35,0,数学。圆周率,假);

  path.moveTo(65,65);

  path.arc(60,65,5,0,数学。PI*2,真);

  path.moveTo(95,65);

  path.arc(90,65,5,0,数学。PI*2,真);

  CTX . stroke style= # 0000 ff ;

  ctx.stroke(路径);

  绘制jjdzc

  画jjdzc就是在指定位置输出jjdzc。可以设置字体、样式、阴影等。jjdzc的,和CSS完全一致:

  使用严格的;

  定义变量

  canvas=document . getelementbyid( test-text-canvas ),

  CTX=canvas . get context( 2d );

  -

  ctx.clearRect(0,0,canvas.width,canvas . height);

  CTX . shadowoffsetx=2;

  CTX . shadowoffsety=2;

  CTX . shadow blur=2;

  ctx.shadowColor= # 666666

  ctx.font= 24px Arial

  ctx.fillStyle= # 333333

  Ctx.fillText(阴影文本,20,40);

  Canvas不仅可以绘制基本的形状和jjdzc,还可以实现动画、缩放、各种滤镜、像素转换等高级操作。如果你想实现一个非常复杂的操作,考虑下面的优化方案:

  通过创建一个不可见的画布进行绘制,然后将最终的绘制结果复制到页面的可见画布上;

  尽量用整数坐标代替浮点数;

  你可以创建多个重叠的画布来绘制不同的图层,而不是在一个画布上绘制非常复杂的图表;

  如果背景不变,可以直接标注,放在最下面。

  练习

  请根据163得到的JSON数据画出最近30个交易日的k线图。数据已被处理成包含一组对象的数组:

  window . draw stock=function(data){

  定义变量

  canvas=document . getelementbyid( stock-canvas ),

  MAX_X=canvas.width,

  MAX_Y=canvas.height,

  CTX=canvas . get context( 2d );

  var low=data . reduce(function(prev,x) {

  return x.low prev.low?x:prev;

  });

  var high=data . reduce(function(prev,x) {

  return x.high prev.high?x:prev;

  });

  var chg=high . high-low . low;

  //索引范围:

  var最低=数学。地板(低。低-chg * 0.1);

  定义变量最高=数学。楼层(高。高chg * 0.1 1);

  var calcY=function (idx) {

  return MAX_Y *(最高- idx) /(最高-最低);

  };

  var drawAtX=function (x,k) {

  定义变量

  tmp,

  y1=calcY(k.open),

  y2=calcY(k . close);

  if (y1 y2) {

  tmp=y1

  y1=y2

  y2=tmp

  }

  ctx.fillStyle=(k.open k.close)?# 00ff 00 : # ff 0000 ;

  ctx.fillRect(x,calcY(k.high),1,calcY(k . low)-calcY(k . high));

  ctx.fillRect(x-2,y1,5,y2-y1);

  };

  ctx.clearRect(0,0,MAX_X,MAX _ Y);

  ctx.font= 12px serif

  ctx.textAlign= right

  ctx.fillStyle= # 000000

  CTX。填充文本(字符串(数学。楼层(高。高))、40、15);

  CTX。填充文本(字符串(数学。地板(低。低))、40、MAX _ Y-20);

  var i,x;

  for(I=0;我

  x=i * 8 50

  drawAtX(x,data[I]);

  }

  };

  使用严格的;

  窗户。loadstockdata=function(r){

  定义变量

  NUMS=30,

  数据=r.data

  如果(数据长度NUMS) {

  数据=数据。切片(数据。长度——NUMS);

  }

  data=data.map(函数(十){

  返回{

  日期:x[0],

  打开:x[1],

  close: x[2],

  高:x[3],

  低:x[4],

  vol: x[5],

  变化:x[6]

  };

  });

  window.drawStock(数据);

  }

  窗户。提取库存=函数(数据){

  -

  定义变量

  画布=文档。getelementbyid( stock-canvas )。

  width=canvas.width,

  高度=画布高度

  CTX=画布。获取上下文(“2d”);

  控制台。log(JSON。stringify(data[0]);//{ 日期: 20150602 ,开:4844.7,关:4910.53,高:4911.57,低:4797.55,卷:62374809900,变:1.69}

  ctx.clearRect(0,0,宽度,高度);

  ctx.fillText(测试画布,10,10);

  -

  };

  //加载最近30个交易日的K线图数据:

  var js=文档。createelement( script );

  js。src= http://img 1。钱。126 .net/data/hs/Kline/day/history/2015/000001。JSON?callback=loadStockDatat= date。now();

  文档。getelementsbytagname( head )[0].appendChild(js);

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: