Canvas常用方法有:
1)drawXxx系列:以一定的坐标值在当前画图区域画图,需要注意的是图层会叠加,即后面绘画的图层会覆盖前面绘画的图层。
2)clipXxx系列:在当前的画图区域裁剪出一个新的画图区域,这个画图区域就是Canvas对象的当前画图区域了。比如:clipRect(new Rect()),那么该矩形区域就是Canvas的当前画图区域。
3)getXxx系列:获得与Canvas相关的一些值,如宽高、屏幕密度等。
4)save()、restore()、saveLayer()、restoreToCount()等保存恢复图层的方法。
5)translate()平移、scale()缩放、rotate()旋转、skew()倾斜。
实际上是移动坐标系
canvas.translate(float dx,float dy):dx沿x平移距离,dy沿y轴平移距离。
canvas.scale(float sx,float sy):
sx:以默认原点为中心缩放,x轴放大倍数
sy:y轴放大倍数
canvas.scale(float sx,float sy,float px,float py):
以自定义的一点为中心缩放,
sx:x轴放大倍数,
sy:y轴放大倍数,
px:原点x坐标,
py:原点y坐标。
角度增加方向为顺时针。
canvas.rotate(float degress):
degress:旋转角度
canvas.rotate(float degress,float px,float py):
degress:旋转角度
px、py:以px、py点为中心旋转。
drawPoint(float x,float y,Paint paint):
x:点的x坐标;
y:点的y坐标
drawPoints(float[] pts,Paint paint):
pts:多个点的数组,每两个值为一个点
drawPoints(float[] pts,int offset,int count,Paint paint):
pts:多个点的数组;
offset:从数组第offset位置开始;
count:从offset位置开始,处理count个值,注意这里的count不是代表点的个数,而是代表数组中值的个数。每两个为一组,最后不足两个的忽略掉。
drawLine(float startX,float startY,float stopX,float stopY,Paint paint):
startX:开始位置X坐标;
startY:开始位置Y坐标;
stopX:结束位置X坐标;
stopY:结束位置Y坐标
drawLines(float[] pts,Paint paint):
pts:多条线的数组,每四个值为一条线
drawLines(float[] pts,int offset,int count,Paint paint):
pts:多条线的数组;
offset:从数组offset位置开始;
count:从offset位置开始,处理count个值,注意这里的count代表的是数组的个数,不是线的个数。
drawRect(float left,float top,float right,float bottom,Paint paint):
left:矩形左边位置,即左边位置的X坐标;
top:矩形上边位置,即上边位置的Y坐标;
right:矩形右边位置,即右边位置的X坐标;
bottom:矩形下边位置,即下边位置的Y坐标。
drawRect(Rect r,Paint paint):
r:指定一个矩形。
drawRectF(RectF r,Paint paint):
r:指定一个矩形。
Rect和RectF的主要区别是精度不同,Rect是int型,RectF是float型。
drawRoundRect(float left,float top,float right,float bottom,float rx,float ry,Paint paint):
left:矩形左边位置
top:矩形上边位置
right:矩形右边位置
bottom:矩形下边位置
rx、ry:圆角半径
drawRoundRect(RectF rect,float rx,float ry,Paint paint):
rect:指定一个矩形
rx、ry:圆角半径
当rx=宽度一半、ry=高度一半时,画出来的是椭圆。由于当rx大于宽度一半、ry大于宽度一半时,无法计算出圆弧,所以drawRoundRect()对大于该数值的参数进行了修正,凡是大于一半的参数均按照一半来处理。
绘制原理是先指定一个矩形位置,在这个矩形里根据传入的长宽作为长轴和短轴画椭圆。
drawOval(float left,float top,float right,float bottom,Paint paint):
left:矩形左边位置
top:矩形上边位置
right:矩形右边位置
bottom:矩形下边位置
drawOval(RectF oval,Paint paint):
oval:指定一个矩形
drawCircle(float cx,float cy,float radius,Paint paint):
cx:圆心的x坐标
cy:圆心的y坐标
radius:半径
drawArc(float left,float top,float right,float bottom,float startAngle,float sweepAngle,boolean useCenter,Paint paint):
left:矩形左边位置
top:矩形上边位置
right:矩形右边位置
bottom:矩形下边位置
startAngle:确定角度的起始位置
sweepAngle:确定扫过的角度
useCenter:是否使用中心
drawArc(RectF oval,float startAngle,float sweepAngle,boolean useCenter,Paint paint):
oval:指定一个矩形
startAngle:确定角度的起始位置
sweepAngle:确定扫过的角度
useCenter:是否使用中心
userCenter的作用是标记是否使用中心:
Paint.setStyle(Paint.Style.STROKE):
userCenter=false userCenter=true
Paint.setStyle(Paint.Style.FILL):
userCenter=false userCenter=true
1)drawText(String text,float x,float y,Paint paint):
text:绘制的文本
x、y:指定文本开始的位置坐标
2)drawText(String text,int start,int end,float x,float y,Paint paint):仅绘制文本的一部分
text:绘制的文本
start、end:指定绘制文本的位置(不包括end位置,左闭又开)
x、y:指定文本开始位置坐标
3)drawText(CharSequence text,int start,int end,float x,float y,Paint paint):同2)
4)drawText(char[] text,int index,int count,float x,float y,Paint paint):
text:绘制的文本
index、count:从text文本的index位置,截取count个字符作为文本绘制
x、y:指定文本开始位置坐标
在使用Picture前最好先关闭硬件加速,避免引起不必要的问题。在AndroidManifest.xml的application节点下添加
android:hardwareAccelerated="false"来关闭整个应用的硬件加速。
可以把Picture看作是一个录制Canvas操作的录像机。Picture的相关方法有:
方法 | 简介 |
public int getWidth() | 获取宽度 |
public int getHeight() | 获取高度 |
public Canvas beginRecording() | 开始录制(返回一个Canvas,在这个Canvas中所有的绘制都会存储在Picture中) |
public void endRecording() | 结束录制 |
public void draw(Canvas canvas) | 将Picture中的内容绘制到canvas中 |
具体使用步骤是:
Picture mPicture = new Picture();
//开始绘制,得到一个Canvas对象
Canvas canvas1 = mPicture.beginRecording(500, 500);
//在beginRecording()得到的画布上做操作,才会存储到Picture中
canvas1.drawCircle(0, 0, 100, mPaint);
canvas1.drawCircle(200, 200, 100, mPaint);
//结束绘制
mPicture.endRecording();
//展示存储在Picture中的内容
canvas.drawPicture(mPicture);
执行这段代码之后的显示效果如下:
beginRecording()和endRecording()方法只是将内容存储下来,并没有展示,就像存储的视频不点击播放不会自动播放一样,想要将Picture中的内容显示出来需要手动调用绘制方法,将Picture中的内容绘制出来有几种方法:
1)Picture.draw(Canvas canvas):使用Picture提供的draw方法绘制
2)Canvas.drawPicture(Picture picture):使用Canvas提供的drawPicture方法绘制
3)PictureDrawable.draw():将Picture包装成PictureDrawable,使用PictureDrawable的draw方法绘制
三种方法的区别如下:
主要区别 | 分类 | 简介 |
是否对Canvas有影响 | 1:有影响 2、3:无影响 |
这里的影响指的是绘制完成后是否影响Canvas的状态(Matrix、clip等) |
可操作性强弱 | 1:可操作性较弱 2、3:可操作性较强 |
这里的操作性指的是对绘制结果的可控程度。 |
1)使用Picture提供的draw方法绘制
//将Picture的内容绘制在Canvas上
mPicture.draw(canvas);
2)使用Canvas提供的drawPicture方法绘制
drawPicture(Picture picture)
drawPicture(Picture picture,Rect dst)
drawPicture(Picture picture,RectF dst)
3)将Picture包装成PictureDrawable,使用PictureDrawable的draw方法绘制
//包装成Drawable
PictureDrawable drawable = new PictureDrawable(mPicture);
//设置绘画区域,这里设置的是在画布上的绘制区域,并不会根据该区域进行缩放,每次都从Picture 的左上角开始绘制
drawable.setBounds(0, 0, mPicture.getWidth(), mPicture.getHeight());
//绘制
drawable.draw(canvas);
要绘制Bitmap,需要先获取一个Bitmap,获取BItmap的方式有三种:
获取方式 | 备注 |
1、通过Bitmap创建 | 复制一个已有的Bitmap(新的Bitmap状态和原有的一致)或者创建一个空白的BItmap |
2、通过BitmapDrawable获取 | 从资源文件、内存卡、网络等地方获取一张图片并转换为内容不可变的Bitmap |
3、通过BitmapFactory获取 | 从资源文件、内存卡、网络等地方获取一张图片并转换为内容不可变的Bitmap |
绘制位图是读取已有的图片转换为Bitmap,最后再绘制到Canvas上。所以第一种方式无法满足要求,下面说一下第三种方式:
第一步,通过BitmapFactory从drawable中获取Bitmap:
Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.icon);
第二步,将Bitmap绘制到画布上:
drawBitmap(Bitmap bitmap,float left,float top,Paint paint):
left、top:图片从left、top位置作为起点展示图片
drawBitmap(Bitmap bitmap,Rect src,Rect dst,Paint paint):
drawBitmap(Bitmap bitmap,Rect src,RectF dst,Paint paint):
src:指定绘制图片的区域
dst:指定图片再屏幕上显示的区域
用这种方式绘制的图片图片的宽高会根据指定的区域自动进行缩放。
drawBitmap(Bitmap bitmap,Matrix matrix,Paint paint):
matrix:在绘制的时候对图片进行一些改变。
作用是将颜色填充整个画布,常用于绘制底色。如canvas.drawColor(Color.BLUE)