Android培训之Canvas绘图基础详解.docx
《Android培训之Canvas绘图基础详解.docx》由会员分享,可在线阅读,更多相关《Android培训之Canvas绘图基础详解.docx(31页珍藏版)》请在三一办公上搜索。
1、Android培训之Canvas绘图基础详解北京尚学堂提供 Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API。Android通过Canvas类暴露了很多drawXXX方法,我们可以通过这些方法绘制各种各样的图形。Canvas绘图有三个基本要素:Canvas、绘图坐标系以及Paint。Canvas是画布,我们通过Canvas的各种drawXXX方法将图形绘制到Canvas上面,在drawXXX方法中我们需要传入要绘制的图形的坐标形状,还要传入一个画笔Paint。drawXXX方法以及传入其中的坐标决定了要绘制的图形的形状,比如drawCircle方法,用来绘制
2、圆形,需要我们传入圆心的x和y坐标,以及圆的半径。drawXXX方法中传入的画笔Paint决定了绘制的图形的一些外观,比如是绘制的图形的颜色,再比如是绘制圆面还是圆的轮廓线等。Android系统的设计吸收了很多已有系统的诸多优秀之处,比如Canvas绘图。Canvas不是Android所特有的,Flex和Silverlight都支持Canvas绘图,Canvas也是HTML5标准中的一部分,主流的现代浏览器都支持用JavaScript在Canvas上绘图,如果你用过HTML5中的Canvas,你会发现Android的Canvas的绘图API与其很相似。总之,Canvas绘图不是Android所
3、特有的。 为了演示Android中各种drawXXX方法的时候,我做了一个App,通过单击相应的按钮绘制相应的图形,主界面如下所示: Canvas坐标系与绘图坐标系 Canvas绘图中牵扯到两种坐标系:Canvas坐标系与绘图坐标系。 Canvas坐标系 Canvas坐标系指的是Canvas本身的坐标系,Canvas坐标系有且只有一个,且是唯一不变的,其坐标原点在View的左上角,从坐标原点向右为x轴的正半轴,从坐标原点向下为y轴的正半轴。 绘图坐标系 Canvas的drawXXX方法中传入的各种坐标指的都是绘图坐标系中的坐标,而非Canvas坐标系中的坐标。默认情况下,绘图坐标系与Canva
4、s坐标系完全重合,即初始状况下,绘图坐标系的坐标原点也在View的左上角,从原点向右为x轴正半轴,从原点向下为y轴正半轴。但不同于Canvas坐标系,绘图坐标系并不是一成不变的,可以通过调用Canvas的translate方法平移坐标系,可以通过Canvas的rotate方法旋转坐标系,还可以通过Canvas的scale方法缩放坐标系,而且需要注意的是,translate、rotate、scale的操作都是基于当前绘图坐标系的,而不是基于Canvas坐标系,一旦通过以上方法对坐标系进行了操作之后,当前绘图坐标系就变化了,以后绘图都是基于更新的绘图坐标系了。也就是说,真正对我们绘图有用的是绘图坐
5、标系而非Canvas坐标系。 为了更好的理解绘图坐标系,请看如下的代码: /绘制坐标系 private void drawAxis(Canvas canvas) int canvasWidth = canvas.getWidth; int canvasHeight = canvas.getHeight; paint.setStyle(Paint.Style.STROKE); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeWidth(6 * density); /用绿色画x轴,用蓝色画y轴 /第一次绘制坐标轴 paint.setColor
6、(0xff00ff00);/绿色 canvas.drawLine(0, 0, canvasWidth, 0, paint);/绘制x轴 paint.setColor(0xff0000ff);/蓝色 canvas.drawLine(0, 0, 0, canvasHeight, paint);/绘制y轴 /对坐标系平移后,第二次绘制坐标轴 canvas.translate(canvasWidth / 4, canvasWidth /4);/把坐标系向右下角平移 paint.setColor(0xff00ff00);/绿色 canvas.drawLine(0, 0, canvasWidth, 0,
7、paint);/绘制x轴 paint.setColor(0xff0000ff);/蓝色 canvas.drawLine(0, 0, 0, canvasHeight, paint);/绘制y轴 /再次平移坐标系并在此基础上旋转坐标系,第三次绘制坐标轴 canvas.translate(canvasWidth / 4, canvasWidth / 4);/在上次平移的基础上再把坐标系向右下角平移 canvas.rotate(30);/基于当前绘图坐标系的原点旋转坐标系 paint.setColor(0xff00ff00);/绿色 canvas.drawLine(0, 0, canvasWidth,
8、 0, paint);/绘制x轴 paint.setColor(0xff0000ff);/蓝色 canvas.drawLine(0, 0, 0, canvasHeight, paint);/绘制y轴 界面如下所示: 第一次绘制绘图坐标系时,绘图坐标系默认情况下和Canvas坐标系重合,所以绘制出的坐标系紧贴View的上侧和左侧; 第二次首先将坐标轴向右下角平移了一段距离,然后绘制出的坐标系也就整体向右下角平移了; 第三次再次向右下角平移,并旋转了30度,图上倾斜的坐标系即最后的绘图坐标系。 drawARGB Canvas中的drawARGB可以用来对整个Canvas以某种统一的颜色整体绘制,四
9、个参数分别是Alpha、Red、Green、Blue,取值都是0-255。 使用代码如下: private void drawARGB(Canvas canvas) canvas.drawARGB(255, 139, 197, 186); 界面如下所示: drawText Canvas中用drawText方法绘制文字,代码如下所示: private void drawText(Canvas canvas) int canvasWidth = canvas.getWidth; int halfCanvasWidth = canvasWidth / 2; float translateY = te
10、xtHeight; /绘制正常文本 canvas.save; canvas.translate(0, translateY); canvas.drawText(正常绘制文本, 0, 0, paint); canvas.restore; translateY += textHeight * 2; /绘制绿色文本 paint.setColor(0xff00ff00);/设置字体为绿色 canvas.save; canvas.translate(0, translateY);/将画笔向下移动 canvas.drawText(绘制绿色文本, 0, 0, paint); canvas.restore;
11、paint.setColor(0xff000000);/重新设置为黑色 translateY += textHeight * 2; /设置左对齐 paint.setTextAlign(Paint.Align.LEFT);/设置左对齐 canvas.save; canvas.translate(halfCanvasWidth, translateY); canvas.drawText(左对齐文本, 0, 0, paint); canvas.restore; translateY += textHeight * 2; /设置居中对齐 paint.setTextAlign(Paint.Align.C
12、ENTER);/设置居中对齐 canvas.save; canvas.translate(halfCanvasWidth, translateY); canvas.drawText(居中对齐文本, 0, 0, paint); canvas.restore; translateY += textHeight * 2; /设置右对齐 paint.setTextAlign(Paint.Align.RIGHT);/设置右对齐 canvas.save; canvas.translate(halfCanvasWidth, translateY); canvas.drawText(右对齐文本, 0, 0,
13、paint); canvas.restore; paint.setTextAlign(Paint.Align.LEFT);/重新设置为左对齐 translateY += textHeight * 2; /设置下划线 paint.setUnderlineText(true);/设置具有下划线 canvas.save; canvas.translate(0, translateY); canvas.drawText(下划线文本, 0, 0, paint); canvas.restore; paint.setUnderlineText(false);/重新设置为没有下划线 translateY +=
14、 textHeight * 2; /绘制加粗文字 paint.setFakeBoldText(true);/将画笔设置为粗体 canvas.save; canvas.translate(0, translateY); canvas.drawText(粗体文本, 0, 0, paint); canvas.restore; paint.setFakeBoldText(false);/重新将画笔设置为非粗体状态 translateY += textHeight * 2; /文本绕绘制起点顺时针旋转 canvas.save; canvas.translate(0, translateY); canva
15、s.rotate(20); canvas.drawText(文本绕绘制起点旋转20度, 0, 0, paint); canvas.restore; 界面如下所示: 对以上代码进行一下说明: 1. Android中的画笔有两种Paint和TextPaint,我们可以Paint来画其他的图形:点、线、矩形、椭圆等。TextPaint继承自Paint,是专门用来画文本的,由于TextPaint继承自Paint,所以也可以用TextPaint画点、线、面、矩形、椭圆等图形。 2. 我们在上面的代码中将canvas.translate和canvas.rotate放到了canvas.save和canvas
16、.restore之间,这样做的好处是,在canvas.save调用时,将当前坐标系保存下来,将当前坐标系的矩阵Matrix入栈保存,然后通过translate或rotate等对坐标系进行变换,然后进行绘图,绘图完成后,我们通过调用canvas.restore将之前保存的Matrix出栈,这样就将当前绘图坐标系恢复到了canvas.save执行的时候状态。如果熟悉OpenGL开发,对这种模式应该很了解。 3. 通过调用paint.setColor(0xff00ff00)将画笔设置为绿色,paint的setColor方法需要传入一个int值,通常情况下我们写成16进制0x的形式,第一个字节存储Al
17、pha通道,第二个字节存储Red通道,第三个字节存储Green通道,第四个字节存储Blue通道,每个字节的取值都是从00到ff。如果对这种设置颜色的方式不熟悉,也可以调用paint.setARGB(int a, int r, int g, int b)方法设置画笔的颜色,不过paint.setColor(int color)的方式更简洁。 4. 通过调用paint.setTextAlign设置文本的对齐方式,该对齐方式是相对于绘制文本时的画笔的坐标来说的,在本例中,我们绘制文本时画笔在Canvas宽度的中间。在drawText方法执行时,需要传入一个x和y坐标,假设该点为P点,P点表示我们从P
18、点绘制文本。当对齐方式为Paint.Align.LEFT时,绘制的文本以P点为基准向左对齐,这是默认的对齐方式;当对齐方式为Paint.Align.CENTER时,绘制的文本以P点为基准居中对齐;当对齐方式为Paint.Align.RIGHT时,绘制的文本以P点为基准向右对齐。 5. 通过调用paint.setUnderlineText(true)绘制带有下划线的文本。 6. 通过调用paint.setFakeBoldText(true)绘制粗体文本。 7. 通过rotate旋转坐标系,我们可以绘制倾斜文本。 drawPoint Canvas中用drawPoint方法绘制点,代码如下所示: p
19、rivate void drawPoint(Canvas canvas) int canvasWidth = canvas.getWidth; int canvasHeight = canvas.getHeight; int x = canvasWidth / 2; int deltaY = canvasHeight / 3; int y = deltaY / 2; paint.setColor(0xff8bc5ba);/设置颜色 paint.setStrokeWidth(50 * density);/设置线宽,如果不设置线宽,无法绘制点 /绘制Cap为BUTT的点 paint.setStro
20、keCap(Paint.Cap.BUTT); canvas.drawPoint(x, y, paint); /绘制Cap为ROUND的点 canvas.translate(0, deltaY); paint.setStrokeCap(Paint.Cap.ROUND); canvas.drawPoint(x, y, paint); /绘制Cap为SQUARE的点 canvas.translate(0, deltaY); paint.setStrokeCap(Paint.Cap.SQUARE); canvas.drawPoint(x, y, paint); 界面如下所示: 下面对以上代码进行说明:
21、 1. Paint的setStrokeWidth方法可以控制所画线的宽度,通过Paint的getStrokeWidth方法可以得到所画线的宽度,默认情况下,线宽是0。其实strokeWidth不仅对画线有影响,对画点也有影响,由于默认的线宽是0,所以默认情况下调用drawPoint方法无法在Canvas上画出点,为了让大家清楚地看到所画的点,我用Paint的setStrokeWidth设置了一个比较大的线宽,这样我们看到的点也就比较大。 2. Paint有个setStrokeCap方法可以设置所画线段的时候两个端点的形状,即所画线段的帽端的形状,在下面讲到drawLine方法时会详细说明,其实
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 培训 Canvas 绘图 基础 详解
链接地址:https://www.31ppt.com/p-3060338.html