Android Canvas类 详解
- Canvas对象的获取方式有两种
- Canvas对象常用的方法
Canvas对象的获取方式有两种
- 通过重写View.onDraw方法,View中的Canvas对象会被当做参数传递过来,我们操作这个Canvas,效果会直接反应在View中。
- 另一种就是使用构造方法创建一个Canvas对象
Canvas(Bitmap bitmap)
例:Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
Canvas对象常用的方法
方法 | 说明 |
public void drawARGB(int a, int r, int g, int b) 用指定的ARGB颜色填充整个画布的位图 | a: 透明度(取值0…255) r: 红色 (取值0…255) g: 绿色 (取值0…255) b: 蓝色 (取值0…255) 例: canvas.drawARGB(255,255,0,0); |
public void drawRGB(int r, int g, int b) 用指定的RGB颜色填充整个画布的位图 | r: 红色 (取值0…255) g: 绿色 (取值0…255) b: 蓝色 (取值0…255) 例: canvas.drawColor(Color.RED); |
public void drawColor(int color) 用指定的颜色填充整个画布的位图 | color: 要画在画布上的颜色 例: canvas.drawColor(Color.RED); |
public void drawColor(int color, PorterDuff.Mode mode) 用指定的颜色和模式填充整个画布的位图 | mode: 18个填充模式 1. ADD 2. CLEAR 3. DARKEN 4. DST 5. DST_ATOP 6. DST_IN 7. DST_OUT 8. DST_OVER 9. LIGHTEN 10. MULTIPLY 11. OVERLAY 12. SCREEN 13. SRC 14. SRC_ATOP 15. SRC_IN 16. SRC_OUT 17. SRC_OVER 18. XOR 例: canvas.drawColor(Color.RED, ADD); |
public void drawText(String text, float x, float y, Paint paint) 使用指定的绘图工具绘制文本,原点为(x,y) | text: 文本 x: 绘制文本的原点的x轴坐标 y: 绘制文本的原点的Y轴坐标 paint: 用于文本的Paint对象 例: canvas.drawText(“绘制文本内容”, 100, 100, redPaint); |
public void drawText(CharSequence text, int start, int end, float x, float y, Paint paint) 在指定的绘图中绘制由开始到结束指定的文本范围,其原点为(x,y) | text: 文本序列 start: 开始下标 end: 结束下标(end-1) x: 绘制文本的原点的x轴坐标 y: 绘制文本的原点的Y轴坐标 paint: 用于文本的Paint对象 例:canvas.drawText(“绘制文本内容”, 2,4,100, 100, redPaint); |
public void drawText(char[] text, int index, int count, float x, float y, Paint paint) 使用指定的绘图工具绘制文本,原点为(x,y) | text: 文本 index: 文本绘制开始的下标 count: 文本绘制从下标开始截取的长度 x: 绘制文本的原点的x轴坐标 y: 绘制文本的原点的Y轴坐标 paint: 用于文本的Paint对象 例:Char[] char = new char[]{‘绘’, ‘制’, ‘文’, ‘本’, ‘内’, ‘容’}; canvas.drawText(char , 2, 4, 100, 100, redPaint); |
public void drawText(String text, int start, int end, float x, float y, Paint paint) 在指定的绘图中绘制由开始到结束指定的文本范围,其原点为(x,y) | text: 文本 start: 开始下标 end: 结束下标(end-1) x: 绘制文本的原点的x轴坐标 y: 绘制文本的原点的Y轴坐标 paint: 用于文本的Paint对象 例:canvas.drawText(“绘制文本内容”, 2,4,100, 100, redPaint); |
public void drawPath (Path path, Paint paint) 画出贝塞尔曲线 | path: 要绘制的路径 paint: 用于需要绘制路径的Paint对象 例: canvas.drawPath(path, redPaint); |
public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) 使用指定的画笔沿着指定的路径绘制文本,原点为(x,y) | text: 要绘制的文本 path: 文本应该遵循的基线路径 hOffset: 距离路径开始位置的偏移量(横向) vOffset: 距离路径上下的偏移量(纵向可以为负数) paint: 用于需要绘制文本的Paint对象 例: canvas.drawTextOnPath(“绘制文本内容”, path, 10, -50, redPaint); |
public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint) 使用指定的画笔沿着指定的路径绘制文本,原点为(x,y) | text: 要绘制的文本 index: 绘制文本的起始下标 count: 绘制字符的个数,从起始下标起 path: 文本应该遵循的基线路径 hOffset: 距离路径开始位置的偏移量(横向) vOffset: 距离路径上下的偏移量(纵向可以为负数 paint: 用于需要绘制文本的Paint对象 例:Char[] char = new char[]{‘绘’, ‘制’, ‘文’, ‘本’, ‘内’, ‘容’}; canvas.drawText(char , 2, 4, path, 10, -50, redPaint); |
public void drawPosText(char[] text, int index, int count, float[] pos, Paint paint) 绘制文本,每个字符的来源由pos数组指定 此方法不支持符号的组成和分解,因此不应用于呈现复杂的脚本 | text:要绘制的文本 index: 要绘制的第一个字符的索引 count: 要绘制的字符数,从索引开始 pos: 数组的[x,y]位置,用于放置每个字符定位坐标 paint: 用于需要绘制文字的Paint对象 |
public void drawPosText(String text, float[] pos, Paint paint) 绘制文本,每个字符的来源由pos数组指定 此方法不支持符号的组成和分解,因此不应用于呈现复杂的脚本 | text:要绘制的文本 pos: 数组的[x,y]位置,用于定位每个字符 paint: 用于需要绘制文字的Paint对象 |
public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 以指定的开始和结束x、y坐标绘制线段; 线的大小取决于画笔的大小 | startX: 直线起始点的X轴坐标 startY: 直线起始点的Y轴坐标 stopX: 直线结束点的X轴坐标 stopY: 直线结束点的Y轴坐标 paint: 用于线段的Paint对象 例: 绘制一条线 canvas.drawLine(200, 200, 400, 400, redPaint); |
public void drawLines(float[] pts, Paint paint) 画多条线。每行都从pts数组中的4个连续的值中取出。因此,要绘制一条线,数组必须至少包含4个值 | pts: 要绘制的点数组 [x0 y0 x1 y1 x2 y2 …] paint: 用于文本的Paint对象 例: 绘制2条线 float[] pts = new float[]{100, 100, 200, 200, 200, 100, 300, 100}; canvas.drawLines(pts, redPaint); |
public void drawLines(float[] pts, int offset, int count, Paint paint) 画多条线。每行都从pts数组中的4个连续的值中取出。因此,要绘制一条线,数组必须至少包含4个值 | pts: 要绘制的点数组 [x0 y0 x1 y1 x2 y2 …] offset: 在绘制之前要跳过的数组中值的数目 count: 跳过“offset”后要处理的数组中值的数量 paint: 用于线段的Paint对象 例: 绘制2条线 float[] pts = new float[]{0, 0, 50, 50, 100, 100, 200, 200, 200, 100, 300, 100}; canvas.drawLines(pts, 4, 8, redPaint); |
public void drawCircle(float cx, float cy, float radius, Paint paint) 用指定的颜料画指定的圆。如果半径<= 0,那么什么也画不出来 | cx: 要画的圆中心的x坐标 cy: 要画的圆中心的x坐标 radius: 要画的圆的半径 paint: 用于需要绘制圆的Paint对象 例:canvas.drawCircle(200,200,100,redPaint); |
public void drawOval (RectF oval, Paint paint) 绘制指定的椭圆 | oval: 绘制的椭圆的矩形边界 例: RectF rectF = new RectF((float) 100.3, 100, 300, 300); canvas.drawOval(rectF, redPaint); |
public void drawOval (float left, float top, float right, float bottom, Paint paint) 绘制指定的椭圆 | left: 绘制矩形的左侧(X轴的值) top: 绘制矩形的顶部(Y轴的值) right: 绘制矩形的右侧(X轴的值) bottom: 绘制矩形的底部(Y轴的值) paint: 用于需要绘制矩形的Paint对象 例: 绘制一个椭圆 canvas.drawOval((float) 100.3, 100, 300, 200, redPaint); |
public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 绘制指定的圆弧,该圆弧将被缩放以适应指定的椭圆 | oval : 椭圆的边界;用于定义圆弧的形状和大小 startAngle: 起始角(以度表示)是弧线开始的位置 sweepAngle: 顺时针方向测量的扫描过角(以度为单位) useCenter: 是否和中心连线 paint: 用于需要绘制圆弧的Paint对象 例: 绘制圆弧 canvas.drawArc(rectF, 0, 90, true, redPaint); |
public void drawRect(RectF rect, Paint paint) 使用指定的画笔绘制指定的矩形。矩形将被填充或框架基础上的绘画风格 | rect: 要绘制的矩形 paint: 用于需要绘制矩形的Paint对象 例: 绘制一个矩形 RectF rectF = new RectF((float) 100.3, 100, 300, 300); |
public void drawRect(float left, float top, float right, float bottom, Paint paint) 使用指定的画笔绘制指定的矩形。矩形将被填充或框架基础上的绘画风格 | left: 绘制矩形的左侧(X轴的值) top: 绘制矩形的顶部(Y轴的值) right: 绘制矩形的右侧(X轴的值) bottom: 绘制矩形的底部(Y轴的值) paint: 用于需要绘制矩形的Paint对象 例: 绘制一个矩形 canvas.drawRect((float) 100.3, 100, 300, 300, redPaint); |
public void drawRect(RectF rect, Paint paint) 使用指定的画笔绘制指定的矩形。矩形将被填充或框架基础上的绘画风格 | rect: 要绘制的矩形 paint: 用于需要绘制矩形的Paint对象 例: 绘制一个矩形 RectF rectF = new RectF((float) 100.3, 100, 300, 300); canvas.drawRect(rectF, redPaint); |
public void drawRect(Rect r, Paint paint) 使用指定的画笔绘制指定的矩形。矩形将被填充或框架基础上的绘画风格 | r: 要绘制的矩形 paint: 用于需要绘制矩形的Paint对象 Rect rect = new Rect(100, 100, 300, 300); canvas.drawRect(rect , redPaint); |
public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 绘制指定的圆矩形 | left: 矩形左侧的X坐标 top: 矩形顶部的Y坐标 right: 矩形右侧的X坐标 bottom: 矩形底部的Y坐标 rx: 圆角椭圆X轴方向的半径 ry: 圆角椭圆Y轴方向的半径 paint: 用于需要绘制矩形的Paint对象 例: 绘制圆角矩形 canvas.drawRoundRect((float) 100.3, 100, 300, 300,20,20,redPaint); |
public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) 绘制指定的圆矩形 | rect: 要绘制圆角的矩形的边界 rx: 圆角椭圆X轴方向的半径 ry: 圆角椭圆Y轴方向的半径 paint: 用于需要绘制矩形的Paint对象 例: 绘制圆角矩形 RectF rectF = new RectF((float) 100.3, 100, 300, 300); canvas.drawRoundRect(rectF,20,20,redPaint); |
public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 使用指定的绘图工具绘制指定的位图,其左上角在(x,y)处,由当前矩阵转换 | bitmap: 要绘制的位图 left: 绘制的位图左侧的位置(X轴的值) top : 绘制的位图顶部的位置(Y轴的值) paint: 用于位图的Paint对象(可以为null) 例: canvas.drawBitmap(bitmap, 100, 100, null); |
public void drawBitmap(int[] colors, int offset, int stride, float x, float y, int width, int height, boolean hasAlpha, Paint paint) 将指定的颜色数组视为位图,并绘制它 | colors: 表示位图像素的颜色数组 offset: 偏移到第一个像素的颜色数组中 stride: 数组中行之间的颜色数(必须是>= width或<= -width) x: 绘制位图的X坐标 y: 绘制位图的Y坐标 width: 位图的宽度 height: 位图的高度 hasAlpha: 如果颜色的alpha通道包含有效值,则为真。如果为false,则忽略alpha字节(假设每个像素都是0xFF) paint: 用于位图的Paint对象 |
public void drawBitmap(int[] colors, int offset, int stride, int x, int y, int width, int height, boolean hasAlpha, Paint paint) 将指定的颜色数组视为位图,并绘制它 | colors: 表示位图像素的颜色数组 offset: 偏移到第一个像素的颜色数组中 stride: 数组中行之间的颜色数(必须是>= width或<= -width) x: 绘制位图的X坐标 y: 绘制位图的Y坐标 width: 位图的宽度 height: 位图的高度 hasAlpha: 如果颜色的alpha通道包含有效值,则为真。如果为false,则忽略alpha字节(假设每个像素都是0xFF) paint: 用于位图的Paint对象 |
public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) 使用指定的矩阵绘制位图 | bitmap: 要绘制的位图 matrix: 在绘制位图时用于变换位图的矩阵 paint: 用于位图的Paint对象(可能为null) 例: canvas.drawBitmap(bitmap, new Matrix(), null); |
public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) 绘制指定的位图,自动缩放/转换以填充目标矩形。如果源矩形不为空,则指定要绘制的位图的子集 | bitmap: 要绘制的位图 src: 对当前图片进行裁剪,根据图片绘制的区域(可以为null) dst: 对图片的大小进行缩放和移动,根据画布绘制显示的区域 paint: 用于位图的Paint对象(可以为null) 例: Rect src = new Rect(100, 100, bitmap.getWidth(), bitmap.getHeight()) Rect dst = new Rect(100, 100, bitmap.getWidth(), bitmap.getHeight()) canvas.drawBitmap(bitmap, src, dst, null); |
public void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) 绘制指定的位图,自动缩放/转换以填充目标矩形。如果源矩形不为空,则指定要绘制的位图的子集 | bitmap: 要绘制的位图 src: 对当前图片进行裁剪,根据图片绘制的区域(可以为null) dst: 对图片的大小进行缩放和移动,根据画布绘制显示的区域 paint: 用于位图的Paint对象(可以为null) 例: Rect dst = new Rect(100.4, 100, bitmap.getWidth(), bitmap.getHeight() canvas.drawBitmap(bitmap, null, dst, redPaint); |
public void drawPicture(Picture picture) 保存画布状态,绘制图片,并恢复画布状态。这与不执行任何保存/恢复的picture.draw(canvas)不同 | picture: 需要绘制的图片 |
public void drawPicture(Picture picture, RectF dst) 绘制图片,拉伸以适应dst矩形 | picture: 需要绘制的图片 dst: 需要适应的目标矩形 |
public void drawPicture(Picture picture, Rect dst) 绘制图片,拉伸以适应dst矩形 | picture: 需要绘制的图片 dst: 需要适应的目标矩形 |
public void drawPoint(float x, float y, Paint paint) 用于绘制单个点 | x: X轴的值 y: Y轴的值 paint: 用于需要绘制点的Paint对象 例:canvas.drawPoint(200, 200, redPaint); |
public void drawPoints(float[] pts, Paint paint) 根据数组绘制所有的点 | pts: 需要绘制的点数组[x0 y0 x1 y1 x2 y2…] paint: 用于需要绘制点的Paint对象 例: 绘制4个点 float pts[] = {200, 200, 250, 250, 300, 300, 350, 350}; canvas.drawPoints(pts, redPaint); |
public void drawPoints(float[] pts, int offset, int count, Paint paint) 画一系列的点。每个点都以pts[]指定的坐标为中心,其直径由画笔的描边宽度指定(由画布’ CTM转换),对描边宽度为0进行特殊处理,总是绘制1个像素(如果启用了抗锯齿,则最多绘制4个像素)。点的形状是由油漆的帽子类型控制的。形状是正方形的,除非帽型是圆的,在这种情况下,形状是圆的 | pts: 需要绘制的点数组[x0 y0 x1 y1 x2 y2…] offset: 开始绘制之前要跳过的值的数目 count: 跳过值的偏移量后要处理的值的数量。因为一个点使用两个值,所以绘制的“点”的数量是真实的(计数>> 1) paint: 用于需要绘制点的Paint对象 例: 绘制3个点 float pts[] = {200, 200, 250, 250, 300, 300, 350, 350}; canvas.drawPoints(pts, 2, 6, redPaint); |
public boolean clipPath (Path path) 裁剪路径 | path: 裁剪的范围,路径所包括的范围不是空的才有效 例: canvas.clipPath(path); |
public boolean clipPath (Path path, Region.Op op) 裁剪路径 | path: 裁剪的范围,路径所包括的范围不是空的才有效 op有6中方式如下: 1. DIFFERENCE 差异 2. INTERSECT 交叉 3. REPLACE 替换 4. REVERSE_DIFFERENCE 反向的区别 5. UNION 并集 6. XOR 异或 例: canvas.clipPath(path, DIFFERENCE ); |
clipRect(RectF rect) 画布裁剪 | rect: 与当前剪辑相交的矩形 例:Rect rect = new Rect(100.3, 300, 400, 600); canvas.clipRect(rect); |
clipRect(Rect rect, Region.Op op) 画布裁剪 | rect: 与当前剪辑相交的矩形 op有6中方式如下: 1. DIFFERENCE 差异 2. INTERSECT 交叉 3. REPLACE 替换 4. REVERSE_DIFFERENCE 反向的区别 5. UNION 并集 6. XOR 异或 例:Rect rect = new Rect(100, 300, 400, 600); canvas.clipRect(rect, DIFFERENCE ); |
clipRect(RectF rect, Region.Op op) 画布裁剪 | rect: 与当前剪辑相交的矩形 op有6中方式如下: 1. DIFFERENCE 差异 2. INTERSECT 交叉 3. REPLACE 替换 4. REVERSE_DIFFERENCE 反向的区别 5. UNION 并集 6. XOR 异或 例:Rect rect = new Rect(100.3, 300, 400, 600); canvas.clipRect(rect, DIFFERENCE ); |
clipRect(int left, int top, int right, int bottom) 画布裁剪 | left: 要与当前剪辑相交的矩形的左侧(X轴值) top: 与当前剪辑相交的矩形的顶部(Y轴的值) right: 要与当前剪辑相交的矩形的右侧(X轴值) bottom: 与当前剪辑相交的矩形的底部(Y轴值) 例: canvas.clipRect(0,0,300,300); |
clipRect(float left, float top, float right, float bottom) 将当前剪辑与指定的矩形相交,该矩形用局部坐标表示 | left: 要与当前剪辑相交的矩形的左侧(X轴值) top: 与当前剪辑相交的矩形的顶部(Y轴值) right: 要与当前剪辑相交的矩形的右侧(X轴值) bottom: 与当前剪辑相交的矩形的底部(Y轴值) 例: canvas.clipRect(0,0,300.5,300.5); |
clipRect(float left, float top, float right, float bottom, Region.Op op) 画布裁剪 | left: 要与当前剪辑相交的矩形的左侧(X轴值) top: 与当前剪辑相交的矩形的顶部(Y轴值) right: 要与当前剪辑相交的矩形的右侧(X轴值) bottom: 与当前剪辑相交的矩形的底部(Y轴值) op有6中方式如下: 1. DIFFERENCE 差异 2. INTERSECT 交叉 3. REPLACE 替换 4. REVERSE_DIFFERENCE 反向的区别 5. UNION 并集 6. XOR 异或 例: canvas.clipRect(0,0,300.5,300.5, INTERSECT ); |
public void translate (float dx, float dy) 移位; 实际上移动的是坐标,画布的位置并没有变 | dx: 在X轴上平移的距离 dy: 在Y轴上平移的距离 例: canvas.translate(100, 100); |
public void scale (float sx, float sy) 缩放画布 | sx: 在X上缩放的量 sy: 在Y上缩放的量 例:X轴方向放大2倍,Y轴方向方大4倍 canvas.scale(2, 4); |
public final void scale (float sx, float sy, float px, float py) 自定义点为中心缩放画布 | sx: 在X上缩放的量 sy: 在Y上缩放的量 px 在X轴上平移的距离 py: 在Y轴上平移的距离 例: 移动到(100,100)并X轴方向放大2倍,Y轴方向方大4倍 canvas.scale(2, 4, 100, 100); |
public final void rotate (float degrees) 旋转画布 | degrees: 旋转的量,以度为单位 例:原点为中心旋转45度(顺时针方向为正) canvas.rotate(45); |
public final void rotate (float degrees, float px, float py) 自定义点为中心旋转画布 | degrees: 旋转的量,以度为单位 px 在X轴上平移的距离 py: 在Y轴上平移的距离 例: 旋转45度并移动到(100, 100) canvas.rotate(45, 100, 100); |
public void skew (float sx, float sy) 倾斜画布 这里的倾斜的角度都是tan值,比如要在x轴方向上倾斜30度,那么小数值对应:tan 30 | sx: x轴方向上倾斜角度 sy: Y轴方向上倾斜角度 例:canvas.skew(0,1f); |