LayaAir的graphics矢量绘图API概述
LayaAir可以通过laya.display.Graphic类绘制各种矢量图形,关于Graphics绘图的相关方法如下:
(图1)laya.display.Graphic的方法
绘制直线与折线
一、绘制直线
在API中搜索laya.display.Graphics类可以查看到该API的各种矢量绘图方法。其中drawLine();用于绘制矢量直线。该方法的详细说明如下图所示:
(图2)
下面我们用LayaAir引擎画一条直线,示例代码如下:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- import WebGL = Laya.WebGL;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- Laya.init(500, 300, WebGL);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //画直线
- this.sp.graphics.drawLine(10, 58, 146, 58, "#ff0000", 3);
- }
- }
- }
- new laya.Sprite_DrawShapes();
发布后如下图所示,我们画了一条红色的直线
(图3)
二、绘制折线
那么如何绘制折线呢?直接使用drawLines();方法即可。该方法与drawLine比较像,编码时千万不要漏掉了末尾的“s”。drawLines的参数详细说明如下图所示:
(图4)
下面我们用LayaAir引擎画一条折线,示例代码如下:
代码运行
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- import WebGL = Laya.WebGL;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- Laya.init(500, 300, WebGL);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //画折线
- this.sp.graphics.drawLines(20, 88, [0, 0, 39, -50, 78, 0, 120, -50], "#ff0000", 3);
- }
- }
- }
- new laya.Sprite_DrawShapes();
效果:
通过代码,我们可以看出,画折线与画直线的参数区别是从第三位开始,第三位参数是Array类型的折线点集合,其中的“0,0”是折点A的起始坐标。“39,-50”是折点B的起始坐标。“78, 0”是折点C的起始坐标,“120, -50”是终点D的坐标。但是这里需要大家理解和注意的是,第三位参数中所有的坐标都是相对坐标,都会受到第一位和第二位参数的“20,88”而影响。一旦“20,88”产生改变,整体折线都会受到影响。
大家可以在实际编码的过程中,通过手动调整参数去感受区别。
三、用LayaAirIDE拖动控件绘制直线
步骤一:打开我们的LayaAirIDE,点击设计模式,新建一个View页面
(图5)
步骤二:将组件中的曲线组件拖动到View页面上,就会自动生成默认的直线
(图6)
步骤三:修改(添加/减少)Line组件属性中的数值,改变直线的长度、宽度、颜色等等。
(图7)
(图8)
四、用LayaAirIDE拖动控件绘制折线
步骤一:打开我们的LayaAirIDE,点击设计模式,新建一个View页面
(图9)
步骤二:将组件中的曲线组件拖动到View页面上,就会自动生成默认的折线
(图10)
步骤三:修改(添加/减少)Lines组件属性中的数值,改变折线的角度、颜色、宽度,或者添加新的折现。
(图11)
(图12)
到此我们通过LayaAirIDE的组件绘制直线和折线就完成了。
绘制曲线
相对于直线而言,曲线的绘制与坐标关系更难理解一些。由于LayaAir引擎绘制的是贝塞尔曲线,所以本文中先针对贝塞尔曲线的基础进行说明,然后再结合引擎的API进行讲解。
一、贝塞尔曲线的基础
贝塞尔曲线在港澳台等地称为貝茲曲線,新加坡马来西亚等地称为贝济埃曲线。一般的矢量图形软件通过它来精确画出曲线,贝塞尔曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。
贝塞尔曲线是应用于二维图形应用程序的数学曲线。曲线的定义有四个点:起始点、终止点(也称锚点)以及两个相互分离的中间点。滑动两个中间点,贝塞尔曲线的形状会发生变化。
基于线性、二次方、三次方等公式的不同,贝塞尔曲线也被称为一次、二次……五次贝塞尔曲线,有些文章也称为一阶、二阶……说的是一回事。下面通过动图让大家直观的理解一下:
1.1 一次贝塞尔曲线
(图1)
说明:上图是由 P0 至 P1 的连续点, 描述的是一条线性的贝赛尔曲线。线性贝塞尔曲线函数中的 t 会经过由 P0 至 P1 的 B(t) 所描述的曲线。例如当 t=0.25 时,B(t) 即一条由点 P0 至 P1 路径的四分之一处。就像由 0 至 1 的连续 t,B(t) 描述一条由 P0 至 P1 的直线。
1.2 二次贝塞尔曲线
(图2)
(图3)
说明:为建构二次贝塞尔曲线,上图由 P0 至 P1 的连续点 Q0,描述一条线性贝塞尔曲线。由 P1 至 P2 的连续点 Q1,描述一条线性贝塞尔曲线。由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。
1.3 三次贝塞尔曲线
(图4)
(图5)
说明:对于三次曲线,可由线性贝塞尔曲线描述的中介点 Q0、Q1、Q2,和由二次曲线描述的点 R0、R1 所建构。
1.4 高阶贝塞尔曲线
由于高阶贝塞尔曲线并不常见,本文将不再详细说明,想对贝塞尔曲线原理了解更多的可以查看其它相关文章。
(图6) 四次贝塞尔曲线
(图7) 五次贝塞尔曲线
二、用LayaAir引擎API绘制二次贝塞尔曲线
LayaAir引擎的曲线绘制采用的是二次贝塞尔曲线,开发者可以在API文档中搜索laya.display.Graphics类可以查看到“drawCurves();”曲线绘制方法。该方法的详细说明如下图所示:
(图8)
下面我们用LayaAir引擎绘制矢量曲线,示例代码如下:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- import WebGL = Laya.WebGL;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- Laya.init(500, 300, WebGL);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //画折线
- this.sp.graphics.drawCurves(10, 58, [0, 0, 19, -100, 39, 0], "#ff0000", 3);
- }
- }
- }
- new laya.Sprite_DrawShapes();
发布后如下图所示,我们成功的绘制了一条简单的曲线。
(图9)
通过增加drawCurves的第三位points点集合的参数,我们可以让曲线更复杂一些,修改的示例代码如下:
- //增加58, 100与78, 0坐标让曲线更复杂一些
- this.sp.graphics.drawCurves(10, 58, [0, 0, 19, -100, 39, 0, 58, 100, 78, 0], "#ff0000", 3) ;
发布后如下图所示,
(图10)
如果想绘制更复杂的曲线,可自行调整drawCurves中的参数,再结合二次贝赛尔曲线原理进行理解。
最后提醒一下,与绘制折线一样,第三位参数中所有的坐标都是相对坐标,都会受到第一位和第二位参数的“10,58”而影响。一旦“10,58”产生改变,整体曲线都会受到影响。
三、用LayaAirIDE拖动控件绘制二次贝塞尔曲线
步骤一:打开我们的LayaAirIDE,点击设计模式,新建一个View页面
(图11)
步骤二:将组件中的曲线组件拖动到View页面上,就会自动生成默认的曲线
(图12)
步骤三:修改(添加/减少)组件属性中的point的数值,改变曲线的位置或弯曲程度
(图13)
(图14)
到此我们通过LayaAirIDE的组件绘制曲线就完成了
绘制三角形、多边形及根据数据绘制图案
在绘制三角形、多边形以及根据指定的路径数据绘制出图案均可使用LayaAir引擎中laya.display.Graphics类的“drawpoly();”方法实现。该方法的详细说明如下图所示:
(图1)
一、绘制三角形
下面我们用LayaAir引擎先绘制一个三角形,示例代码如下:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- Laya.init(500, 300);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //画三角形
- this.sp.graphics.drawPoly(30, 28, [0, 100, 50, 0, 100, 100], "#ffff00");
- }
- }
- }
- new laya.Sprite_DrawShapes();
代码运行效果如下图所示:
(图2)
通过代码,我们可以看出,drawPoly第三位参数的“0,100”是A点坐标。“50,0”是B点坐标。“100, 100”是C点坐标,将三个坐标点连接后填充第四位参数的颜色值,即绘制出上图的黄色三角形。但是这里需要大家理解和注意的是,第三位参数中所有的坐标都是相对坐标,都会受到第一位和第二位坐标参数“30,28”的影响。一旦“30,28”产生改变,整体形状位置都会受到影响。
二、绘制多边形
我们继续用上面的代码示例,通过增加drawPoly第三位参数的坐标,来实现多边形的绘制,修改的代码如下:
- //画多边形
- this.sp.graphics.drawPoly(30, 28, [0, 100, 50, 0, 100, 100, 75, 150, 25, 150], "#ffff00");
代码运行效果如下图所示:
(图3)
在修改的代码中,新增了D点坐标”75,150“与E点坐标”25,150“。通过将各个坐标点连接填充颜色后,即绘制出我们想要的多边形。要绘制更多边的多边形,按上述方式增加坐标点即可。
三、根据指定的路径数据绘制出图案
通过上面的三角形和多边形,我们已经掌握了drawPoly的绘图用法,下面再通过示例深入介绍一下,如何指定路径绘制一个五角星。示例代码如下:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- Laya.init(500, 300);
- this.drawSomething();
- }
- private drawSomething(): void {
- var canvas: Sprite = new Sprite();
- Laya.stage.addChild(canvas);
- var path: Array<number> = [];
- path.push(0, -130);//五角星A点坐标
- path.push(33, -33);//五角星B点坐标
- path.push(137, -30);//五角星C点坐标
- path.push(55, 32);//五角星D点坐标
- path.push(85, 130);//五角星E点坐标
- path.push(0, 73);//五角星F点坐标
- path.push(-85, 130);//五角星G点坐标
- path.push(-55, 32);//五角星H点坐标
- path.push(-137, -30);//五角星I点坐标
- path.push(-33, -33);//五角星J点坐标
- canvas.graphics.drawPoly(Laya.stage.width / 2, Laya.stage.height / 2, path, "#FF7F50");
- }
- }
- }
- new laya.Sprite_DrawShapes();
代码运行效果如下图所示:
(图4)
通过上面的示例代码的写法,是不是感觉代码的可读性得到了增强,大家也可以将之前的三角形或多边形改成这种方式去体验一下,掌握了这些基础,可以衍生出很多灵活的用法,比如数据来自服务端等。
四、用LayaAirIDE通过控件绘制不规则图形(包括三角形,多边形)
步骤一:打开我们的LayaAirIDE,点击设计模式,新建一个View页面
(图5)
步骤二:将组件中的曲线组件拖动到View页面上,就会自动生成默认的多边形
(图6)
步骤三:修改(添加/减少)Poly组件属性中的数值,改变多边形的大小、颜色等等。
(图7)
(图8) 三角形
(图9) 不规则多边形
到此我们通过LayaAirIDE的组件绘制多边形就完成了。
绘制圆形与扇形
一、绘制圆形
圆形的绘制理解起来比较简单,通过圆形的中心点坐标与半径,即可方便的通过LayaAir引擎laya.display.Graphics这个API的“drawCircle();”方法实现。该方法的详细说明如下图所示:
(图1)
下面我们用LayaAir引擎绘制一个圆形,示例代码如下:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- import WebGL = Laya.WebGL;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- Laya.init(500, 300, WebGL);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //画圆
- this.sp.graphics.drawCircle(80,80,50,"#ff0000");
- }
- }
- }
- new laya.Sprite_DrawShapes();
代码运行效果如下图所示:
(图2)
圆形绘制比较简单,“80,80”是圆形中心点坐标。50是半径,”#ff0000”是圆形填充颜色值。
二、绘制扇形
下面继续延伸,介绍一下比圆形稍复杂一点的扇形绘制方法“drawPie();”该方法的详细说明如下图所示:
(图3)
下面我们用LayaAir引擎绘制一个扇形,示例代码如下:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- import WebGL = Laya.WebGL;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- Laya.init(500, 300, WebGL);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //画圆
- this.sp.graphics.drawPie(80,80,50,90,180,"#ff0000");
- }
- }
- }
- new laya.Sprite_DrawShapes();
代码运行效果如下图所示:
(图4)
绘制扇形与圆形类似,前三个参数的用法也是一样的,只是增加了绘制开始与结束的角度。为了让大家更好的理解,扇形的绘制代码与参数沿用圆形代码示例,除了方法名的改变,只增加了90与180两个角度参数。大家可在编码过程中通过调整参数,再深入理解。
三、通过LayaAirIDE拖动控件绘制圆形
步骤一:打开我们的LayaAirIDE,点击设计模式,新建一个View页面
(图5)
步骤二:将组件中的曲线组件拖动到View页面上,就会自动生成默认的圆形
(图6)
步骤三:修改(添加/减少)Circle组件属性中的数值,改变圆形的大小、颜色、外框等等。
(图7)
(图8)
四、通过LayaAirIDE拖动控件绘制扇形
步骤一:打开我们的LayaAirIDE,点击设计模式,新建一个View页面
(图9)
步骤二:将组件中的曲线组件拖动到View页面上,就会自动生成默认的扇形
(图10)
步骤三:修改(添加/减少)Pie组件属性中的数值,改变扇形的角度、大小、颜色等等。
(图11)
(图12)
到此我们通过LayaAirIDE的组件绘制圆形和扇形就完成了。
绘制矩形与圆角矩形
一、用drawRect方法绘制矩形
在API中搜索laya.display.Graphics类可以查看到该API的各种矢量绘图方法。其中”drawRect();”方法用于绘制矢量矩形。该方法的详细说明如下图所示:在API中搜索laya.display.Graphics类可以查看到该API的各种矢量绘图方法。其中”drawRect();”方法用于绘制矢量矩形。该方法的详细说明如下图所示:
(图1)
下面我们用LayaAir引擎绘制矢量矩形,示例代码如下:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- //初始化舞台
- Laya.init(500, 300);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //画矩形
- this.sp.graphics.drawRect(20, 20, 100, 50, "#ffff00");
- }
- }
- }
- new laya.Sprite_DrawShapes();
代码运行效果:
(图2)
示例中的“20,20”是矩形起始点坐标,100是向右的宽度,如果是负数则是向左的宽度。50是向下的高度,如果是负数则是向上的高度。大家可以在编写代码中,自行调整参数进行体验。
二、用drawPath绘制矩形
LayaAir引擎laya.display.Graphics类的绘制路径的方法”drawPath()”可以根据路径绘制矢量图形,当然也包括了矩形和圆角矩形,该方法的详细说明如下图所示:
(图3)
drawPath方法的参数相对复杂一些。为了方便大家理解,我们先用”drawPath()”绘制一个矩形,理解路径中的部分参数。
drawPath绘制矩形的示例代码如下:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- //初始化舞台
- Laya.init(500, 300);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //自定义路径
- var path:Array<any> = [
- ["moveTo", 0, 0], //画笔移到A点
- ["lineTo", 100, 0],//画到B点
- ["lineTo", 100, 50],//再画到C点
- ["lineTo", 0, 50], //继续画到D点
- ["closePath"] //闭合路径
- ];
- //绘制矩形
- this.sp.graphics.drawPath(20, 20, path, {fillStyle: "#ff0000"});
- }
- }
- }
- new laya.Sprite_DrawShapes();
代码运行效果:
(图4)
drawPath第一和第二位的坐标点“20,20”是控制整体位置的起始位置,第三位是路径参数。描述信息“MoveTo”是将画笔移动初始位置,此时并没有开始画。”0,0”是相对于”20,20”这个起始位置的,所以A点还是在起始位置原点。描述信息“lineto”是绘制到路径点坐标,“100,0”这个就是绘制到B点位置的坐标。C点和D点以此类推,最后通过描述信息“closePath”与MoveTo的起点位置闭合,否则是不会被闭合的。
从绘制矩形来看,drawPath方法肯定没有drawRect方法更加方便。但是大家可以通过这个示例理解相关的参数用法。至于其它非圆角的图形,大家可自行编码,通过调整参数体验。
三、用drawPath绘制圆角矩形
3.1 用法说明
LayaAir引擎中可以使用graphics的drwaPath方法绘制圆角或弧线,具体的操作需要三步,指定绘制路径的起始点["moveTo", x, y]、绘制一条水平直线["lineTo", x, y]、绘制弧线["arcTo", p1.x, p1.y, p2.x, p2.y, r]。
参数示例:
- ["moveTo", 50, 50],
- ["lineTo", 150, 50],
- ["arcTo", 200, 50, 200, 100, 50],
上述参数运行效果图如5-1所示:
(图5-1)
通过图5-1我们可以看出,["moveTo", 50, 50]将画笔的起始点定位于"50,50"这个位置。["lineTo", 150, 50]绘制了一条由于起始点到当前端点(”150, 50“)的直线。["arcTo", 200, 50, 200, 100, 50]绘制了一段r(半径)为50弧线。
弧线绘制原理:
在制作这段弧线时,这个弧其实是利用当前端点"150, 50"、端点1"200, 50"、端点2"200, 100",这三个端点所形成的夹角,制作一条半径为50px并且与两边相切的圆上的一段弧线。
如果我们已经理解了弧线的绘制原理,我们还会发现,构成弧线的核心要素为两条边和与两边形成夹角的顶点(上例中的端点1),图5-1中的端点2与端点1形成的x轴边比较好理解,那当前端点与端点1已经构成了y轴边,那与当前端点在同一个y轴的起始点是不是可以去掉呢,事实并不可以,画笔的起始点必须存在,但是绘制直线的lineTo可以去掉,如果["lineTo", 150, 50],被注释掉,那么arcTo绘制弧线的时候,会视起始点为当前端点,arcTo找不到lineTo绘制的直线时,会自动添加一条由起始点到弧线起点的直线,因此,绘制圆角矩形时,lineTo可以省略。
3.2 绘制圆角矩形示例
下面我们绘制一个圆角弧线半径为30的圆角矩形,示例代码如下:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- //初始化舞台
- Laya.init(1136, 640);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //自定义路径
- var path:any[] = [
- ["moveTo", 0, 0], //画笔的起始点,
- ["lineTo",400,0],
- ["arcTo", 500, 0, 500, 30, 30], //p1(500,0)为夹角B,(500,30)为端点p2
- ["lineTo",500,200],
- ["arcTo", 500, 300, 470, 300, 30],//p1(500,300)为夹角C,(470,300)为端点p2
- ["lineTo",30,300],
- ["arcTo", 0, 300, 0, 270, 30], //p1(0,300)为夹角D,(0,270)为端点p2
- ["lineTo",0,100],
- ["arcTo", 0, 0, 30, 0, 30],//p1(0,0)为夹角A,(30,0)为端点p2
- ];
- //绘制圆角矩形
- this.sp.graphics.drawPath(100, 100, path, {fillStyle: "#00ffff"});
- }
- }
- }
- new laya.Sprite_DrawShapes();
代码运行效果:
(图5-2)
在上面的代码里,看起来没有任何问题,其实moveTo的起始点,需要在圆弧之间的直线上,下面我们只需要在drawPath绘制时,增加一个边框线,就可以清楚的看出错误。绘制方法graphics.drawPath修改为:
- //绘制圆角矩形
- this.sp.graphics.drawPath(100, 100, path, {fillStyle: "#ff0000"},{"strokeStyle":"#ffffff","lineWidth":"10"});
修改后运行效果如图5-3所示,由于画线的时候,从画笔的起始点0,0开始的,所以并不是我们想要的结果。
(图5-3)
下面我们将示例修改为正确的代码:
- module laya {
- import Sprite = Laya.Sprite;
- import Stage = Laya.Stage;
- export class Sprite_DrawShapes {
- private sp: Sprite;
- constructor()
- {
- //初始化舞台
- Laya.init(1136, 640);
- this.drawSomething();
- }
- private drawSomething(): void {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //自定义路径
- var path:any[] = [
- ["moveTo", 30, 0], //画笔的起始点,
- ["lineTo",400,0],
- ["arcTo", 500, 0, 500, 30, 30], //p1(500,0)为夹角B,(500,30)为端点p2
- ["lineTo",500,200],
- ["arcTo", 500, 300, 470, 300, 30],//p1(500,300)为夹角C,(470,300)为端点p2
- ["lineTo",30,300],
- ["arcTo", 0, 300, 0, 270, 30], //p1(0,300)为夹角D,(0,270)为端点p2
- ["lineTo",0,100],
- ["arcTo", 0, 0, 30, 0, 30],//p1(0,0)为夹角A,(30,0)为端点p2
- ];
- //绘制圆角矩形
- this.sp.graphics.drawPath(100, 100, path, {fillStyle: "#ff0000"},{"strokeStyle":"#ffffff","lineWidth":"10"});
- }
- }
- }
- new laya.Sprite_DrawShapes();
运行效果如图5-4所示:
(图5-4)
四、用LayaAirIDE拖动控件绘制矩形
步骤一:打开我们的LayaAirIDE,点击设计模式,新建一个View页面
(图6)
步骤二:将组件中的曲线组件拖动到View页面上,就会自动生成默认的曲线
(图7)
步骤三:修改(添加/减少)Rect组件属性中的数值,改变矩形的大小、颜色、旋转角度等等。
(图8)
(图14)
到此我们通过LayaAirIDE中的组件来绘制矩形就完成了。
其他更多内容请前往laya 官网查看,这里的案例主要是在laya2.0的引擎上使用,至此我们的基础篇已经掌握足够多的内容了,快去尝试一下吧