Android自定义View-Canvas的详细介绍

Canvas常用方法有:

1)drawXxx系列:以一定的坐标值在当前画图区域画图,需要注意的是图层会叠加,即后面绘画的图层会覆盖前面绘画的图层。

2)clipXxx系列:在当前的画图区域裁剪出一个新的画图区域,这个画图区域就是Canvas对象的当前画图区域了。比如:clipRect(new Rect()),那么该矩形区域就是Canvas的当前画图区域。

3)getXxx系列:获得与Canvas相关的一些值,如宽高、屏幕密度等。

4)save()、restore()、saveLayer()、restoreToCount()等保存恢复图层的方法。

5)translate()平移、scale()缩放、rotate()旋转、skew()倾斜。

 

translate()平移:移动画布

实际上是移动坐标系

canvas.translate(float dx,float dy):dx沿x平移距离,dy沿y轴平移距离。

scale()缩放:

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()旋转:

角度增加方向为顺时针。

canvas.rotate(float degress):

degress:旋转角度

canvas.rotate(float degress,float px,float py):

degress:旋转角度

px、py:以px、py点为中心旋转。

 

 

 

 

 

 

 

 

 

 

drawPoint():画点

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():画线

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():画矩形

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():画圆角矩形

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:圆角半径

Android自定义View-Canvas的详细介绍_第1张图片

当rx=宽度一半、ry=高度一半时,画出来的是椭圆。由于当rx大于宽度一半、ry大于宽度一半时,无法计算出圆弧,所以drawRoundRect()对大于该数值的参数进行了修正,凡是大于一半的参数均按照一半来处理。

drawOval():画椭圆

绘制原理是先指定一个矩形位置,在这个矩形里根据传入的长宽作为长轴和短轴画椭圆。

drawOval(float left,float top,float right,float bottom,Paint paint):

left:矩形左边位置

top:矩形上边位置

right:矩形右边位置

bottom:矩形下边位置

drawOval(RectF oval,Paint paint):

oval:指定一个矩形

drawCircle():画圆

drawCircle(float cx,float cy,float radius,Paint paint):

cx:圆心的x坐标

cy:圆心的y坐标

radius:半径

drawArc():画圆弧

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

        

    Android自定义View-Canvas的详细介绍_第2张图片                                         Android自定义View-Canvas的详细介绍_第3张图片

 

Paint.setStyle(Paint.Style.FILL):

userCenter=false                                                                                     userCenter=true

       

Android自定义View-Canvas的详细介绍_第4张图片                             Android自定义View-Canvas的详细介绍_第5张图片

drawText():绘制文本

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:指定文本开始位置坐标

drawPicture():绘制图片

在使用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);

执行这段代码之后的显示效果如下:

                            Android自定义View-Canvas的详细介绍_第6张图片

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);

drawBitmap:绘制位图

要绘制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:在绘制的时候对图片进行一些改变。

 

drawColor:绘制颜色

作用是将颜色填充整个画布,常用于绘制底色。如canvas.drawColor(Color.BLUE)

 

drawPath:绘制路径

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Android自定义View-Canvas的详细介绍)