Canvas简介
Canvas成为画布;可以在上面绘制任何图案,是安卓平台2D图形绘制的基础
有两大特点:1.可操作性强;2.比较难用(组合操作)
常用操作
- **绘制颜色:**drawColor, drawRGB, drawARGB;使用单一颜色填充整个画布
- **绘制基本形状:**drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc;依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧
- **绘制图片:**drawBitmap, drawPicture;绘制位图和图片
- **绘制文本:**drawText, drawPosText, drawTextOnPath;依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字
- **绘制路径:**drawPath;绘制路径,绘制贝塞尔曲线等
- **顶点操作:**drawVertices, drawBitmapMesh;通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用
- **画布裁剪:**clipPath, clipRect;设置画布的显示区域
- **画布快照:**save, restore, saveLayerXxx, restoreToCount, getSaveCount;依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数
- **画布变换:**translate, scale, rotate, skew;依次为 位移、缩放、 旋转、错切
- **Matrix(矩阵):**getMatrix, setMatrix, concat;实际上画布的位移,缩放等操作的都是图像矩阵Matrix, 只不过Matrix比较难以理解和使用,故封装了一些常用的方法。
Canvas详解
使用Canvas绘制基本图形
- 绘制颜色
1 | canvas.drawColor(Color.BLUE); //绘制蓝色 |
- 创建画笔
1 | Paint mPaint = new Paint(); |
- **绘制点
1 | canvas.drawPoint(200, 200, mPaint); //在坐标(200,200)位置绘制一个点 |
- 绘制直线
1 | canvas.drawLine(300,300,500,600,mPaint); // 在坐标(300,300)(500,600)之间绘制一条直线 |
- 绘制矩形
1 | // 第一种 |
-
**Rect与RectF的区别:**两者最大的区别就是精度不同,Rect是int(整形)的,而RectF是float(单精度浮点型)的
-
绘制圆角矩形
1 | // 第一种 |
- 绘制椭圆
1 | RectF rectF = new RectF(100,100,800,400); |
- 绘制圆
1 | canvas.drawCircle(500,500,400,mPaint); // 绘制一个圆心坐标在(500,500),半径为400 的圆。 |
- 绘制圆弧
1 | // 第一种 |
Paint
基本形状由Canvas确定,但绘制出来的颜色,具体效果则由Paint确定
- 设置画笔样式
1 | mPaint.setStyle(Paint.Style.FILL); //设置画笔模式为填充 |
1 | Paint paint = new Paint(); |
绘制图片
drawPicture
A Picture records drawing calls (via the canvas returned by beginRecording) and can then play them back into Canvas (via draw(Canvas) or drawPicture(Picture)).For most content (e.g. text, lines, rectangles), drawing a sequence from a picture can be faster than the equivalent API calls, since the picture performs its playback without incurring any method-call overhead.
- Picture录制Canvas中绘制的内容
把Canvas绘制点,线,矩形等诸多操作用Picture录制下来,下次需要的时候拿来就能用,使用Picture相比于再次调用绘图API,开销是比较小的
相关方法 | 简介 |
---|---|
public int getWidth () | 获取宽度 |
public int getHeight () | 获取高度 |
public Canvas beginRecording (int width, int height) | 开始录制 (返回一个Canvas,在Canvas中所有的绘制都会存储在Picture中) |
public void endRecording () | 结束录制 |
public void draw (Canvas canvas) | 将Picture中内容绘制到Canvas中 |
public static Picture createFromStream (InputStream stream) | (已废弃)通过输入流创建一个Picture |
public void writeToStream (OutputStream stream) | (已废弃)将Picture中内容写出到输出流中 |
eg:
1 | // 1.创建Picture |
- 将Picture中的内容绘制出来可以有以下几种方法
1.使用Picture提供的draw方法绘制
2.使用Canvas提供的drawPicture方法绘制
1 | public void drawPicture (Picture picture) |
3.将Picture包装成PictureDrawable,使用PictureDrawable的draw方法绘制
1 | // 包装成为Drawable |
drawBitmap
- 获取Bitmap方式
**1.通过Bitmap创建:**复制一个已有的Bitmap(新Bitmap状态和原有的一致) 或者 创建一个空白的Bitmap(内容可改变)
**2.通过BitmapDrawable获取:**从资源文件 内存卡 网络等地方获取一张图片并转换为内容不可变的Bitmap
**3.通过BitmapFactory获取:**从资源文件 内存卡 网络等地方获取一张图片并转换为内容不可变的Bitmap
我们绘制Bitmap都是读取已有的图片转换为Bitmap绘制到Canvas上
- BitmapFactory从不同位置获取Bitmap
1 | Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(),R.raw.bitmap); |
资源文件(assets)
Bitmap bitmap=null;
try {
InputStream is = mContext.getAssets().open(“bitmap.png”);
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
内存卡文件
1 | Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/bitmap.png"); |
网络文件
1 | // 获取网络输入流 |
- 绘制Bitmap
1 | // 第一种 |
eg:
1 | canvas.drawBitmap(bitmap,new Matrix(),new Paint()); |
绘制文字
1 | // 第一类 |
- 分为三类:
1.只能指定文本基线位置(基线x默认在字符串左侧,基线y默认在字符串下方)。
2.可以分别指定每个文字的位置。
3.是指定一个路径,根据路径绘制文字。
出处:http://www.gcssloop.com/customview/Canvas_BasicGraphics
http://www.gcssloop.com/customview/Canvas_PictureText